diff options
| author | cremno <[email protected]> | 2015-04-28 19:01:13 +0200 |
|---|---|---|
| committer | cremno <[email protected]> | 2015-04-28 19:03:58 +0200 |
| commit | c18212573c6397ea903e112e111a0d31bfa4c44e (patch) | |
| tree | b099fd66d65b0904c451948725d56866aa8655a5 | |
| parent | 41e69319874e8b975e4fac684ec69c05d33981ed (diff) | |
| download | mruby-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.y | 23 |
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) */ |
