summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcremno <[email protected]>2015-04-28 19:01:13 +0200
committercremno <[email protected]>2015-04-28 19:03:58 +0200
commitc18212573c6397ea903e112e111a0d31bfa4c44e (patch)
treeb099fd66d65b0904c451948725d56866aa8655a5
parent41e69319874e8b975e4fac684ec69c05d33981ed (diff)
downloadmruby-c18212573c6397ea903e112e111a0d31bfa4c44e.tar.gz
mruby-c18212573c6397ea903e112e111a0d31bfa4c44e.zip
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
-rw-r--r--src/parse.y23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/parse.y b/src/parse.y
index 336b20a6c..0571fe0f5 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -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) */