Merge pull request #19 from cfallin/upb-seededalloc-fix

Bugfix: seeded_alloc() should not realloc() user-provided memory.
pull/13171/head
Joshua Haberman 10 years ago
commit 93791bfe65
  1. 11
      upb/env.c

@ -211,6 +211,8 @@ static size_t align_up(size_t size) {
UPB_FORCEINLINE static void *seeded_alloc(void *ud, void *ptr, size_t oldsize, UPB_FORCEINLINE static void *seeded_alloc(void *ud, void *ptr, size_t oldsize,
size_t size) { size_t size) {
UPB_UNUSED(ptr);
upb_seededalloc *a = ud; upb_seededalloc *a = ud;
size = align_up(size); size = align_up(size);
@ -224,7 +226,14 @@ UPB_FORCEINLINE static void *seeded_alloc(void *ud, void *ptr, size_t oldsize,
} else { } else {
// Slow path: fallback to other allocator. // Slow path: fallback to other allocator.
a->need_cleanup = true; a->need_cleanup = true;
return a->alloc(a->alloc_ud, ptr, oldsize, size); // Is `ptr` part of the user-provided initial block? Don't pass it to the
// default allocator if so; otherwise, it may try to realloc() the block.
char *chptr = ptr;
if (chptr >= a->mem_base && chptr < a->mem_limit) {
return a->alloc(a->alloc_ud, NULL, 0, size);
} else {
return a->alloc(a->alloc_ud, ptr, oldsize, size);
}
} }
} }

Loading…
Cancel
Save