mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Fix NULL pointer dereference mrb->nomem_err when not initialized
Add internal functions (not `static`): * `mrb_raise_nomemory()` * `mrb_core_init_abort()`
This commit is contained in:
+29
-5
@@ -240,6 +240,16 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc)
|
||||
}
|
||||
}
|
||||
|
||||
static mrb_noreturn void
|
||||
exc_throw(mrb_state *mrb, mrb_value exc)
|
||||
{
|
||||
if (!mrb->jmp) {
|
||||
mrb_p(mrb, exc);
|
||||
abort();
|
||||
}
|
||||
MRB_THROW(mrb->jmp);
|
||||
}
|
||||
|
||||
MRB_API mrb_noreturn void
|
||||
mrb_exc_raise(mrb_state *mrb, mrb_value exc)
|
||||
{
|
||||
@@ -247,11 +257,7 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc)
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
|
||||
}
|
||||
mrb_exc_set(mrb, exc);
|
||||
if (!mrb->jmp) {
|
||||
mrb_p(mrb, exc);
|
||||
abort();
|
||||
}
|
||||
MRB_THROW(mrb->jmp);
|
||||
exc_throw(mrb, exc);
|
||||
}
|
||||
|
||||
MRB_API mrb_noreturn void
|
||||
@@ -483,6 +489,24 @@ mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt,
|
||||
mrb_exc_raise(mrb, exc);
|
||||
}
|
||||
|
||||
mrb_noreturn void
|
||||
mrb_core_init_abort(mrb_state *mrb)
|
||||
{
|
||||
mrb->exc = NULL;
|
||||
exc_throw(mrb, mrb_nil_value());
|
||||
}
|
||||
|
||||
mrb_noreturn void
|
||||
mrb_raise_nomemory(mrb_state *mrb)
|
||||
{
|
||||
if (mrb->nomem_err) {
|
||||
mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
|
||||
}
|
||||
else {
|
||||
mrb_core_init_abort(mrb);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
mrb_init_exception(mrb_state *mrb)
|
||||
{
|
||||
|
||||
@@ -198,6 +198,8 @@ gettimeofday_time(void)
|
||||
|
||||
#define objects(p) ((RVALUE *)p->objects)
|
||||
|
||||
mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb);
|
||||
|
||||
MRB_API void*
|
||||
mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
|
||||
{
|
||||
@@ -221,12 +223,12 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len)
|
||||
if (len == 0) return p2;
|
||||
if (p2 == NULL) {
|
||||
if (mrb->gc.out_of_memory) {
|
||||
mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
|
||||
mrb_raise_nomemory(mrb);
|
||||
/* mrb_panic(mrb); */
|
||||
}
|
||||
else {
|
||||
mrb->gc.out_of_memory = TRUE;
|
||||
mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
|
||||
mrb_raise_nomemory(mrb);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user