summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib
diff options
context:
space:
mode:
authorotto <>2008-11-06 12:32:45 +0000
committerotto <>2008-11-06 12:32:45 +0000
commit9be54ce9615f90e92a7b80146f0fefbb2df280e4 (patch)
tree7b4dcd05bf2af16da3c19d9159aa3ada4bea1306 /src/lib/libc/stdlib
parentdf95d621d9d331a0ad540d255d4a529af3d8773f (diff)
downloadopenbsd-9be54ce9615f90e92a7b80146f0fefbb2df280e4.tar.gz
openbsd-9be54ce9615f90e92a7b80146f0fefbb2df280e4.tar.bz2
openbsd-9be54ce9615f90e92a7b80146f0fefbb2df280e4.zip
if the freeprot flag (F) is set, do not do delayed frees for chunks
(might catch errors closer to the trouble spot) and junk fill pages just before reuse instead of immediate (we can't access the page anyway) since we set PROT_NONE in the F case. ok djm@
Diffstat (limited to 'src/lib/libc/stdlib')
-rw-r--r--src/lib/libc/stdlib/malloc.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 0af2e2fdea..37404a199e 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.105 2008/11/02 08:50:41 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.106 2008/11/06 12:32:45 otto Exp $ */
2/* 2/*
3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
4 * 4 *
@@ -477,6 +477,8 @@ map(struct dir_info *d, size_t sz, int zero_fill)
477 d->free_regions_size -= psz; 477 d->free_regions_size -= psz;
478 if (zero_fill) 478 if (zero_fill)
479 memset(p, 0, sz); 479 memset(p, 0, sz);
480 else if (malloc_junk && malloc_freeprot)
481 memset(p, SOME_FREEJUNK, sz);
480 return p; 482 return p;
481 } else if (r->size > psz) 483 } else if (r->size > psz)
482 big = r; 484 big = r;
@@ -1199,7 +1201,7 @@ ofree(void *p)
1199 } 1201 }
1200 malloc_guarded -= malloc_guard; 1202 malloc_guarded -= malloc_guard;
1201 } 1203 }
1202 if (malloc_junk) 1204 if (malloc_junk && !malloc_freeprot)
1203 memset(p, SOME_FREEJUNK, PAGEROUND(sz) - malloc_guard); 1205 memset(p, SOME_FREEJUNK, PAGEROUND(sz) - malloc_guard);
1204 unmap(&g_pool, p, PAGEROUND(sz)); 1206 unmap(&g_pool, p, PAGEROUND(sz));
1205 delete(&g_pool, r); 1207 delete(&g_pool, r);
@@ -1209,10 +1211,12 @@ ofree(void *p)
1209 1211
1210 if (malloc_junk && sz > 0) 1212 if (malloc_junk && sz > 0)
1211 memset(p, SOME_FREEJUNK, sz); 1213 memset(p, SOME_FREEJUNK, sz);
1212 i = getrbyte() & (MALLOC_DELAYED_CHUNKS - 1); 1214 if (!malloc_freeprot) {
1213 tmp = p; 1215 i = getrbyte() & (MALLOC_DELAYED_CHUNKS - 1);
1214 p = g_pool.delayed_chunks[i]; 1216 tmp = p;
1215 g_pool.delayed_chunks[i] = tmp; 1217 p = g_pool.delayed_chunks[i];
1218 g_pool.delayed_chunks[i] = tmp;
1219 }
1216 if (p != NULL) { 1220 if (p != NULL) {
1217 r = find(&g_pool, p); 1221 r = find(&g_pool, p);
1218 if (r == NULL) { 1222 if (r == NULL) {