diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-06-29 12:12:23 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-06-29 12:12:23 +0000 |
commit | 77943a40ad87e61f4f547fb3df78c96ed8c68035 (patch) | |
tree | 22f0433dd9407280f04c524d371f08374115ca43 /vespamalloc/src | |
parent | fdfbe6d69def714c5e8481b033d7330282e96c89 (diff) |
Handle overflow.
Diffstat (limited to 'vespamalloc/src')
-rw-r--r-- | vespamalloc/src/tests/test1/new_test.cpp | 20 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/overload.h | 10 |
2 files changed, 17 insertions, 13 deletions
diff --git a/vespamalloc/src/tests/test1/new_test.cpp b/vespamalloc/src/tests/test1/new_test.cpp index 9c291b3842e..131f78cbe05 100644 --- a/vespamalloc/src/tests/test1/new_test.cpp +++ b/vespamalloc/src/tests/test1/new_test.cpp @@ -95,17 +95,17 @@ TEST("verify new with alignment = 64 with single element") { LOG(info, "&s=%p", s.get()); } -TEST("verify new with alignment = 64 with single element") { - struct alignas(64) S { - long a; - }; - static_assert(sizeof(S) == 64); - static_assert(alignof(S) == 64); - auto s = std::make_unique<S>(); - verify_aligned(s.get()); - cmp(s.get(), &s->a); - LOG(info, "&s=%p", s.get()); +#if __GLIBC_PREREQ(2, 26) +TEST("verify realloarray") { + void *arr = calloc(5,5); + void *arr2 = reallocarray(arr, 800, 5); + EXPECT_NOT_EQUAL(arr, arr2); + EXPECT_NOT_EQUAL(nullptr, arr2); + + void *arr3 = reallocarray(arr2, 1u << 33, 1u << 33); + EXPECT_EQUAL(nullptr, arr3); } +#endif void verify_vespamalloc_usable_size() { struct AllocInfo { size_t requested; size_t usable;}; diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h index ac760c22496..b6a0d0316ae 100644 --- a/vespamalloc/src/vespamalloc/malloc/overload.h +++ b/vespamalloc/src/vespamalloc/malloc/overload.h @@ -154,10 +154,14 @@ void * realloc(void * ptr, size_t sz) return vespamalloc::createAllocator()->realloc(ptr, sz); } -void * reallocarray(void * ptr, size_t nemb, size_t sz) __THROW __attribute__((visibility ("default"))); -void * reallocarray(void * ptr, size_t nemb, size_t sz) __THROW +void * reallocarray(void * ptr, size_t nemb, size_t elemSize) __THROW __attribute__((visibility ("default"))); +void * reallocarray(void * ptr, size_t nemb, size_t elemSize) __THROW { - return vespamalloc::createAllocator()->realloc(ptr, sz*nemb); + size_t sz = nemb * elemSize; + if (nemb != 0 && (sz/nemb != elemSize)) { + return nullptr; + } + return vespamalloc::createAllocator()->realloc(ptr, sz); } void* memalign(size_t align, size_t sz) __THROW __attribute__((visibility ("default"))); |