summaryrefslogtreecommitdiffhomepage
path: root/src/parse.y
diff options
context:
space:
mode:
authorcremno <[email protected]>2015-05-28 12:52:44 +0200
committercremno <[email protected]>2015-05-28 12:52:44 +0200
commitce31272dba2a67772daeca34940c2e60cd183a85 (patch)
tree7f2fa7ec823e376a21bf66d60d7da5b6d7ab5609 /src/parse.y
parentb1871cf446a5cde128f8601b5517a8760af67940 (diff)
downloadmruby-ce31272dba2a67772daeca34940c2e60cd183a85.tar.gz
mruby-ce31272dba2a67772daeca34940c2e60cd183a85.zip
fix capture group index bug
atoi() is used to convert the index to an int but the behavior is undefined if the value can't be represented. > $9999999999 00007 NODE_SCOPE: 00007 NODE_BEGIN: 00007 NODE_NTH_REF: $2147483647 irep 00630580 nregs=2 nlocals=1 pools=0 syms=1 reps=0 file: (mirb) 7 000 OP_GETGLOBAL R1 :$2147483647 7 001 OP_STOP Call strtoul() instead as its behavior in such cases is defined and add a simple range check. Alternatively NODE_NTH_REF's cdr could be changed from int to mrb_sym (like NODE_GVAR).
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/parse.y b/src/parse.y
index 76220499e..5b17649a9 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -5118,7 +5118,14 @@ parser_yylex(parser_state *p)
pushback(p, c);
if (last_state == EXPR_FNAME) goto gvar;
tokfix(p);
- yylval.nd = new_nth_ref(p, atoi(tok(p)));
+ {
+ unsigned long n = strtoul(tok(p), NULL, 10);
+ if (n > INT_MAX) {
+ yyerror_i(p, "capture group index must be <= %d", INT_MAX);
+ return 0;
+ }
+ yylval.nd = new_nth_ref(p, (int)n);
+ }
return tNTH_REF;
default: