Fix ptsname(3) and ttyname(3) to use TLS.
authorElliott Hughes <enh@google.com>
Wed, 10 Dec 2014 04:30:23 +0000 (20:30 -0800)
committerElliott Hughes <enh@google.com>
Wed, 10 Dec 2014 04:30:23 +0000 (20:30 -0800)
Be safe by default.

Change-Id: I6c4a3f1fd4eee3a651b3162ce95b7e873de57521

libc/bionic/pty.cpp
libc/include/stdlib.h
libc/include/unistd.h
libc/private/bionic_tls.h

index 2c8618047408b3e157831ba977e7b30151cfe591..884714799679c43b630b1290de127c66724a0e40 100644 (file)
 #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) {
index 3053e85b2f46f15fd9ea9e97e78193de0ffdf229..dfb788e573e33165b88de20752d84a98aa127fd0 100644 (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);
 
index e94ee66fb53b113bb45b831b5812bd2a90809e96..c7557155ae244c91aa7d2734a5a4a2271888ae7e 100644 (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);
index 56a61bec335a98d912260c78e381cc6a099bce3b..0c6e062393754cbca5e5ea9a95d2a35170c9cad5 100644 (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. */