Fix size class overflow handling when profiling is enabled.
Fix size class overflow handling for malloc(), posix_memalign(), memalign(), calloc(), and realloc() when profiling is enabled. Remove an assertion that erroneously caused arena_sdalloc() to fail when profiling was enabled. This resolves #232.
This commit is contained in:
@@ -1,12 +1,8 @@
|
||||
#include "test/jemalloc_test.h"
|
||||
|
||||
#define CHUNK 0x400000
|
||||
#define MAXALIGN (((size_t)1) << 25)
|
||||
#define MAXSZ (((size_t)1) << 26)
|
||||
#define NITER 4
|
||||
|
||||
TEST_BEGIN(test_basic)
|
||||
{
|
||||
#define MAXSZ (((size_t)1) << 26)
|
||||
size_t sz;
|
||||
|
||||
for (sz = 1; sz < MAXSZ; sz = nallocx(sz, 0) + 1) {
|
||||
@@ -33,11 +29,14 @@ TEST_BEGIN(test_basic)
|
||||
assert_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
|
||||
dallocx(p, 0);
|
||||
}
|
||||
#undef MAXSZ
|
||||
}
|
||||
TEST_END
|
||||
|
||||
TEST_BEGIN(test_alignment_and_size)
|
||||
{
|
||||
#define MAXALIGN (((size_t)1) << 25)
|
||||
#define NITER 4
|
||||
size_t nsz, rsz, sz, alignment, total;
|
||||
unsigned i;
|
||||
void *ps[NITER];
|
||||
@@ -87,6 +86,8 @@ TEST_BEGIN(test_alignment_and_size)
|
||||
}
|
||||
}
|
||||
}
|
||||
#undef MAXALIGN
|
||||
#undef NITER
|
||||
}
|
||||
TEST_END
|
||||
|
||||
|
49
test/integration/overflow.c
Normal file
49
test/integration/overflow.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include "test/jemalloc_test.h"
|
||||
|
||||
TEST_BEGIN(test_overflow)
|
||||
{
|
||||
unsigned nhchunks;
|
||||
size_t mib[4];
|
||||
size_t sz, miblen, max_size_class;
|
||||
void *p;
|
||||
|
||||
sz = sizeof(unsigned);
|
||||
assert_d_eq(mallctl("arenas.nhchunks", &nhchunks, &sz, NULL, 0), 0,
|
||||
"Unexpected mallctl() error");
|
||||
|
||||
miblen = sizeof(mib) / sizeof(size_t);
|
||||
assert_d_eq(mallctlnametomib("arenas.hchunk.0.size", mib, &miblen), 0,
|
||||
"Unexpected mallctlnametomib() error");
|
||||
mib[2] = nhchunks - 1;
|
||||
|
||||
sz = sizeof(size_t);
|
||||
assert_d_eq(mallctlbymib(mib, miblen, &max_size_class, &sz, NULL, 0), 0,
|
||||
"Unexpected mallctlbymib() error");
|
||||
|
||||
assert_ptr_null(malloc(max_size_class + 1),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
assert_ptr_null(malloc(SIZE_T_MAX),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
|
||||
assert_ptr_null(calloc(1, max_size_class + 1),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
assert_ptr_null(calloc(1, SIZE_T_MAX),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
|
||||
p = malloc(1);
|
||||
assert_ptr_not_null(p, "Unexpected malloc() OOM");
|
||||
assert_ptr_null(realloc(p, max_size_class + 1),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
assert_ptr_null(realloc(p, SIZE_T_MAX),
|
||||
"Expected OOM due to over-sized allocation request");
|
||||
free(p);
|
||||
}
|
||||
TEST_END
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
return (test(
|
||||
test_overflow));
|
||||
}
|
Reference in New Issue
Block a user