summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index c69ec8316a..b14c747652 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.147 2012/09/13 10:45:41 pirofti Exp $ */ 1/* $OpenBSD: malloc.c,v 1.148 2012/11/02 18:18:15 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
4 * 4 *
@@ -165,7 +165,8 @@ struct chunk_info {
165struct malloc_readonly { 165struct malloc_readonly {
166 struct dir_info *g_pool; /* Main bookkeeping information */ 166 struct dir_info *g_pool; /* Main bookkeeping information */
167 int malloc_abort; /* abort() on error */ 167 int malloc_abort; /* abort() on error */
168 int malloc_freeprot; /* mprotect free pages PROT_NONE? */ 168 int malloc_freenow; /* Free quickly - disable chunk rnd */
169 int malloc_freeunmap; /* mprotect free pages PROT_NONE? */
169 int malloc_hint; /* call madvice on free pages? */ 170 int malloc_hint; /* call madvice on free pages? */
170 int malloc_junk; /* junk fill? */ 171 int malloc_junk; /* junk fill? */
171 int malloc_move; /* move allocations to end of page? */ 172 int malloc_move; /* move allocations to end of page? */
@@ -344,7 +345,7 @@ unmap(struct dir_info *d, void *p, size_t sz)
344 if (r->p == NULL) { 345 if (r->p == NULL) {
345 if (mopts.malloc_hint) 346 if (mopts.malloc_hint)
346 madvise(p, sz, MADV_FREE); 347 madvise(p, sz, MADV_FREE);
347 if (mopts.malloc_freeprot) 348 if (mopts.malloc_freeunmap)
348 mprotect(p, sz, PROT_NONE); 349 mprotect(p, sz, PROT_NONE);
349 r->p = p; 350 r->p = p;
350 r->size = psz; 351 r->size = psz;
@@ -407,7 +408,7 @@ map(struct dir_info *d, size_t sz, int zero_fill)
407 if (r->p != NULL) { 408 if (r->p != NULL) {
408 if (r->size == psz) { 409 if (r->size == psz) {
409 p = r->p; 410 p = r->p;
410 if (mopts.malloc_freeprot) 411 if (mopts.malloc_freeunmap)
411 mprotect(p, sz, PROT_READ | PROT_WRITE); 412 mprotect(p, sz, PROT_READ | PROT_WRITE);
412 if (mopts.malloc_hint) 413 if (mopts.malloc_hint)
413 madvise(p, sz, MADV_NORMAL); 414 madvise(p, sz, MADV_NORMAL);
@@ -417,7 +418,7 @@ map(struct dir_info *d, size_t sz, int zero_fill)
417 if (zero_fill) 418 if (zero_fill)
418 memset(p, 0, sz); 419 memset(p, 0, sz);
419 else if (mopts.malloc_junk && 420 else if (mopts.malloc_junk &&
420 mopts.malloc_freeprot) 421 mopts.malloc_freeunmap)
421 memset(p, SOME_FREEJUNK, sz); 422 memset(p, SOME_FREEJUNK, sz);
422 return p; 423 return p;
423 } else if (r->size > psz) 424 } else if (r->size > psz)
@@ -427,7 +428,7 @@ map(struct dir_info *d, size_t sz, int zero_fill)
427 if (big != NULL) { 428 if (big != NULL) {
428 r = big; 429 r = big;
429 p = (char *)r->p + ((r->size - psz) << MALLOC_PAGESHIFT); 430 p = (char *)r->p + ((r->size - psz) << MALLOC_PAGESHIFT);
430 if (mopts.malloc_freeprot) 431 if (mopts.malloc_freeunmap)
431 mprotect(p, sz, PROT_READ | PROT_WRITE); 432 mprotect(p, sz, PROT_READ | PROT_WRITE);
432 if (mopts.malloc_hint) 433 if (mopts.malloc_hint)
433 madvise(p, sz, MADV_NORMAL); 434 madvise(p, sz, MADV_NORMAL);
@@ -435,7 +436,7 @@ map(struct dir_info *d, size_t sz, int zero_fill)
435 d->free_regions_size -= psz; 436 d->free_regions_size -= psz;
436 if (zero_fill) 437 if (zero_fill)
437 memset(p, 0, sz); 438 memset(p, 0, sz);
438 else if (mopts.malloc_junk && mopts.malloc_freeprot) 439 else if (mopts.malloc_junk && mopts.malloc_freeunmap)
439 memset(p, SOME_FREEJUNK, sz); 440 memset(p, SOME_FREEJUNK, sz);
440 return p; 441 return p;
441 } 442 }
@@ -515,10 +516,12 @@ omalloc_init(struct dir_info **dp)
515 break; 516 break;
516#endif /* MALLOC_STATS */ 517#endif /* MALLOC_STATS */
517 case 'f': 518 case 'f':
518 mopts.malloc_freeprot = 0; 519 mopts.malloc_freenow = 0;
520 mopts.malloc_freeunmap = 0;
519 break; 521 break;
520 case 'F': 522 case 'F':
521 mopts.malloc_freeprot = 1; 523 mopts.malloc_freenow = 1;
524 mopts.malloc_freeunmap = 1;
522 break; 525 break;
523 case 'g': 526 case 'g':
524 mopts.malloc_guard = 0; 527 mopts.malloc_guard = 0;
@@ -554,15 +557,21 @@ omalloc_init(struct dir_info **dp)
554 mopts.malloc_realloc = 1; 557 mopts.malloc_realloc = 1;
555 break; 558 break;
556 case 's': 559 case 's':
557 mopts.malloc_freeprot = mopts.malloc_junk = 0; 560 mopts.malloc_freeunmap = mopts.malloc_junk = 0;
558 mopts.malloc_guard = 0; 561 mopts.malloc_guard = 0;
559 mopts.malloc_cache = MALLOC_DEFAULT_CACHE; 562 mopts.malloc_cache = MALLOC_DEFAULT_CACHE;
560 break; 563 break;
561 case 'S': 564 case 'S':
562 mopts.malloc_freeprot = mopts.malloc_junk = 1; 565 mopts.malloc_freeunmap = mopts.malloc_junk = 1;
563 mopts.malloc_guard = MALLOC_PAGESIZE; 566 mopts.malloc_guard = MALLOC_PAGESIZE;
564 mopts.malloc_cache = 0; 567 mopts.malloc_cache = 0;
565 break; 568 break;
569 case 'u':
570 mopts.malloc_freeunmap = 0;
571 break;
572 case 'U':
573 mopts.malloc_freeunmap = 1;
574 break;
566 case 'x': 575 case 'x':
567 mopts.malloc_xmalloc = 0; 576 mopts.malloc_xmalloc = 0;
568 break; 577 break;
@@ -1015,7 +1024,7 @@ free_bytes(struct dir_info *d, struct region_info *r, void *ptr)
1015 1024
1016 LIST_REMOVE(info, entries); 1025 LIST_REMOVE(info, entries);
1017 1026
1018 if (info->size == 0 && !mopts.malloc_freeprot) 1027 if (info->size == 0 && !mopts.malloc_freeunmap)
1019 mprotect(info->page, MALLOC_PAGESIZE, PROT_READ | PROT_WRITE); 1028 mprotect(info->page, MALLOC_PAGESIZE, PROT_READ | PROT_WRITE);
1020 unmap(d, info->page, MALLOC_PAGESIZE); 1029 unmap(d, info->page, MALLOC_PAGESIZE);
1021 1030
@@ -1184,7 +1193,7 @@ ofree(void *p)
1184 if (mopts.malloc_guard) { 1193 if (mopts.malloc_guard) {
1185 if (sz < mopts.malloc_guard) 1194 if (sz < mopts.malloc_guard)
1186 wrterror("guard size", NULL); 1195 wrterror("guard size", NULL);
1187 if (!mopts.malloc_freeprot) { 1196 if (!mopts.malloc_freeunmap) {
1188 if (mprotect((char *)p + PAGEROUND(sz) - 1197 if (mprotect((char *)p + PAGEROUND(sz) -
1189 mopts.malloc_guard, mopts.malloc_guard, 1198 mopts.malloc_guard, mopts.malloc_guard,
1190 PROT_READ | PROT_WRITE)) 1199 PROT_READ | PROT_WRITE))
@@ -1192,7 +1201,7 @@ ofree(void *p)
1192 } 1201 }
1193 malloc_guarded -= mopts.malloc_guard; 1202 malloc_guarded -= mopts.malloc_guard;
1194 } 1203 }
1195 if (mopts.malloc_junk && !mopts.malloc_freeprot) 1204 if (mopts.malloc_junk && !mopts.malloc_freeunmap)
1196 memset(p, SOME_FREEJUNK, 1205 memset(p, SOME_FREEJUNK,
1197 PAGEROUND(sz) - mopts.malloc_guard); 1206 PAGEROUND(sz) - mopts.malloc_guard);
1198 unmap(g_pool, p, PAGEROUND(sz)); 1207 unmap(g_pool, p, PAGEROUND(sz));
@@ -1203,7 +1212,7 @@ ofree(void *p)
1203 1212
1204 if (mopts.malloc_junk && sz > 0) 1213 if (mopts.malloc_junk && sz > 0)
1205 memset(p, SOME_FREEJUNK, sz); 1214 memset(p, SOME_FREEJUNK, sz);
1206 if (!mopts.malloc_freeprot) { 1215 if (!mopts.malloc_freenow) {
1207 i = getrnibble(); 1216 i = getrnibble();
1208 tmp = p; 1217 tmp = p;
1209 p = g_pool->delayed_chunks[i]; 1218 p = g_pool->delayed_chunks[i];