Bugfix: seeded_alloc() should not realloc() user-provided memory.

pull/13171/head
Chris Fallin 10 years ago
parent eace8e3295
commit 710111cc7c
  1. 9
      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,8 +226,15 @@ 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;
// 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); return a->alloc(a->alloc_ud, ptr, oldsize, size);
} }
}
} }
void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len) { void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len) {

Loading…
Cancel
Save