diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-04-30 12:17:47 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-04-30 12:17:47 +0900 |
| commit | 5d0c8a70e9ec160e760ba9cce54a2a049a2d660a (patch) | |
| tree | 176773614ce73a9f54a95b7f6d26f441566bdbf2 | |
| parent | 8d1f9a6ece97ae94cdb8ce2ca173379660ff1bac (diff) | |
| parent | c18212573c6397ea903e112e111a0d31bfa4c44e (diff) | |
| download | mruby-5d0c8a70e9ec160e760ba9cce54a2a049a2d660a.tar.gz mruby-5d0c8a70e9ec160e760ba9cce54a2a049a2d660a.zip | |
Merge pull request #2777 from cremno/fix-parser-locals-null-deref
parser: fix possible null dereferences
| -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 0768e9eff..ca2a52861 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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) */ |
