aboutsummaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-06-29 12:12:23 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-06-29 12:12:23 +0000
commit77943a40ad87e61f4f547fb3df78c96ed8c68035 (patch)
tree22f0433dd9407280f04c524d371f08374115ca43 /vespamalloc
parentfdfbe6d69def714c5e8481b033d7330282e96c89 (diff)
Handle overflow.
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/tests/test1/new_test.cpp20
-rw-r--r--vespamalloc/src/vespamalloc/malloc/overload.h10
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")));