From 156da966214957c5616a0b83cc84686eedfc4e31 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 9 Oct 2012 17:14:56 -0700 Subject: [PATCH] Fix a getcwd(3) bug and make our tests run correctly under valgrind. The getcwd(3) bug was found by valgrind. Bug: 7291287 Change-Id: I59f3bff1c1392a408b905934eebcd5d894d37492 --- libc/bionic/getcwd.cpp | 9 +++++---- tests/dlopen_test.cpp | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libc/bionic/getcwd.cpp b/libc/bionic/getcwd.cpp index 2ff22dbca..47c807f01 100644 --- a/libc/bionic/getcwd.cpp +++ b/libc/bionic/getcwd.cpp @@ -40,22 +40,23 @@ char* getcwd(char* buf, size_t size) { // Allocate a buffer if necessary. char* allocated_buf = NULL; + size_t allocated_size = size; if (buf == NULL) { - size_t allocated_size = size; if (size == 0) { // The Linux kernel won't return more than a page, so translate size 0 to 4KiB. // TODO: if we need to support paths longer than that, we'll have to walk the tree ourselves. - size = getpagesize(); + allocated_size = getpagesize(); } buf = allocated_buf = static_cast(malloc(allocated_size)); if (buf == NULL) { - // malloc set errno. + // malloc should set errno, but valgrind's malloc wrapper doesn't. + errno = ENOMEM; return NULL; } } // Ask the kernel to fill our buffer. - int rc = __getcwd(buf, size); + int rc = __getcwd(buf, allocated_size); if (rc == -1) { free(allocated_buf); // __getcwd set errno. diff --git a/tests/dlopen_test.cpp b/tests/dlopen_test.cpp index c41c5e6ab..2fcfa0c85 100644 --- a/tests/dlopen_test.cpp +++ b/tests/dlopen_test.cpp @@ -88,7 +88,7 @@ TEST(dlopen, dladdr) { uintptr_t start = strtoul(line, 0, 16); line[strlen(line) - 1] = '\0'; // Chomp the '\n'. char* path = strchr(line, '/'); - if (strcmp(executable_path, path) == 0) { + if (path != NULL && strcmp(executable_path, path) == 0) { base_address = reinterpret_cast(start); break; }