1241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans#include "test/jemalloc_test.h"
2241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
3241abc601b947c5e0e56791bd73a924ce872b4a1Jason EvansTEST_BEGIN(test_overflow)
4241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans{
5241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	unsigned nhchunks;
6241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	size_t mib[4];
7241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	size_t sz, miblen, max_size_class;
8241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	void *p;
9241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
10241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	sz = sizeof(unsigned);
118f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.nhchunks", (void *)&nhchunks, &sz, NULL, 0),
128f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0, "Unexpected mallctl() error");
13241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
14241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	miblen = sizeof(mib) / sizeof(size_t);
15241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_d_eq(mallctlnametomib("arenas.hchunk.0.size", mib, &miblen), 0,
16241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Unexpected mallctlnametomib() error");
17241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	mib[2] = nhchunks - 1;
18241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
19241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	sz = sizeof(size_t);
208f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&max_size_class, &sz,
218f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctlbymib() error");
22241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
23241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(malloc(max_size_class + 1),
24241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
25241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(malloc(SIZE_T_MAX),
26241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
27241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
28241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(calloc(1, max_size_class + 1),
29241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
30241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(calloc(1, SIZE_T_MAX),
31241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
32241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
33241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	p = malloc(1);
34241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_not_null(p, "Unexpected malloc() OOM");
35241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(realloc(p, max_size_class + 1),
36241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
37241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	assert_ptr_null(realloc(p, SIZE_T_MAX),
38241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    "Expected OOM due to over-sized allocation request");
39241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	free(p);
40241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans}
41241abc601b947c5e0e56791bd73a924ce872b4a1Jason EvansTEST_END
42241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
43241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evansint
44241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evansmain(void)
45241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans{
46241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans
47241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	return (test(
48241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans	    test_overflow));
49241abc601b947c5e0e56791bd73a924ce872b4a1Jason Evans}
50