Centralize xallocx() size[+extra] overflow checks.
This commit is contained in:
parent
aca490f004
commit
9a505b768c
@ -2791,15 +2791,8 @@ arena_ralloc_no_move(void *ptr, size_t oldsize, size_t size, size_t extra,
|
||||
{
|
||||
size_t usize_min, usize_max;
|
||||
|
||||
/* Check for size overflow. */
|
||||
if (unlikely(size > HUGE_MAXCLASS))
|
||||
return (true);
|
||||
usize_min = s2u(size);
|
||||
/* Clamp extra if necessary to avoid (size + extra) overflow. */
|
||||
if (unlikely(size + extra > HUGE_MAXCLASS))
|
||||
extra = HUGE_MAXCLASS - size;
|
||||
usize_max = s2u(size + extra);
|
||||
|
||||
if (likely(oldsize <= large_maxclass && usize_min <= large_maxclass)) {
|
||||
/*
|
||||
* Avoid moving the allocation if the size class can be left the
|
||||
|
@ -2285,13 +2285,6 @@ ixallocx_prof(tsd_t *tsd, void *ptr, size_t old_usize, size_t size,
|
||||
|
||||
prof_active = prof_active_get_unlocked();
|
||||
old_tctx = prof_tctx_get(ptr);
|
||||
/* Clamp extra if necessary to avoid (size + extra) overflow. */
|
||||
if (unlikely(size + extra > HUGE_MAXCLASS)) {
|
||||
/* Check for size overflow. */
|
||||
if (size > HUGE_MAXCLASS)
|
||||
return (old_usize);
|
||||
extra = HUGE_MAXCLASS - size;
|
||||
}
|
||||
/*
|
||||
* usize isn't knowable before ixalloc() returns when extra is non-zero.
|
||||
* Therefore, compute its maximum possible value and use that in
|
||||
@ -2335,6 +2328,17 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags)
|
||||
tsd = tsd_fetch();
|
||||
|
||||
old_usize = isalloc(ptr, config_prof);
|
||||
|
||||
/* Clamp extra if necessary to avoid (size + extra) overflow. */
|
||||
if (unlikely(size + extra > HUGE_MAXCLASS)) {
|
||||
/* Check for size overflow. */
|
||||
if (unlikely(size > HUGE_MAXCLASS)) {
|
||||
usize = old_usize;
|
||||
goto label_not_resized;
|
||||
}
|
||||
extra = HUGE_MAXCLASS - size;
|
||||
}
|
||||
|
||||
if (config_valgrind && unlikely(in_valgrind))
|
||||
old_rzsize = u2rz(old_usize);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user