diff options
| author | otto <> | 2008-08-22 21:25:10 +0000 |
|---|---|---|
| committer | otto <> | 2008-08-22 21:25:10 +0000 |
| commit | f77577b586a3b656d0d3fd7cd01ec0fa114cd116 (patch) | |
| tree | aafe58421a299687392de0a5e42d7981053ad583 /src/lib/libc/stdlib | |
| parent | e6c446cc76e761b92735aca89f612db2ed9a52d2 (diff) | |
| download | openbsd-f77577b586a3b656d0d3fd7cd01ec0fa114cd116.tar.gz openbsd-f77577b586a3b656d0d3fd7cd01ec0fa114cd116.tar.bz2 openbsd-f77577b586a3b656d0d3fd7cd01ec0fa114cd116.zip | |
make sure we always map and unmap multiples of MALLOC_PAGESIZE;
case spotted by beck, one by me; ok deraadt@ beck@
Diffstat (limited to 'src/lib/libc/stdlib')
| -rw-r--r-- | src/lib/libc/stdlib/malloc.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index d03b831514..4379e09157 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.94 2008/08/22 17:14:57 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.95 2008/08/22 21:25:10 otto Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> |
| 4 | * | 4 | * |
| @@ -382,11 +382,16 @@ wrtwarning(char *p) | |||
| 382 | static void | 382 | static void |
| 383 | unmap(struct dir_info *d, void *p, size_t sz) | 383 | unmap(struct dir_info *d, void *p, size_t sz) |
| 384 | { | 384 | { |
| 385 | size_t psz = PAGEROUND(sz) >> MALLOC_PAGESHIFT; | 385 | size_t psz = sz >> MALLOC_PAGESHIFT; |
| 386 | size_t rsz, tounmap; | 386 | size_t rsz, tounmap; |
| 387 | struct region_info *r; | 387 | struct region_info *r; |
| 388 | u_int i, offset; | 388 | u_int i, offset; |
| 389 | 389 | ||
| 390 | if (sz != PAGEROUND(sz)) { | ||
| 391 | wrterror("munmap round"); | ||
| 392 | return; | ||
| 393 | } | ||
| 394 | |||
| 390 | if (psz > malloc_cache) { | 395 | if (psz > malloc_cache) { |
| 391 | if (munmap(p, sz)) | 396 | if (munmap(p, sz)) |
| 392 | wrterror("munmap"); | 397 | wrterror("munmap"); |
| @@ -445,11 +450,15 @@ unmap(struct dir_info *d, void *p, size_t sz) | |||
| 445 | static void * | 450 | static void * |
| 446 | map(struct dir_info *d, size_t sz, int zero_fill) | 451 | map(struct dir_info *d, size_t sz, int zero_fill) |
| 447 | { | 452 | { |
| 448 | size_t psz = PAGEROUND(sz) >> MALLOC_PAGESHIFT; | 453 | size_t psz = sz >> MALLOC_PAGESHIFT; |
| 449 | struct region_info *r, *big = NULL; | 454 | struct region_info *r, *big = NULL; |
| 450 | u_int i, offset; | 455 | u_int i, offset; |
| 451 | void *p; | 456 | void *p; |
| 452 | 457 | ||
| 458 | if (sz != PAGEROUND(sz)) { | ||
| 459 | wrterror("map round"); | ||
| 460 | return NULL; | ||
| 461 | } | ||
| 453 | if (psz > d->free_regions_size) { | 462 | if (psz > d->free_regions_size) { |
| 454 | p = MMAP(sz); | 463 | p = MMAP(sz); |
| 455 | if (p != MAP_FAILED) | 464 | if (p != MAP_FAILED) |
| @@ -1065,7 +1074,7 @@ omalloc(size_t sz, int zero_fill) | |||
| 1065 | return NULL; | 1074 | return NULL; |
| 1066 | } | 1075 | } |
| 1067 | if (insert(&g_pool, p, sz)) { | 1076 | if (insert(&g_pool, p, sz)) { |
| 1068 | unmap(&g_pool, p, sz); | 1077 | unmap(&g_pool, p, psz); |
| 1069 | errno = ENOMEM; | 1078 | errno = ENOMEM; |
| 1070 | return NULL; | 1079 | return NULL; |
| 1071 | } | 1080 | } |
| @@ -1181,7 +1190,7 @@ ofree(void *p) | |||
| 1181 | } | 1190 | } |
| 1182 | if (malloc_junk) | 1191 | if (malloc_junk) |
| 1183 | memset(p, SOME_FREEJUNK, PAGEROUND(sz) - malloc_guard); | 1192 | memset(p, SOME_FREEJUNK, PAGEROUND(sz) - malloc_guard); |
| 1184 | unmap(&g_pool, p, sz); | 1193 | unmap(&g_pool, p, PAGEROUND(sz)); |
| 1185 | delete(&g_pool, r); | 1194 | delete(&g_pool, r); |
| 1186 | } else { | 1195 | } else { |
| 1187 | void *tmp; | 1196 | void *tmp; |
