diff options
author | Evan Huus <eapache@gmail.com> | 2013-09-01 13:07:22 +0000 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2013-09-01 13:07:22 +0000 |
commit | d939a6dec0759ff9cc2751df15a89b3fabc40932 (patch) | |
tree | 7c8a452be4d7aee9546cbb193b9a333b3a46a8ff /epan/wmem | |
parent | e597acdc4827ef62bc9597fdd248366411533a36 (diff) |
Do our list manipulation entirely after the realloc, so that if the realloc
doesn't return (do to, for example, throwing an exception) the allocator is
left in a consistent state.
svn path=/trunk/; revision=51626
Diffstat (limited to 'epan/wmem')
-rw-r--r-- | epan/wmem/wmem_allocator_block.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/epan/wmem/wmem_allocator_block.c b/epan/wmem/wmem_allocator_block.c index c4f0871468..74f4d943a0 100644 --- a/epan/wmem/wmem_allocator_block.c +++ b/epan/wmem/wmem_allocator_block.c @@ -846,13 +846,20 @@ wmem_block_realloc_jumbo(wmem_block_allocator_t *allocator, block = WMEM_CHUNK_TO_BLOCK(chunk); - wmem_block_remove_from_block_list(allocator, block); - block = (wmem_block_hdr_t *) g_realloc(block, size + WMEM_BLOCK_HEADER_SIZE + WMEM_CHUNK_HEADER_SIZE); - wmem_block_add_to_block_list(allocator, block); + if (block->next) { + block->next->prev = block; + } + + if (block->prev) { + block->prev->next = block; + } + else { + allocator->block_list = block; + } return WMEM_CHUNK_TO_DATA(WMEM_BLOCK_TO_CHUNK(block)); } |