mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
fix null dereference (ref: #2769)
parser_state->locals might be a null pointer. Fixes (and other similiar invalid code): def a; Proc.new do def x==x end end
This commit is contained in:
+14
-9
@@ -270,12 +270,17 @@ local_add(parser_state *p, mrb_sym sym)
|
||||
}
|
||||
}
|
||||
|
||||
static node*
|
||||
locals_node(parser_state *p)
|
||||
{
|
||||
return p->locals ? p->locals->car : NULL;
|
||||
}
|
||||
|
||||
/* (:scope (vars..) (prog...)) */
|
||||
static node*
|
||||
new_scope(parser_state *p, node *body)
|
||||
{
|
||||
node *n = p->locals ? p->locals->car : NULL;
|
||||
return cons((node*)NODE_SCOPE, cons(n, body));
|
||||
return cons((node*)NODE_SCOPE, cons(locals_node(p), body));
|
||||
}
|
||||
|
||||
/* (:begin prog...) */
|
||||
@@ -602,35 +607,35 @@ new_undef(parser_state *p, mrb_sym sym)
|
||||
static node*
|
||||
new_class(parser_state *p, node *c, node *s, node *b)
|
||||
{
|
||||
return list4((node*)NODE_CLASS, c, s, cons(p->locals->car, b));
|
||||
return list4((node*)NODE_CLASS, c, s, cons(locals_node(p), b));
|
||||
}
|
||||
|
||||
/* (:sclass obj body) */
|
||||
static node*
|
||||
new_sclass(parser_state *p, node *o, node *b)
|
||||
{
|
||||
return list3((node*)NODE_SCLASS, o, cons(p->locals->car, b));
|
||||
return list3((node*)NODE_SCLASS, o, cons(locals_node(p), b));
|
||||
}
|
||||
|
||||
/* (:module module body) */
|
||||
static node*
|
||||
new_module(parser_state *p, node *m, node *b)
|
||||
{
|
||||
return list3((node*)NODE_MODULE, m, cons(p->locals->car, b));
|
||||
return list3((node*)NODE_MODULE, m, cons(locals_node(p), b));
|
||||
}
|
||||
|
||||
/* (:def m lv (arg . body)) */
|
||||
static node*
|
||||
new_def(parser_state *p, mrb_sym m, node *a, node *b)
|
||||
{
|
||||
return list5((node*)NODE_DEF, nsym(m), p->locals->car, a, b);
|
||||
return list5((node*)NODE_DEF, nsym(m), locals_node(p), a, b);
|
||||
}
|
||||
|
||||
/* (:sdef obj m lv (arg . body)) */
|
||||
static node*
|
||||
new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b)
|
||||
{
|
||||
return list6((node*)NODE_SDEF, o, nsym(m), p->locals->car, a, b);
|
||||
return list6((node*)NODE_SDEF, o, nsym(m), locals_node(p), a, b);
|
||||
}
|
||||
|
||||
/* (:arg . sym) */
|
||||
@@ -668,14 +673,14 @@ new_block_arg(parser_state *p, node *a)
|
||||
static node*
|
||||
new_block(parser_state *p, node *a, node *b)
|
||||
{
|
||||
return list4((node*)NODE_BLOCK, p->locals->car, a, b);
|
||||
return list4((node*)NODE_BLOCK, locals_node(p), a, b);
|
||||
}
|
||||
|
||||
/* (:lambda arg body) */
|
||||
static node*
|
||||
new_lambda(parser_state *p, node *a, node *b)
|
||||
{
|
||||
return list4((node*)NODE_LAMBDA, p->locals->car, a, b);
|
||||
return list4((node*)NODE_LAMBDA, locals_node(p), a, b);
|
||||
}
|
||||
|
||||
/* (:asgn lhs rhs) */
|
||||
|
||||
Reference in New Issue
Block a user