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)
}
}
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...) */
......@@ -603,35 +608,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) */
......@@ -669,14 +674,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) */
......
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