summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorotto <>2023-02-27 06:47:54 +0000
committerotto <>2023-02-27 06:47:54 +0000
commit31981a76b5fce310c7e0a65e2bb3c7e933121cfd (patch)
tree1991b460a46413f18aaa2bd78b77f94775be8eef
parent805a22b16d53fd845fd8f4f6f6f1496c4c62bb7e (diff)
downloadopenbsd-31981a76b5fce310c7e0a65e2bb3c7e933121cfd.tar.gz
openbsd-31981a76b5fce310c7e0a65e2bb3c7e933121cfd.tar.bz2
openbsd-31981a76b5fce310c7e0a65e2bb3c7e933121cfd.zip
There is no reason to-be-cleared chunks cannot participate in delayed
freeing; ok tb@
-rw-r--r--src/lib/libc/stdlib/malloc.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 99249b24cb..6167145669 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.276 2022/12/27 17:31:09 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.277 2023/02/27 06:47:54 otto Exp $ */
2/* 2/*
3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> 4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org>
@@ -1515,42 +1515,38 @@ ofree(struct dir_info **argpool, void *p, int clear, int check, size_t argsz)
1515 unmap(pool, p, PAGEROUND(sz), clear ? argsz : 0); 1515 unmap(pool, p, PAGEROUND(sz), clear ? argsz : 0);
1516 delete(pool, r); 1516 delete(pool, r);
1517 } else { 1517 } else {
1518 void *tmp;
1519 u_int i;
1520
1518 /* Validate and optionally canary check */ 1521 /* Validate and optionally canary check */
1519 struct chunk_info *info = (struct chunk_info *)r->size; 1522 struct chunk_info *info = (struct chunk_info *)r->size;
1520 if (info->size != sz) 1523 if (info->size != sz)
1521 wrterror(pool, "internal struct corrupt"); 1524 wrterror(pool, "internal struct corrupt");
1522 find_chunknum(pool, info, p, mopts.chunk_canaries); 1525 find_chunknum(pool, info, p, mopts.chunk_canaries);
1523 if (!clear) { 1526
1524 void *tmp; 1527 if (mopts.malloc_freecheck) {
1525 int i; 1528 for (i = 0; i <= MALLOC_DELAYED_CHUNK_MASK; i++)
1526 1529 if (p == pool->delayed_chunks[i])
1527 if (mopts.malloc_freecheck) { 1530 wrterror(pool,
1528 for (i = 0; i <= MALLOC_DELAYED_CHUNK_MASK; i++) 1531 "double free %p", p);
1529 if (p == pool->delayed_chunks[i])
1530 wrterror(pool,
1531 "double free %p", p);
1532 }
1533 junk_free(pool->malloc_junk, p, sz);
1534 i = getrbyte(pool) & MALLOC_DELAYED_CHUNK_MASK;
1535 tmp = p;
1536 p = pool->delayed_chunks[i];
1537 if (tmp == p)
1538 wrterror(pool, "double free %p", tmp);
1539 pool->delayed_chunks[i] = tmp;
1540 if (p != NULL) {
1541 r = find(pool, p);
1542 REALSIZE(sz, r);
1543 if (r != NULL)
1544 validate_junk(pool, p, sz);
1545 }
1546 } else if (argsz > 0) {
1547 r = find(pool, p);
1548 explicit_bzero(p, argsz);
1549 } 1532 }
1533 if (clear && argsz > 0)
1534 explicit_bzero(p, argsz);
1535 junk_free(pool->malloc_junk, p, sz);
1536
1537 i = getrbyte(pool) & MALLOC_DELAYED_CHUNK_MASK;
1538 tmp = p;
1539 p = pool->delayed_chunks[i];
1540 if (tmp == p)
1541 wrterror(pool, "double free %p", p);
1542 pool->delayed_chunks[i] = tmp;
1550 if (p != NULL) { 1543 if (p != NULL) {
1544 r = find(pool, p);
1551 if (r == NULL) 1545 if (r == NULL)
1552 wrterror(pool, 1546 wrterror(pool,
1553 "bogus pointer (double free?) %p", p); 1547 "bogus pointer (double free?) %p", p);
1548 REALSIZE(sz, r);
1549 validate_junk(pool, p, sz);
1554 free_bytes(pool, r, p); 1550 free_bytes(pool, r, p);
1555 } 1551 }
1556 } 1552 }