diff --git a/libc/bionic/pty.cpp b/libc/bionic/pty.cpp index 2c8618047..884714799 100644 --- a/libc/bionic/pty.cpp +++ b/libc/bionic/pty.cpp @@ -36,6 +36,11 @@ #include #include +#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) { diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 3053e85b2..dfb788e57 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -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); diff --git a/libc/include/unistd.h b/libc/include/unistd.h index e94ee66fb..c7557155a 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -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); diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h index 56a61bec3..0c6e06239 100644 --- a/libc/private/bionic_tls.h +++ b/libc/private/bionic_tls.h @@ -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. */