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
This commit is contained in:
Elliott Hughes 2012-10-09 17:14:56 -07:00
parent 9a7366e894
commit 156da96621
2 changed files with 6 additions and 5 deletions

View file

@ -40,22 +40,23 @@ char* getcwd(char* buf, size_t size) {
// Allocate a buffer if necessary. // Allocate a buffer if necessary.
char* allocated_buf = NULL; char* allocated_buf = NULL;
size_t allocated_size = size;
if (buf == NULL) { if (buf == NULL) {
size_t allocated_size = size;
if (size == 0) { if (size == 0) {
// The Linux kernel won't return more than a page, so translate size 0 to 4KiB. // 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. // 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<char*>(malloc(allocated_size)); buf = allocated_buf = static_cast<char*>(malloc(allocated_size));
if (buf == NULL) { if (buf == NULL) {
// malloc set errno. // malloc should set errno, but valgrind's malloc wrapper doesn't.
errno = ENOMEM;
return NULL; return NULL;
} }
} }
// Ask the kernel to fill our buffer. // Ask the kernel to fill our buffer.
int rc = __getcwd(buf, size); int rc = __getcwd(buf, allocated_size);
if (rc == -1) { if (rc == -1) {
free(allocated_buf); free(allocated_buf);
// __getcwd set errno. // __getcwd set errno.

View file

@ -88,7 +88,7 @@ TEST(dlopen, dladdr) {
uintptr_t start = strtoul(line, 0, 16); uintptr_t start = strtoul(line, 0, 16);
line[strlen(line) - 1] = '\0'; // Chomp the '\n'. line[strlen(line) - 1] = '\0'; // Chomp the '\n'.
char* path = strchr(line, '/'); char* path = strchr(line, '/');
if (strcmp(executable_path, path) == 0) { if (path != NULL && strcmp(executable_path, path) == 0) {
base_address = reinterpret_cast<void*>(start); base_address = reinterpret_cast<void*>(start);
break; break;
} }