diff options
author | vandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-24 19:34:35 +0000 |
---|---|---|
committer | vandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-24 19:34:35 +0000 |
commit | 7dcd4d5349d17a18b94501a670038154c5a129be (patch) | |
tree | 512ec573c655cae19a23fca70a432a2ce8114e7f /base/process_util_linux.cc | |
parent | 97632e2039e3ec0b9342f5e7c074bf631c738a9f (diff) | |
download | chromium_src-7dcd4d5349d17a18b94501a670038154c5a129be.zip chromium_src-7dcd4d5349d17a18b94501a670038154c5a129be.tar.gz chromium_src-7dcd4d5349d17a18b94501a670038154c5a129be.tar.bz2 |
Make calloc return NULL while initializing.
BUG=28244
TEST=Run chrome in shared library mode
Review URL: http://codereview.chromium.org/431025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32953 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/process_util_linux.cc')
-rw-r--r-- | base/process_util_linux.cc | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/base/process_util_linux.cc b/base/process_util_linux.cc index 25f1c27..98508be 100644 --- a/base/process_util_linux.cc +++ b/base/process_util_linux.cc @@ -534,15 +534,15 @@ typedef int (*posix_memalign_type)(void **memptr, size_t alignment, // Override the __libc_FOO name too. #define DIE_ON_OOM_1(function_name) \ _DIE_ON_OOM_1(function_name##_type, function_name) \ - _DIE_ON_OOM_1(function_name##_type, __libc_##function_name) + void* __libc_##function_name(size_t size) { \ + return function_name(size); \ + } #define DIE_ON_OOM_2(function_name, arg1_type) \ _DIE_ON_OOM_2(function_name##_type, function_name, arg1_type) \ - _DIE_ON_OOM_2(function_name##_type, __libc_##function_name, arg1_type) - -// posix_memalign doesn't have a __libc_ variant. -#define DIE_ON_OOM_3INT(function_name) \ - _DIE_ON_OOM_3INT(function_name##_type, function_name) + void* __libc_##function_name(arg1_type arg1, size_t size) { \ + return function_name(arg1, size); \ + } #define _DIE_ON_OOM_1(function_type, function_name) \ void* function_name(size_t size) { \ @@ -564,25 +564,44 @@ typedef int (*posix_memalign_type)(void **memptr, size_t alignment, return ret; \ } -#define _DIE_ON_OOM_3INT(function_type, function_name) \ - int function_name(void** ptr, size_t alignment, size_t size) { \ - static function_type original_function = \ - reinterpret_cast<function_type>(dlsym(RTLD_NEXT, #function_name)); \ - int ret = original_function(ptr, alignment, size); \ - if (ret == ENOMEM) \ - OnNoMemorySize(size); \ - return ret; \ - } - DIE_ON_OOM_1(malloc) DIE_ON_OOM_1(valloc) DIE_ON_OOM_1(pvalloc) -DIE_ON_OOM_2(calloc, size_t) DIE_ON_OOM_2(realloc, void*) DIE_ON_OOM_2(memalign, size_t) -DIE_ON_OOM_3INT(posix_memalign) +// dlsym uses calloc so it has to be treated specially. http://crbug.com/28244 +static void* null_calloc(size_t nmemb, size_t size) { + return NULL; +} + +void* calloc(size_t nmemb, size_t size) { + static calloc_type original_function = NULL; + if (original_function == NULL) { + original_function = null_calloc; + original_function = reinterpret_cast<calloc_type>(dlsym(RTLD_NEXT, + "calloc")); + } + void* ret = original_function(nmemb, size); + if (ret == NULL && size != 0 && original_function != null_calloc) + OnNoMemorySize(size); + return ret; +} + +void* __libc_calloc(size_t nmemb, size_t size) { \ + return calloc(nmemb, size); +} + +// posix_memalign has a unique signature and doesn't have a __libc_ variant. +int posix_memalign(void** ptr, size_t alignment, size_t size) { + static posix_memalign_type original_function = + reinterpret_cast<posix_memalign_type>(dlsym(RTLD_NEXT, "posix_memalign")); + int ret = original_function(ptr, alignment, size); + if (ret == ENOMEM) + OnNoMemorySize(size); + return ret; +} #endif // defined(LINUX_USE_TCMALLOC) |