summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/stdlib/malloc.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 4a38c53bbd..b858bbb739 100644
--- a/src/lib/libc/stdlib/malloc.c
+++ b/src/lib/libc/stdlib/malloc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: malloc.c,v 1.81 2006/04/18 18:26:13 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.82 2006/04/24 19:23:42 otto Exp $ */
2 2
3/* 3/*
4 * ---------------------------------------------------------------------------- 4 * ----------------------------------------------------------------------------
@@ -487,14 +487,16 @@ map_pages(size_t pages)
487 u_long idx, pidx, lidx; 487 u_long idx, pidx, lidx;
488 caddr_t result, tail; 488 caddr_t result, tail;
489 u_long index, lindex; 489 u_long index, lindex;
490 void *pdregion = NULL;
491 size_t dirs, cnt;
490 492
491 pages <<= malloc_pageshift; 493 pages <<= malloc_pageshift;
492 result = MMAP(pages + malloc_guard); 494 result = MMAP(pages + malloc_guard);
493 if (result == MAP_FAILED) { 495 if (result == MAP_FAILED) {
494 errno = ENOMEM;
495#ifdef MALLOC_EXTRA_SANITY 496#ifdef MALLOC_EXTRA_SANITY
496 wrtwarning("(ES): map_pages fails"); 497 wrtwarning("(ES): map_pages fails");
497#endif /* MALLOC_EXTRA_SANITY */ 498#endif /* MALLOC_EXTRA_SANITY */
499 errno = ENOMEM;
498 return (NULL); 500 return (NULL);
499 } 501 }
500 index = ptr2index(result); 502 index = ptr2index(result);
@@ -510,19 +512,31 @@ map_pages(size_t pages)
510 malloc_brk = tail; 512 malloc_brk = tail;
511 last_index = lindex; 513 last_index = lindex;
512 } 514 }
515
516 dirs = lidx - pidx;
517
513 /* Insert directory pages, if needed. */ 518 /* Insert directory pages, if needed. */
514 pdir_lookup(index, &pi); 519 if (pdir_lookup(index, &pi) != 0)
520 dirs++;
521
522 if (dirs > 0) {
523 pdregion = MMAP(malloc_pagesize * dirs);
524 if (pdregion == MAP_FAILED) {
525 munmap(result, tail - result);
526#ifdef MALLOC_EXTRA_SANITY
527 wrtwarning("(ES): map_pages fails");
528#endif
529 errno = ENOMEM;
530 return (NULL);
531 }
532 }
515 533
534 cnt = 0;
516 for (idx = pidx, spi = pi; idx <= lidx; idx++) { 535 for (idx = pidx, spi = pi; idx <= lidx; idx++) {
517 if (pi == NULL || PD_IDX(pi->dirnum) != idx) { 536 if (pi == NULL || PD_IDX(pi->dirnum) != idx) {
518 if ((pd = MMAP(malloc_pagesize)) == MAP_FAILED) { 537 pd = (struct pginfo **)((char *)pdregion +
519 errno = ENOMEM; /* XXX */ 538 cnt * malloc_pagesize);
520 munmap(result, (size_t)(tail - result)); 539 cnt++;
521#ifdef MALLOC_EXTRA_SANITY
522 wrtwarning("(ES): map_pages fails");
523#endif /* MALLOC_EXTRA_SANITY */
524 return (NULL);
525 }
526 memset(pd, 0, malloc_pagesize); 540 memset(pd, 0, malloc_pagesize);
527 pi = (struct pdinfo *) ((caddr_t) pd + pdi_off); 541 pi = (struct pdinfo *) ((caddr_t) pd + pdi_off);
528 pi->base = pd; 542 pi->base = pd;
@@ -561,6 +575,13 @@ map_pages(size_t pages)
561 spi = pi; 575 spi = pi;
562 pi = spi->next; 576 pi = spi->next;
563 } 577 }
578#ifdef MALLOC_EXTRA_SANITY
579 if (cnt > dirs)
580 wrtwarning("(ES): cnt > dirs");
581#endif /* MALLOC_EXTRA_SANITY */
582 if (cnt < dirs)
583 munmap((char *)pdregion + cnt * malloc_pagesize,
584 (dirs - cnt) * malloc_pagesize);
564 585
565 return (result); 586 return (result);
566} 587}