mirror of
https://github.com/gperftools/gperftools
synced 2025-01-03 05:02:04 +00:00
Make _recalloc adhere to MS's definition
This commit is contained in:
parent
fe87ffb7ea
commit
f47a52ce85
@ -1391,7 +1391,7 @@ ATTRIBUTE_ALWAYS_INLINE inline void* do_calloc(size_t n, size_t elem_size) {
|
|||||||
|
|
||||||
void* result = do_malloc_or_cpp_alloc(size);
|
void* result = do_malloc_or_cpp_alloc(size);
|
||||||
if (result != NULL) {
|
if (result != NULL) {
|
||||||
memset(result, 0, size);
|
memset(result, 0, tc_nallocx(size, 0));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -66,10 +66,25 @@ void* _calloc_base(size_t n, size_t size) {
|
|||||||
return calloc(n, size);
|
return calloc(n, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* _recalloc(void* p, size_t n, size_t size) {
|
void* _recalloc(void* old_ptr, size_t n, size_t size) {
|
||||||
void* result = realloc(p, n * size);
|
// Ensure that (n * size) does not overflow
|
||||||
memset(result, 0, n * size);
|
if (!(n == 0 || (std::numeric_limits<size_t>::max)() / n >= size)) {
|
||||||
return result;
|
errno = ENOMEM;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t old_size = tc_malloc_size(old_ptr);
|
||||||
|
const size_t new_size = n * size;
|
||||||
|
|
||||||
|
void* new_ptr = realloc(old_ptr, new_size);
|
||||||
|
|
||||||
|
// If the reallocation succeeded and the new block is larger, zero-fill the
|
||||||
|
// new bytes:
|
||||||
|
if (new_ptr != NULL && new_size > old_size) {
|
||||||
|
memset(static_cast<char*>(new_ptr) + old_size, 0, tc_nallocx(new_size, 0) - old_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* _calloc_impl(size_t n, size_t size) {
|
void* _calloc_impl(size_t n, size_t size) {
|
||||||
|
Loading…
Reference in New Issue
Block a user