diff options
author | otto <> | 2008-11-06 12:32:45 +0000 |
---|---|---|
committer | otto <> | 2008-11-06 12:32:45 +0000 |
commit | 364cbab96ffd1db4271cef83317f82738999d996 (patch) | |
tree | 7b4dcd05bf2af16da3c19d9159aa3ada4bea1306 /src | |
parent | 91cc79d3f89399fd4baa2d673b4694e85a629eb5 (diff) | |
download | openbsd-364cbab96ffd1db4271cef83317f82738999d996.tar.gz openbsd-364cbab96ffd1db4271cef83317f82738999d996.tar.bz2 openbsd-364cbab96ffd1db4271cef83317f82738999d996.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')
-rw-r--r-- | src/lib/libc/stdlib/malloc.c | 16 |
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) { |