summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 316ae4f484..c4196c74ed 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.284 2023/05/27 04:33:00 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.285 2023/06/04 06:58:33 otto 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>
@@ -977,6 +977,10 @@ omalloc_make_chunks(struct dir_info *d, u_int bucket, u_int listnum)
977 NULL)) 977 NULL))
978 goto err; 978 goto err;
979 LIST_INSERT_HEAD(&d->chunk_dir[bucket][listnum], bp, entries); 979 LIST_INSERT_HEAD(&d->chunk_dir[bucket][listnum], bp, entries);
980
981 if (bucket > 0 && d->malloc_junk != 0)
982 memset(pp, SOME_FREEJUNK, MALLOC_PAGESIZE);
983
980 return bp; 984 return bp;
981 985
982err: 986err:
@@ -1113,9 +1117,8 @@ found:
1113 1117
1114 p = (char *)bp->page + k; 1118 p = (char *)bp->page + k;
1115 if (bp->bucket > 0) { 1119 if (bp->bucket > 0) {
1116 if (d->malloc_junk == 2) 1120 validate_junk(d, p, B2SIZE(bp->bucket));
1117 memset(p, SOME_JUNK, B2SIZE(bp->bucket)); 1121 if (mopts.chunk_canaries)
1118 else if (mopts.chunk_canaries)
1119 fill_canary(p, size, B2SIZE(bp->bucket)); 1122 fill_canary(p, size, B2SIZE(bp->bucket));
1120 } 1123 }
1121 return p; 1124 return p;
@@ -1134,7 +1137,7 @@ validate_canary(struct dir_info *d, u_char *ptr, size_t sz, size_t allocated)
1134 1137
1135 while (p < q) { 1138 while (p < q) {
1136 if (*p != (u_char)mopts.chunk_canaries && *p != SOME_JUNK) { 1139 if (*p != (u_char)mopts.chunk_canaries && *p != SOME_JUNK) {
1137 wrterror(d, "chunk canary corrupted %p %#tx@%#zx%s", 1140 wrterror(d, "canary corrupted %p %#tx@%#zx%s",
1138 ptr, p - ptr, sz, 1141 ptr, p - ptr, sz,
1139 *p == SOME_FREEJUNK ? " (double free?)" : ""); 1142 *p == SOME_FREEJUNK ? " (double free?)" : "");
1140 } 1143 }
@@ -1157,7 +1160,7 @@ find_chunknum(struct dir_info *d, struct chunk_info *info, void *ptr, int check)
1157 wrterror(d, "modified chunk-pointer %p", ptr); 1160 wrterror(d, "modified chunk-pointer %p", ptr);
1158 if (info->bits[chunknum / MALLOC_BITS] & 1161 if (info->bits[chunknum / MALLOC_BITS] &
1159 (1U << (chunknum % MALLOC_BITS))) 1162 (1U << (chunknum % MALLOC_BITS)))
1160 wrterror(d, "chunk is already free %p", ptr); 1163 wrterror(d, "double free %p", ptr);
1161 if (check && info->bucket > 0) { 1164 if (check && info->bucket > 0) {
1162 validate_canary(d, ptr, info->bits[info->offset + chunknum], 1165 validate_canary(d, ptr, info->bits[info->offset + chunknum],
1163 B2SIZE(info->bucket)); 1166 B2SIZE(info->bucket));
@@ -1924,13 +1927,22 @@ orecallocarray(struct dir_info **argpool, void *p, size_t oldsize,
1924 uint32_t chunknum = find_chunknum(pool, info, p, 0); 1927 uint32_t chunknum = find_chunknum(pool, info, p, 0);
1925 1928
1926 if (info->bits[info->offset + chunknum] != oldsize) 1929 if (info->bits[info->offset + chunknum] != oldsize)
1927 wrterror(pool, "recorded old size %hu != %zu", 1930 wrterror(pool, "recorded size %hu != %zu",
1928 info->bits[info->offset + chunknum], 1931 info->bits[info->offset + chunknum],
1929 oldsize); 1932 oldsize);
1933 } else {
1934 if (sz < oldsize)
1935 wrterror(pool, "chunk size %zu < %zu",
1936 sz, oldsize);
1930 } 1937 }
1931 } else if (oldsize < (sz - mopts.malloc_guard) / 2) 1938 } else {
1932 wrterror(pool, "recorded old size %zu != %zu", 1939 if (sz - mopts.malloc_guard < oldsize)
1933 sz - mopts.malloc_guard, oldsize); 1940 wrterror(pool, "recorded size %zu < %zu",
1941 sz - mopts.malloc_guard, oldsize);
1942 if (oldsize < (sz - mopts.malloc_guard) / 2)
1943 wrterror(pool, "recorded size %zu inconsistent with %zu",
1944 sz - mopts.malloc_guard, oldsize);
1945 }
1934 1946
1935 newptr = omalloc(pool, newsize, 0, f); 1947 newptr = omalloc(pool, newsize, 0, f);
1936 if (newptr == NULL) 1948 if (newptr == NULL)