aboutsummaryrefslogtreecommitdiffstats
path: root/epan/wmem/wmem_allocator_block.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-09-01 13:07:22 +0000
committerEvan Huus <eapache@gmail.com>2013-09-01 13:07:22 +0000
commitd939a6dec0759ff9cc2751df15a89b3fabc40932 (patch)
tree7c8a452be4d7aee9546cbb193b9a333b3a46a8ff /epan/wmem/wmem_allocator_block.c
parente597acdc4827ef62bc9597fdd248366411533a36 (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/wmem_allocator_block.c')
-rw-r--r--epan/wmem/wmem_allocator_block.c13
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));
}