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/bionic | |
| 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/bionic')
| -rw-r--r-- | libc/bionic/pty.cpp | 15 |
1 files changed, 11 insertions, 4 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) { |
