Fix ptsname(3) and ttyname(3) to use TLS.
Be safe by default. Change-Id: I6c4a3f1fd4eee3a651b3162ce95b7e873de57521
This commit is contained in:
parent
3592743f71
commit
a381fe8ebc
@ -36,6 +36,11 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <utmp.h>
|
#include <utmp.h>
|
||||||
|
|
||||||
|
#include "private/ThreadLocalBuffer.h"
|
||||||
|
|
||||||
|
GLOBAL_INIT_THREAD_LOCAL_BUFFER(ptsname);
|
||||||
|
GLOBAL_INIT_THREAD_LOCAL_BUFFER(ttyname);
|
||||||
|
|
||||||
int getpt() {
|
int getpt() {
|
||||||
return posix_openpt(O_RDWR|O_NOCTTY);
|
return posix_openpt(O_RDWR|O_NOCTTY);
|
||||||
}
|
}
|
||||||
@ -49,8 +54,9 @@ int posix_openpt(int flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char* ptsname(int fd) {
|
char* ptsname(int fd) {
|
||||||
static char buf[32];
|
LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ptsname, 32);
|
||||||
return ptsname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
|
int error = ptsname_r(fd, ptsname_tls_buffer, ptsname_tls_buffer_size);
|
||||||
|
return (error == 0) ? ptsname_tls_buffer : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ptsname_r(int fd, char* buf, size_t len) {
|
int ptsname_r(int fd, char* buf, size_t len) {
|
||||||
@ -74,8 +80,9 @@ int ptsname_r(int fd, char* buf, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char* ttyname(int fd) {
|
char* ttyname(int fd) {
|
||||||
static char buf[64];
|
LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ttyname, 64);
|
||||||
return ttyname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
|
int error = ttyname_r(fd, ttyname_tls_buffer, ttyname_tls_buffer_size);
|
||||||
|
return (error == 0) ? ttyname_tls_buffer : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ttyname_r(int fd, char* buf, size_t len) {
|
int ttyname_r(int fd, char* buf, size_t len) {
|
||||||
|
@ -131,7 +131,7 @@ void srandom(unsigned int);
|
|||||||
int getpt(void);
|
int getpt(void);
|
||||||
int grantpt(int);
|
int grantpt(int);
|
||||||
int posix_openpt(int);
|
int posix_openpt(int);
|
||||||
char* ptsname(int) __warnattr("ptsname is not thread-safe; use ptsname_r instead");
|
char* ptsname(int);
|
||||||
int ptsname_r(int, char*, size_t);
|
int ptsname_r(int, char*, size_t);
|
||||||
int unlockpt(int);
|
int unlockpt(int);
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ extern char *optarg;
|
|||||||
extern int optind, opterr, optopt;
|
extern int optind, opterr, optopt;
|
||||||
|
|
||||||
extern int isatty(int);
|
extern int isatty(int);
|
||||||
extern char* ttyname(int) __warnattr("ttyname is not thread-safe; use ttyname_r instead");
|
extern char* ttyname(int);
|
||||||
extern int ttyname_r(int, char*, size_t);
|
extern int ttyname_r(int, char*, size_t);
|
||||||
|
|
||||||
extern int acct(const char* filepath);
|
extern int acct(const char* filepath);
|
||||||
|
@ -76,7 +76,7 @@ enum {
|
|||||||
* pthread_key_create; grep for GLOBAL_INIT_THREAD_LOCAL_BUFFER to find those. We need to manually
|
* pthread_key_create; grep for GLOBAL_INIT_THREAD_LOCAL_BUFFER to find those. We need to manually
|
||||||
* maintain that second number, but pthread_test will fail if we forget.
|
* maintain that second number, but pthread_test will fail if we forget.
|
||||||
*/
|
*/
|
||||||
#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 5
|
#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 9
|
||||||
|
|
||||||
#if defined(USE_JEMALLOC)
|
#if defined(USE_JEMALLOC)
|
||||||
/* jemalloc uses 5 keys for itself. */
|
/* jemalloc uses 5 keys for itself. */
|
||||||
|
Loading…
Reference in New Issue
Block a user