From cf5fc80c3eb710cb5a1985837156cb2758c87a5b Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 5 Sep 2014 16:12:42 -0700 Subject: [PATCH] Don't expose non-standard basename_r and dirname_r in LP64. (cherry-pick of f0e9458ea596227720fa745df15f5357f6c0c8f6.) Bug: 17407423 Change-Id: I47fe499a4c396bf09d7b78fd828728d04777398b --- libc/bionic/libgen.cpp | 34 +++++++++++++++++----------------- libc/include/libgen.h | 26 +++++++++----------------- tests/libgen_test.cpp | 6 +++--- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/libc/bionic/libgen.cpp b/libc/bionic/libgen.cpp index d8df494dc..b98f504b0 100644 --- a/libc/bionic/libgen.cpp +++ b/libc/bionic/libgen.cpp @@ -36,22 +36,7 @@ #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; +} diff --git a/libc/include/libgen.h b/libc/include/libgen.h index 4caf8b9c5..e89328e9f 100644 --- a/libc/include/libgen.h +++ b/libc/include/libgen.h @@ -38,29 +38,21 @@ __BEGIN_DECLS /* * gets you the GNU basename. * the POSIX one. - * Note that our "POSIX" one has the wrong argument cv-qualifiers. + * Note that our "POSIX" one has the wrong argument cv-qualifiers, but doesn't + * modify its input and uses thread-local storage for the result if necessary. */ extern char* basename(const char*); #define __bionic_using_posix_basename #endif -/* our version of dirname/basename don't modify the input path */ -extern char* dirname (const char* path); +/* This has the wrong argument cv-qualifiers, but doesn't modify its input and uses thread-local storage for the result if necessary. */ +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 diff --git a/tests/libgen_test.cpp b/tests/libgen_test.cpp index d0402dbf6..e9a5d5c44 100644 --- a/tests/libgen_test.cpp +++ b/tests/libgen_test.cpp @@ -63,7 +63,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; @@ -88,7 +88,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); @@ -107,7 +107,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); -- 2.11.0