aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-12-10 04:39:06 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-12-10 04:39:07 +0000
commit6a6845244cf9eb8fe21ecc012b7b45990adad7d8 (patch)
tree3554d98520ded579dcc9ad2e5e4f36e23f3f7b5f
parent3592743f7191c69ae1fd2d7e01222bd380d93d3e (diff)
parenta381fe8ebcd196614a00f4dca3539e0860ef9e84 (diff)
downloadbionic-6a6845244cf9eb8fe21ecc012b7b45990adad7d8.tar.gz
Merge "Fix ptsname(3) and ttyname(3) to use TLS."
-rw-r--r--libc/bionic/pty.cpp15
-rw-r--r--libc/include/stdlib.h2
-rw-r--r--libc/include/unistd.h2
-rw-r--r--libc/private/bionic_tls.h2
4 files changed, 14 insertions, 7 deletions
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 <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 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. */