Merge "Fix ptsname(3) and ttyname(3) to use TLS."

This commit is contained in:
Elliott Hughes 2014-12-10 04:39:06 +00:00 committed by Gerrit Code Review
commit 6a6845244c
4 changed files with 14 additions and 7 deletions

View File

@ -36,6 +36,11 @@
#include <unistd.h>
#include <utmp.h>
#include "private/ThreadLocalBuffer.h"
GLOBAL_INIT_THREAD_LOCAL_BUFFER(ptsname);
GLOBAL_INIT_THREAD_LOCAL_BUFFER(ttyname);
int getpt() {
return posix_openpt(O_RDWR|O_NOCTTY);
}
@ -49,8 +54,9 @@ int posix_openpt(int flags) {
}
char* ptsname(int fd) {
static char buf[32];
return ptsname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ptsname, 32);
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) {
@ -74,8 +80,9 @@ int ptsname_r(int fd, char* buf, size_t len) {
}
char* ttyname(int fd) {
static char buf[64];
return ttyname_r(fd, buf, sizeof(buf)) == 0 ? buf : NULL;
LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, ttyname, 64);
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) {

View File

@ -131,7 +131,7 @@ void srandom(unsigned int);
int getpt(void);
int grantpt(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 unlockpt(int);

View File

@ -195,7 +195,7 @@ extern char *optarg;
extern int optind, opterr, optopt;
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 acct(const char* filepath);

View File

@ -76,7 +76,7 @@ enum {
* 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.
*/
#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 5
#define GLOBAL_INIT_THREAD_LOCAL_BUFFER_COUNT 9
#if defined(USE_JEMALLOC)
/* jemalloc uses 5 keys for itself. */