]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/platform-bionic.git/commitdiff
Don't expose non-standard basename_r and dirname_r in LP64.
authorElliott Hughes <enh@google.com>
Fri, 5 Sep 2014 23:12:42 +0000 (16:12 -0700)
committerElliott Hughes <enh@google.com>
Fri, 5 Sep 2014 23:12:42 +0000 (16:12 -0700)
Bug: 17407423
Change-Id: I47fe499a4c396bf09d7b78fd828728d04777398b

libc/bionic/libgen.cpp
libc/include/libgen.h
tests/libgen_test.cpp

index d8df494dc6ae95b4273d63204d5acba41a3a7583..b98f504b0033484cffb3db56004335f097e780f6 100644 (file)
 
 #include "private/ThreadLocalBuffer.h"
 
-GLOBAL_INIT_THREAD_LOCAL_BUFFER(basename);
-GLOBAL_INIT_THREAD_LOCAL_BUFFER(dirname);
-
-char* basename(const char* path) {
-  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, basename, MAXPATHLEN);
-  int rc = basename_r(path, basename_tls_buffer, basename_tls_buffer_size);
-  return (rc < 0) ? NULL : basename_tls_buffer;
-}
-
-char* dirname(const char* path) {
-  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, dirname, MAXPATHLEN);
-  int rc = dirname_r(path, dirname_tls_buffer, dirname_tls_buffer_size);
-  return (rc < 0) ? NULL : dirname_tls_buffer;
-}
-
-int basename_r(const char* path, char* buffer, size_t buffer_size) {
+__LIBC64_HIDDEN__ int basename_r(const char* path, char* buffer, size_t buffer_size) {
   const char* startp = NULL;
   const char* endp = NULL;
   int len;
@@ -103,7 +88,7 @@ int basename_r(const char* path, char* buffer, size_t buffer_size) {
   return result;
 }
 
-int dirname_r(const char* path, char* buffer, size_t buffer_size) {
+__LIBC64_HIDDEN__ int dirname_r(const char* path, char* buffer, size_t buffer_size) {
   const char* endp = NULL;
   int len;
   int result;
@@ -161,3 +146,18 @@ int dirname_r(const char* path, char* buffer, size_t buffer_size) {
   }
   return result;
 }
+
+GLOBAL_INIT_THREAD_LOCAL_BUFFER(basename);
+GLOBAL_INIT_THREAD_LOCAL_BUFFER(dirname);
+
+char* basename(const char* path) {
+  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, basename, MAXPATHLEN);
+  int rc = basename_r(path, basename_tls_buffer, basename_tls_buffer_size);
+  return (rc < 0) ? NULL : basename_tls_buffer;
+}
+
+char* dirname(const char* path) {
+  LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, dirname, MAXPATHLEN);
+  int rc = dirname_r(path, dirname_tls_buffer, dirname_tls_buffer_size);
+  return (rc < 0) ? NULL : dirname_tls_buffer;
+}
index c5fc76a79398ec7cb4d1b3804d533249c7129638..9dcec75cce9ae9c062e5593528059eb0f87028c4 100644 (file)
 
 __BEGIN_DECLS
 
-/* our version of dirname/basename don't modify the input path */
-extern char*  dirname (const char*  path);
-extern char*  basename(const char*  path);
+/* On Android these don't modify their input, and use thread-local storage for their results. */
+extern char* basename(const char*);
+extern char* dirname(const char*);
 
-/* special thread-safe Bionic versions
- *
- * if 'buffer' is NULL, 'bufflen' is ignored and the length of the result is returned
- * otherwise, place result in 'buffer'
- *
- * at most bufflen-1 characters written, plus a terminating zero
- *
- * return length of result, or -1 in case of error, with errno set to:
- *
- *    ERANGE:        buffer is too short
- *    ENAMETOOLONG:  the result is too long for a valid path
- */
-extern int    dirname_r(const char*  path, char*  buffer, size_t  bufflen);
-extern int    basename_r(const char*  path, char*  buffer, size_t  bufflen);
+#if !defined(__LP64__)
+/* These non-standard functions are not needed on Android; basename and dirname use thread-local storage. */
+extern int dirname_r(const char*, char*, size_t);
+extern int basename_r(const char*, char*, size_t);
+#endif
 
 __END_DECLS
 
index cae646f2593ef0c687a33817d473e4d9ef1fc5e8..3958f81ed6a190f47deb5f4cb10981ebdcfb4e10 100644 (file)
@@ -64,7 +64,7 @@ TEST(libgen, dirname) {
   TestDirname("/", "/");
 }
 
-#if defined(__BIONIC__)
+#if defined(__BIONIC__) && !defined(__LP64__)
 static void TestBasename(const char* in, const char* expected_out, int expected_rc,
                          char* buf, size_t buf_size, int expected_errno) {
   errno = 0;
@@ -89,7 +89,7 @@ static void TestDirname(const char* in, const char* expected_out, int expected_r
 #endif // __BIONIC__
 
 TEST(libgen, basename_r) {
-#if defined(__BIONIC__)
+#if defined(__BIONIC__) && !defined(__LP64__)
   char buf[256];
   TestBasename("", ".",  1, NULL, 0, 0);
   TestBasename("", ".", -1, buf, 0, ERANGE);
@@ -108,7 +108,7 @@ TEST(libgen, basename_r) {
 }
 
 TEST(libgen, dirname_r) {
-#if defined(__BIONIC__)
+#if defined(__BIONIC__) && !defined(__LP64__)
   char buf[256];
   TestDirname("", ".",  1, NULL, 0, 0);
   TestDirname("", ".", -1, buf, 0, ERANGE);