aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_alloc_util.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2013-04-02 18:47:35 +0200
committerSverker Eriksson <[email protected]>2013-04-02 18:47:35 +0200
commit31bc414dc9639ccf94f9011ed3240c05c6a7f0cb (patch)
tree4fa609abe1add753f1a372aeb59f430c49c8a4e2 /erts/emulator/beam/erl_alloc_util.c
parenta95050941b2f75856e3ecc6dfc3934d6358bd528 (diff)
downloadotp-31bc414dc9639ccf94f9011ed3240c05c6a7f0cb.tar.gz
otp-31bc414dc9639ccf94f9011ed3240c05c6a7f0cb.tar.bz2
otp-31bc414dc9639ccf94f9011ed3240c05c6a7f0cb.zip
erts: Fix unabused bug in fixed allocation
Make sure each fix allocator type always allocate the right fixed size.
Diffstat (limited to 'erts/emulator/beam/erl_alloc_util.c')
-rw-r--r--erts/emulator/beam/erl_alloc_util.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c
index 510b1b47e1..583aeed12d 100644
--- a/erts/emulator/beam/erl_alloc_util.c
+++ b/erts/emulator/beam/erl_alloc_util.c
@@ -3489,7 +3489,9 @@ do_erts_alcu_alloc(ErtsAlcType_t type, void *extra, Uint size)
fix = allctr->fix;
if (fix) {
int ix = type - ERTS_ALC_N_MIN_A_FIXED_SIZE;
+ ASSERT((unsigned)ix < ERTS_ALC_NO_FIXED_SIZES);
ERTS_DBG_CHK_FIX_LIST(allctr, fix, ix, 1);
+ ASSERT(size <= fix[ix].type_size);
fix[ix].used++;
res = fix[ix].list;
if (res) {
@@ -3510,8 +3512,7 @@ do_erts_alcu_alloc(ErtsAlcType_t type, void *extra, Uint size)
ERTS_DBG_CHK_FIX_LIST(allctr, fix, ix, 0);
return res;
}
- if (size < 2*sizeof(UWord))
- size += sizeof(UWord);
+ size = fix[ix].type_size;
if (fix[ix].limit < fix[ix].used)
fix[ix].limit = fix[ix].used;
if (fix[ix].max_used < fix[ix].used)
@@ -4326,6 +4327,9 @@ erts_alcu_start(Allctr_t *allctr, AllctrInit_t *init)
allctr->fix[i].list = NULL;
allctr->fix[i].allocated = 0;
allctr->fix[i].used = 0;
+#ifdef ERTS_SMP
+ ASSERT(allctr->fix[i].type_size >= sizeof(ErtsAllctrFixDDBlock_t));
+#endif
}
}