Commit 73c98bc4 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

base/allocator: Intercept getcwd and realpath on Android

This is a follow-up of https://crrev.com/c/2418513.
We need to intercept getcwd and realpath, which allocate memory
internally.  The reason is the same as 2418513.

Bug: 1111332
Change-Id: I50c43056609b69020dc84bf181ec6247067cb982
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2438093
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Reviewed-by: default avatarWill Harris <wfh@chromium.org>
Reviewed-by: default avatarBenoit L <lizeb@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816125}
parent 5fa0df87
...@@ -306,8 +306,14 @@ config("wrap_malloc_symbols") { ...@@ -306,8 +306,14 @@ config("wrap_malloc_symbols") {
"-Wl,-wrap,realloc", "-Wl,-wrap,realloc",
"-Wl,-wrap,valloc", "-Wl,-wrap,valloc",
# <stdlib.h> functions
"-Wl,-wrap,realpath",
# <string.h> functions # <string.h> functions
"-Wl,-wrap,strdup", "-Wl,-wrap,strdup",
"-Wl,-wrap,strndup", "-Wl,-wrap,strndup",
# <unistd.h> functions
"-Wl,-wrap,getcwd",
] ]
} }
...@@ -54,6 +54,26 @@ SHIM_ALWAYS_EXPORT void* __wrap_valloc(size_t size) { ...@@ -54,6 +54,26 @@ SHIM_ALWAYS_EXPORT void* __wrap_valloc(size_t size) {
return ShimValloc(size, nullptr); return ShimValloc(size, nullptr);
} }
const size_t kPathMaxSize = 8192;
static_assert(kPathMaxSize >= PATH_MAX, "");
extern char* __wrap_strdup(const char* str);
// Override <stdlib.h>
extern char* __real_realpath(const char* path, char* resolved_path);
SHIM_ALWAYS_EXPORT char* __wrap_realpath(const char* path,
char* resolved_path) {
if (resolved_path)
return __real_realpath(path, resolved_path);
char buffer[kPathMaxSize];
if (!__real_realpath(path, buffer))
return nullptr;
return __wrap_strdup(buffer);
}
// Override <string.h> functions // Override <string.h> functions
SHIM_ALWAYS_EXPORT char* __wrap_strdup(const char* str) { SHIM_ALWAYS_EXPORT char* __wrap_strdup(const char* str) {
...@@ -74,4 +94,20 @@ SHIM_ALWAYS_EXPORT char* __wrap_strndup(const char* str, size_t n) { ...@@ -74,4 +94,20 @@ SHIM_ALWAYS_EXPORT char* __wrap_strndup(const char* str, size_t n) {
return buffer; return buffer;
} }
// Override <unistd.h>
extern char* __real_getcwd(char* buffer, size_t size);
SHIM_ALWAYS_EXPORT char* __wrap_getcwd(char* buffer, size_t size) {
if (buffer)
return __real_getcwd(buffer, size);
if (!size)
size = kPathMaxSize;
char local_buffer[size];
if (!__real_getcwd(local_buffer, size))
return nullptr;
return __wrap_strdup(local_buffer);
}
} // extern "C" } // extern "C"
...@@ -637,6 +637,15 @@ TEST_F(AllocatorShimTest, InterceptCLibraryFunctions) { ...@@ -637,6 +637,15 @@ TEST_F(AllocatorShimTest, InterceptCLibraryFunctions) {
InsertAllocatorDispatch(&g_mock_dispatch); InsertAllocatorDispatch(&g_mock_dispatch);
// <stdlib.h>
counts_before = counts_after;
ptr = realpath(".", nullptr);
EXPECT_NE(nullptr, ptr);
free(ptr);
counts_after = total_counts(allocs_intercepted_by_size);
EXPECT_GT(counts_after, counts_before);
// <string.h>
counts_before = counts_after; counts_before = counts_after;
ptr = strdup("hello, world"); ptr = strdup("hello, world");
EXPECT_NE(nullptr, ptr); EXPECT_NE(nullptr, ptr);
...@@ -651,6 +660,14 @@ TEST_F(AllocatorShimTest, InterceptCLibraryFunctions) { ...@@ -651,6 +660,14 @@ TEST_F(AllocatorShimTest, InterceptCLibraryFunctions) {
counts_after = total_counts(allocs_intercepted_by_size); counts_after = total_counts(allocs_intercepted_by_size);
EXPECT_GT(counts_after, counts_before); EXPECT_GT(counts_after, counts_before);
// <unistd.h>
counts_before = counts_after;
ptr = getcwd(nullptr, 0);
EXPECT_NE(nullptr, ptr);
free(ptr);
counts_after = total_counts(allocs_intercepted_by_size);
EXPECT_GT(counts_after, counts_before);
RemoveAllocatorDispatchForTesting(&g_mock_dispatch); RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
} }
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment