diff --git a/libc/bionic/dlmalloc.c b/libc/bionic/dlmalloc.c index 6287549fe..1ed3205a0 100644 --- a/libc/bionic/dlmalloc.c +++ b/libc/bionic/dlmalloc.c @@ -16,102 +16,68 @@ #include "dlmalloc.h" -/* Bionic error handling declarations */ +#include +#include +#include +#include +#include + +#include + +#include +#include + +// Send dlmalloc errors to the log. +static void __bionic_heap_corruption_error(const char* function); +static void __bionic_heap_usage_error(const char* function, void* address); #define PROCEED_ON_ERROR 0 -static void __bionic_heap_error(const char* msg, const char* function, void* p); -#define CORRUPTION_ERROR_ACTION(m) \ - __bionic_heap_error("HEAP MEMORY CORRUPTION", __FUNCTION__, NULL) -#define USAGE_ERROR_ACTION(m,p) \ - __bionic_heap_error("ARGUMENT IS INVALID HEAP ADDRESS", __FUNCTION__, p) +#define CORRUPTION_ERROR_ACTION(m) __bionic_heap_corruption_error(__FUNCTION__) +#define USAGE_ERROR_ACTION(m,p) __bionic_heap_usage_error(__FUNCTION__, p) -/* Bionic named anonymous memory declarations */ -static void* named_anonymous_mmap(size_t length); -#define MMAP(s) named_anonymous_mmap(s) +// We use ashmem to name the anonymous private regions created by dlmalloc. +static void* __bionic_named_anonymous_mmap(size_t length); +#define MMAP(s) __bionic_named_anonymous_mmap(s) -/* - * Ugly inclusion of C file so that bionic specific #defines configure - * dlmalloc. - */ +// Ugly inclusion of C file so that bionic specific #defines configure dlmalloc. #include "../upstream-dlmalloc/malloc.c" - -/* Bionic error handling definitions */ -/* Convert a pointer into hex string */ -static void __bionic_itox(char* hex, void* ptr) -{ - intptr_t val = (intptr_t) ptr; - /* Terminate with NULL */ - hex[8] = 0; - int i; - - for (i = 7; i >= 0; i--) { - int digit = val & 15; - hex[i] = (digit <= 9) ? digit + '0' : digit - 10 + 'a'; - val >>= 4; - } +static void __bionic_heap_corruption_error(const char* function) { + __libc_format_log(ANDROID_LOG_FATAL, "libc", "@@@ ABORTING: heap corruption detected by %s", + function); + abort(); } -#include -static void __bionic_heap_error(const char* msg, const char* function, void* p) -{ - /* We format the buffer explicitely, i.e. without using snprintf() - * which may use malloc() internally. Not something we can trust - * if we just detected a corrupted heap. - */ - char buffer[256]; - strlcpy(buffer, "@@@ ABORTING: LIBC: ", sizeof(buffer)); - strlcat(buffer, msg, sizeof(buffer)); - if (function != NULL) { - strlcat(buffer, " IN ", sizeof(buffer)); - strlcat(buffer, function, sizeof(buffer)); - } - - if (p != NULL) { - char hexbuffer[9]; - __bionic_itox(hexbuffer, p); - strlcat(buffer, " addr=0x", sizeof(buffer)); - strlcat(buffer, hexbuffer, sizeof(buffer)); - } - - __libc_android_log_write(ANDROID_LOG_FATAL, "libc", buffer); - - /* So that we can get a memory dump around p */ - *((int **) 0xdeadbaad) = (int *) p; +static void __bionic_heap_usage_error(const char* function, void* address) { + __libc_format_log(ANDROID_LOG_FATAL, "libc", "@@@ ABORTING: invalid address %p passed to %s", + address, function); + // So that we can get a memory dump around the specific address. + *((int**) 0xdeadbaad) = (int*) address; } -/* Bionic named anonymous memory definitions */ -#include -static int __ashmem_create_region(const char* name, size_t size) -{ - int fd, ret; - fd = open("/dev/ashmem", O_RDWR); - if (fd < 0) - return fd; - if (name != NULL) { - char buf[ASHMEM_NAME_LEN]; - - strlcpy(buf, name, sizeof(buf)); - ret = ioctl(fd, ASHMEM_SET_NAME, buf); - if (ret < 0) { /* error */ - close(fd); - return ret; - } - } - ret = ioctl(fd, ASHMEM_SET_SIZE, size); - if (ret < 0) { /* error */ - close(fd); - return ret; - } +static int __ashmem_create_region(const char* name, size_t size) { + int fd = open("/dev/ashmem", O_RDWR); + if (fd == -1) { return fd; + } + int rc = ioctl(fd, ASHMEM_SET_NAME, name); + if (rc < 0) { + close(fd); + return rc; + } + rc = ioctl(fd, ASHMEM_SET_SIZE, size); + if (rc < 0) { + close(fd); + return rc; + } + return fd; } -static void* named_anonymous_mmap(size_t length) -{ - void* ret; - int fd = __ashmem_create_region("libc malloc", length); - if (fd < 0) - return MAP_FAILED; - ret = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); - close (fd); - return ret; +static void* __bionic_named_anonymous_mmap(size_t length) { + int fd = __ashmem_create_region("libc malloc", length); + if (fd < 0) { + return MAP_FAILED; + } + void* result = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + close (fd); + return result; }