Commit b22dc765 authored by Sam Lantinga's avatar Sam Lantinga

Fixed bug #428

This fix is overkill, but approved by Doug Lea, and he'll be releasing a
new version of his malloc.c sometime next month.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402547
parent 304c4a50
...@@ -2727,8 +2727,7 @@ do_check_tree(mstate m, tchunkptr t) ...@@ -2727,8 +2727,7 @@ do_check_tree(mstate m, tchunkptr t)
} }
} }
u = u->fd; u = u->fd;
} } while (u != t);
while (u != t);
assert(head != 0); assert(head != 0);
} }
...@@ -2784,8 +2783,7 @@ bin_find(mstate m, mchunkptr x) ...@@ -2784,8 +2783,7 @@ bin_find(mstate m, mchunkptr x)
do { do {
if (p == x) if (p == x)
return 1; return 1;
} } while ((p = p->fd) != b);
while ((p = p->fd) != b);
} }
} else { } else {
bindex_t tidx; bindex_t tidx;
...@@ -2802,8 +2800,7 @@ bin_find(mstate m, mchunkptr x) ...@@ -2802,8 +2800,7 @@ bin_find(mstate m, mchunkptr x)
do { do {
if (u == (tchunkptr) x) if (u == (tchunkptr) x)
return 1; return 1;
} } while ((u = u->fd) != t);
while ((u = u->fd) != t);
} }
} }
} }
...@@ -3476,7 +3473,9 @@ sys_alloc(mstate m, size_t nb) ...@@ -3476,7 +3473,9 @@ sys_alloc(mstate m, size_t nb)
if (ss == 0) { /* First time through or recovery */ if (ss == 0) { /* First time through or recovery */
char *base = (char *) CALL_MORECORE(0); char *base = (char *) CALL_MORECORE(0);
if (base != CMFAIL) { if (base != CMFAIL) {
asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); asize =
granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT +
SIZE_T_ONE);
/* Adjust to end on a page boundary */ /* Adjust to end on a page boundary */
if (!is_page_aligned(base)) if (!is_page_aligned(base))
asize += (page_align((size_t) base) - (size_t) base); asize += (page_align((size_t) base) - (size_t) base);
...@@ -3491,7 +3490,7 @@ sys_alloc(mstate m, size_t nb) ...@@ -3491,7 +3490,7 @@ sys_alloc(mstate m, size_t nb)
/* Subtract out existing available top space from MORECORE request. */ /* Subtract out existing available top space from MORECORE request. */
asize = asize =
granularity_align(nb - m->topsize + TOP_FOOT_SIZE + granularity_align(nb - m->topsize + TOP_FOOT_SIZE +
SIZE_T_ONE); MALLOC_ALIGNMENT + SIZE_T_ONE);
/* Use mem here only if it did continuously extend old space */ /* Use mem here only if it did continuously extend old space */
if (asize < HALF_MAX_SIZE_T && if (asize < HALF_MAX_SIZE_T &&
(br = (br =
...@@ -3507,7 +3506,8 @@ sys_alloc(mstate m, size_t nb) ...@@ -3507,7 +3506,8 @@ sys_alloc(mstate m, size_t nb)
asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
size_t esize = size_t esize =
granularity_align(nb + TOP_FOOT_SIZE + granularity_align(nb + TOP_FOOT_SIZE +
SIZE_T_ONE - asize); MALLOC_ALIGNMENT + SIZE_T_ONE -
asize);
if (esize < HALF_MAX_SIZE_T) { if (esize < HALF_MAX_SIZE_T) {
char *end = (char *) CALL_MORECORE(esize); char *end = (char *) CALL_MORECORE(esize);
if (end != CMFAIL) if (end != CMFAIL)
...@@ -3530,7 +3530,7 @@ sys_alloc(mstate m, size_t nb) ...@@ -3530,7 +3530,7 @@ sys_alloc(mstate m, size_t nb)
} }
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; size_t req = nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT + SIZE_T_ONE;
size_t rsize = granularity_align(req); size_t rsize = granularity_align(req);
if (rsize > nb) { /* Fail if wraps around zero */ if (rsize > nb) { /* Fail if wraps around zero */
char *mp = (char *) (CALL_MMAP(rsize)); char *mp = (char *) (CALL_MMAP(rsize));
...@@ -3543,7 +3543,9 @@ sys_alloc(mstate m, size_t nb) ...@@ -3543,7 +3543,9 @@ sys_alloc(mstate m, size_t nb)
} }
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); size_t asize =
granularity_align(nb + TOP_FOOT_SIZE + MALLOC_ALIGNMENT +
SIZE_T_ONE);
if (asize < HALF_MAX_SIZE_T) { if (asize < HALF_MAX_SIZE_T) {
char *br = CMFAIL; char *br = CMFAIL;
char *end = CMFAIL; char *end = CMFAIL;
...@@ -3679,8 +3681,7 @@ sys_trim(mstate m, size_t pad) ...@@ -3679,8 +3681,7 @@ sys_trim(mstate m, size_t pad)
if (m->topsize > pad) { if (m->topsize > pad) {
/* Shrink top space in granularity-size units, keeping at least one */ /* Shrink top space in granularity-size units, keeping at least one */
size_t unit = mparams.granularity; size_t unit = mparams.granularity;
size_t extra = size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
SIZE_T_ONE) * unit; SIZE_T_ONE) * unit;
msegmentptr sp = segment_holding(m, (char *) m->top); msegmentptr sp = segment_holding(m, (char *) m->top);
...@@ -3689,10 +3690,10 @@ sys_trim(mstate m, size_t pad) ...@@ -3689,10 +3690,10 @@ sys_trim(mstate m, size_t pad)
if (HAVE_MMAP && sp->size >= extra && !has_segment_link(m, sp)) { /* can't shrink if pinned */ if (HAVE_MMAP && sp->size >= extra && !has_segment_link(m, sp)) { /* can't shrink if pinned */
size_t newsize = sp->size - extra; size_t newsize = sp->size - extra;
/* Prefer mremap, fall back to munmap */ /* Prefer mremap, fall back to munmap */
if ((CALL_MREMAP if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) !=
(sp->base, sp->size, newsize, 0) != MFAIL) MFAIL)
|| (CALL_MUNMAP(sp->base + newsize, extra) || (CALL_MUNMAP(sp->base + newsize, extra) ==
== 0)) { 0)) {
released = extra; released = extra;
} }
} }
...@@ -3962,11 +3963,10 @@ internal_memalign(mstate m, size_t alignment, size_t bytes) ...@@ -3962,11 +3963,10 @@ internal_memalign(mstate m, size_t alignment, size_t bytes)
We've allocated enough total room so that this is always We've allocated enough total room so that this is always
possible. possible.
*/ */
char *br = (char *) char *br = (char *) mem2chunk((size_t) (((size_t) (mem +
mem2chunk((size_t) alignment -
(((size_t) SIZE_T_ONE))
(mem + alignment - & -alignment));
SIZE_T_ONE)) & -alignment));
char *pos = char *pos =
((size_t) (br - (char *) (p)) >= ((size_t) (br - (char *) (p)) >=
MIN_CHUNK_SIZE) ? br : br + alignment; MIN_CHUNK_SIZE) ? br : br + alignment;
...@@ -5234,4 +5234,5 @@ History: ...@@ -5234,4 +5234,5 @@ History:
*/ */
#endif /* !HAVE_MALLOC */ #endif /* !HAVE_MALLOC */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment