Commit 5d0c8a70 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2777 from cremno/fix-parser-locals-null-deref

parser: fix possible null dereferences
parents 8d1f9a6e c1821257
...@@ -271,12 +271,17 @@ local_add(parser_state *p, mrb_sym sym) ...@@ -271,12 +271,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...)) */ /* (:scope (vars..) (prog...)) */
static node* static node*
new_scope(parser_state *p, node *body) new_scope(parser_state *p, node *body)
{ {
node *n = p->locals ? p->locals->car : NULL; return cons((node*)NODE_SCOPE, cons(locals_node(p), body));
return cons((node*)NODE_SCOPE, cons(n, body));
} }
/* (:begin prog...) */ /* (:begin prog...) */
...@@ -603,35 +608,35 @@ new_undef(parser_state *p, mrb_sym sym) ...@@ -603,35 +608,35 @@ new_undef(parser_state *p, mrb_sym sym)
static node* static node*
new_class(parser_state *p, node *c, node *s, node *b) 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) */ /* (:sclass obj body) */
static node* static node*
new_sclass(parser_state *p, node *o, node *b) 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) */ /* (:module module body) */
static node* static node*
new_module(parser_state *p, node *m, node *b) 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)) */ /* (:def m lv (arg . body)) */
static node* static node*
new_def(parser_state *p, mrb_sym m, node *a, node *b) 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)) */ /* (:sdef obj m lv (arg . body)) */
static node* static node*
new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b) 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) */ /* (:arg . sym) */
...@@ -669,14 +674,14 @@ new_block_arg(parser_state *p, node *a) ...@@ -669,14 +674,14 @@ new_block_arg(parser_state *p, node *a)
static node* static node*
new_block(parser_state *p, node *a, node *b) 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) */ /* (:lambda arg body) */
static node* static node*
new_lambda(parser_state *p, node *a, node *b) 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) */ /* (:asgn lhs rhs) */
......
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