Free the original pointer if `realloc` failed.

The POSIX `realloc` keep the original pointer untouched, so it can
easily leads to memory leakage. `mrb_realloc()` should handle those
bookkeeping, while `mrb_realloc_simple()` keeps the original `realloc`
behavior.
parent 95360a17
...@@ -225,15 +225,10 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len) ...@@ -225,15 +225,10 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len)
p2 = mrb_realloc_simple(mrb, p, len); p2 = mrb_realloc_simple(mrb, p, len);
if (len == 0) return p2; if (len == 0) return p2;
if (p2 == NULL) { if (p2 == NULL) {
if (mrb->gc.out_of_memory) { mrb_free(mrb, p);
mrb_raise_nomemory(mrb);
/* mrb_panic(mrb); */
}
else {
mrb->gc.out_of_memory = TRUE; mrb->gc.out_of_memory = TRUE;
mrb_raise_nomemory(mrb); mrb_raise_nomemory(mrb);
} }
}
else { else {
mrb->gc.out_of_memory = FALSE; mrb->gc.out_of_memory = FALSE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment