diff options
author | Jason Evans <jasone@canonware.com> | 2015-08-19 14:12:05 -0700 |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2015-08-19 14:16:30 -0700 |
commit | 5ef33a9f2b9f4fb56553529f7b31f4f5f57ce014 (patch) | |
tree | 0e0cabe33b3dd9e6828c4f178760e589f3ca1760 /src | |
parent | 6e98caf8f064482b9ab292ef3638dea67420bbc2 (diff) | |
download | jemalloc-5ef33a9f2b9f4fb56553529f7b31f4f5f57ce014.tar.gz |
Don't bitshift by negative amounts.
Don't bitshift by negative amounts when encoding/decoding run sizes in
chunk header maps. This affected systems with page sizes greater than 8
KiB.
Reported by Ingvar Hagelund <ingvar@redpill-linpro.com>.
Diffstat (limited to 'src')
-rw-r--r-- | src/arena.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/arena.c b/src/arena.c index af48b39..bd76e96 100644 --- a/src/arena.c +++ b/src/arena.c @@ -39,7 +39,7 @@ JEMALLOC_INLINE_C arena_chunk_map_misc_t * arena_miscelm_key_create(size_t size) { - return ((arena_chunk_map_misc_t *)((size << CHUNK_MAP_SIZE_SHIFT) | + return ((arena_chunk_map_misc_t *)(arena_mapbits_size_encode(size) | CHUNK_MAP_KEY)); } @@ -58,8 +58,7 @@ arena_miscelm_key_size_get(const arena_chunk_map_misc_t *miscelm) assert(arena_miscelm_is_key(miscelm)); - return (((uintptr_t)miscelm & CHUNK_MAP_SIZE_MASK) >> - CHUNK_MAP_SIZE_SHIFT); + return (arena_mapbits_size_decode((uintptr_t)miscelm)); } JEMALLOC_INLINE_C size_t @@ -73,7 +72,7 @@ arena_miscelm_size_get(arena_chunk_map_misc_t *miscelm) chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(miscelm); pageind = arena_miscelm_to_pageind(miscelm); mapbits = arena_mapbits_get(chunk, pageind); - return ((mapbits & CHUNK_MAP_SIZE_MASK) >> CHUNK_MAP_SIZE_SHIFT); + return (arena_mapbits_size_decode(mapbits)); } JEMALLOC_INLINE_C int |