diff options
Diffstat (limited to 'src/lib/libc/stdlib')
| -rw-r--r-- | src/lib/libc/stdlib/malloc.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index 40c602a1ae..97d77b0a63 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.240 2018/01/18 08:37:28 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.241 2018/01/18 20:06:16 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> |
| @@ -172,7 +172,6 @@ struct chunk_info { | |||
| 172 | u_short free; /* how many free chunks */ | 172 | u_short free; /* how many free chunks */ |
| 173 | u_short total; /* how many chunks */ | 173 | u_short total; /* how many chunks */ |
| 174 | u_short offset; /* requested size table offset */ | 174 | u_short offset; /* requested size table offset */ |
| 175 | u_short rotor; /* randomization rotor */ | ||
| 176 | u_short bits[1]; /* which chunks are free */ | 175 | u_short bits[1]; /* which chunks are free */ |
| 177 | }; | 176 | }; |
| 178 | 177 | ||
| @@ -941,7 +940,7 @@ malloc_bytes(struct dir_info *d, size_t size, void *f) | |||
| 941 | 940 | ||
| 942 | j = find_chunksize(size); | 941 | j = find_chunksize(size); |
| 943 | 942 | ||
| 944 | r = getrbyte(d); | 943 | r = ((u_int)getrbyte(d) << 8) | getrbyte(d); |
| 945 | listnum = r % MALLOC_CHUNK_LISTS; | 944 | listnum = r % MALLOC_CHUNK_LISTS; |
| 946 | /* If it's empty, make a page more of that size chunks */ | 945 | /* If it's empty, make a page more of that size chunks */ |
| 947 | if ((bp = LIST_FIRST(&d->chunk_dir[j][listnum])) == NULL) { | 946 | if ((bp = LIST_FIRST(&d->chunk_dir[j][listnum])) == NULL) { |
| @@ -953,9 +952,7 @@ malloc_bytes(struct dir_info *d, size_t size, void *f) | |||
| 953 | if (bp->canary != (u_short)d->canary1) | 952 | if (bp->canary != (u_short)d->canary1) |
| 954 | wrterror(d, "chunk info corrupted"); | 953 | wrterror(d, "chunk info corrupted"); |
| 955 | 954 | ||
| 956 | if (bp->free > 1) | 955 | i = (r / MALLOC_CHUNK_LISTS) & (bp->total - 1); |
| 957 | bp->rotor += r; | ||
| 958 | i = bp->rotor++ & (bp->total - 1); | ||
| 959 | 956 | ||
| 960 | /* start somewhere in a short */ | 957 | /* start somewhere in a short */ |
| 961 | lp = &bp->bits[i / MALLOC_BITS]; | 958 | lp = &bp->bits[i / MALLOC_BITS]; |
