diff options
author | Elliott Hughes <enh@google.com> | 2014-12-09 20:30:23 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-12-09 20:30:23 -0800 |
commit | a381fe8ebcd196614a00f4dca3539e0860ef9e84 (patch) | |
tree | 3554d98520ded579dcc9ad2e5e4f36e23f3f7b5f /libc | |
parent | 3592743f7191c69ae1fd2d7e01222bd380d93d3e (diff) | |
download | bionic-a381fe8ebcd196614a00f4dca3539e0860ef9e84.zip bionic-a381fe8ebcd196614a00f4dca3539e0860ef9e84.tar.gz bionic-a381fe8ebcd196614a00f4dca3539e0860ef9e84.tar.bz2 |
Fix ptsname(3) and ttyname(3) to use TLS.
Be safe by default.
Change-Id: I6c4a3f1fd4eee3a651b3162ce95b7e873de57521
Diffstat (limited to 'libc')
-rw-r--r-- | libc/bionic/pty.cpp | 15 | ||||
-rw-r--r-- | libc/include/stdlib.h | 2 | ||||
-rw-r--r-- | libc/include/unistd.h | 2 | ||||
-rw-r--r-- | libc/private/bionic_tls.h | 2 |
4 files changed, 14 insertions, 7 deletions
diff --git a/libc/bionic/pty.cpp b/libc/bionic/pty.cpp index 2c86180..8847147 100644 --- a/libc/bionic/pty.cpp +++ b/libc/bionic/pty.cpp @@ -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) { diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 3053e85..dfb788e 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 e94ee66..c755715 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 56a61be..0c6e062 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. */ |