diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libc/stdlib/malloc.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index b5eb212227..17ba5fb127 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.295 2023/12/19 06:59:28 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.296 2024/03/30 07:50:39 miod Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2008, 2010, 2011, 2016, 2023 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008, 2010, 2011, 2016, 2023 Otto Moerbeek <otto@drijf.net> |
4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> | 4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> |
@@ -1428,7 +1428,7 @@ _malloc_init(int from_rthreads) | |||
1428 | } | 1428 | } |
1429 | if (!mopts.malloc_canary) { | 1429 | if (!mopts.malloc_canary) { |
1430 | char *p; | 1430 | char *p; |
1431 | size_t sz, d_avail; | 1431 | size_t sz, roundup_sz, d_avail; |
1432 | 1432 | ||
1433 | omalloc_init(); | 1433 | omalloc_init(); |
1434 | /* | 1434 | /* |
@@ -1436,20 +1436,20 @@ _malloc_init(int from_rthreads) | |||
1436 | * randomise offset inside the page at which the dir_infos | 1436 | * randomise offset inside the page at which the dir_infos |
1437 | * lay (subject to alignment by 1 << MALLOC_MINSHIFT) | 1437 | * lay (subject to alignment by 1 << MALLOC_MINSHIFT) |
1438 | */ | 1438 | */ |
1439 | sz = mopts.malloc_mutexes * sizeof(*d) + 2 * MALLOC_PAGESIZE; | 1439 | sz = mopts.malloc_mutexes * sizeof(*d); |
1440 | if ((p = MMAPNONE(sz, 0)) == MAP_FAILED) | 1440 | roundup_sz = (sz + MALLOC_PAGEMASK) & ~MALLOC_PAGEMASK; |
1441 | if ((p = MMAPNONE(roundup_sz + 2 * MALLOC_PAGESIZE, 0)) == | ||
1442 | MAP_FAILED) | ||
1441 | wrterror(NULL, "malloc_init mmap1 failed"); | 1443 | wrterror(NULL, "malloc_init mmap1 failed"); |
1442 | if (mprotect(p + MALLOC_PAGESIZE, mopts.malloc_mutexes * | 1444 | if (mprotect(p + MALLOC_PAGESIZE, roundup_sz, |
1443 | sizeof(*d), PROT_READ | PROT_WRITE)) | 1445 | PROT_READ | PROT_WRITE)) |
1444 | wrterror(NULL, "malloc_init mprotect1 failed"); | 1446 | wrterror(NULL, "malloc_init mprotect1 failed"); |
1445 | if (mimmutable(p, sz)) | 1447 | if (mimmutable(p, roundup_sz + 2 * MALLOC_PAGESIZE)) |
1446 | wrterror(NULL, "malloc_init mimmutable1 failed"); | 1448 | wrterror(NULL, "malloc_init mimmutable1 failed"); |
1447 | d_avail = (((mopts.malloc_mutexes * sizeof(*d) + | 1449 | d_avail = (roundup_sz - sz) >> MALLOC_MINSHIFT; |
1448 | MALLOC_PAGEMASK) & ~MALLOC_PAGEMASK) - | ||
1449 | (mopts.malloc_mutexes * sizeof(*d))) >> MALLOC_MINSHIFT; | ||
1450 | d = (struct dir_info *)(p + MALLOC_PAGESIZE + | 1450 | d = (struct dir_info *)(p + MALLOC_PAGESIZE + |
1451 | (arc4random_uniform(d_avail) << MALLOC_MINSHIFT)); | 1451 | (arc4random_uniform(d_avail) << MALLOC_MINSHIFT)); |
1452 | STATS_ADD(d[1].malloc_used, sz); | 1452 | STATS_ADD(d[1].malloc_used, roundup_sz + 2 * MALLOC_PAGESIZE); |
1453 | for (i = 0; i < mopts.malloc_mutexes; i++) | 1453 | for (i = 0; i < mopts.malloc_mutexes; i++) |
1454 | mopts.malloc_pool[i] = &d[i]; | 1454 | mopts.malloc_pool[i] = &d[i]; |
1455 | mopts.internal_funcs = 1; | 1455 | mopts.internal_funcs = 1; |