Skip to content

Commit c3c8863

Browse files
makenowjustk0kubun
authored andcommitted
Reject overflowed repeat/null-check IDs in huge regexps (ruby#16801)
Add explicit errors for excessive range-repeat and null-check IDs; map new errors in regerror; add regression tests for oversized generated patterns.
1 parent 60c3d71 commit c3c8863

4 files changed

Lines changed: 20 additions & 0 deletions

File tree

‎include/ruby/onigmo.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,8 @@ ONIG_EXTERN const OnigSyntaxType* OnigDefaultSyntax;
688688
#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222
689689
#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223
690690
#define ONIGERR_TOO_BIG_COMPILED_PROGRAM -226
691+
#define ONIGERR_TOO_MANY_RANGE_REPEAT -224
692+
#define ONIGERR_TOO_MANY_NULL_CHECK -225
691693
#define ONIGERR_INVALID_CODE_POINT_VALUE -400
692694
#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400
693695
#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401

‎regcomp.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ compile_tree_empty_check(Node* node, regex_t* reg, int empty_info)
398398
r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */
399399
if (r) return r;
400400
reg->num_null_check++;
401+
if ((MemNumType)reg->num_null_check <= 0) return ONIGERR_TOO_MANY_NULL_CHECK;
401402
}
402403

403404
r = compile_tree(node, reg);
@@ -707,6 +708,7 @@ compile_range_repeat_node(QtfrNode* qn, int target_len, int empty_info,
707708
if (r) return r;
708709
r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */
709710
reg->num_repeat++;
711+
if ((MemNumType)reg->num_repeat <= 0) return ONIGERR_TOO_MANY_RANGE_REPEAT;
710712
if (r) return r;
711713
r = add_rel_addr(reg, target_len + SIZE_OP_REPEAT_INC);
712714
if (r) return r;

‎regerror.c‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ onig_error_code_to_format(OnigPosition code)
167167
p = "invalid character property name {%n}"; break;
168168
case ONIGERR_TOO_BIG_COMPILED_PROGRAM:
169169
p = "too big compiled program"; break;
170+
case ONIGERR_TOO_MANY_RANGE_REPEAT:
171+
p = "too many range repeat"; break;
172+
case ONIGERR_TOO_MANY_NULL_CHECK:
173+
p = "too many null check"; break;
170174
case ONIGERR_TOO_MANY_CAPTURE_GROUPS:
171175
p = "too many capture groups are specified"; break;
172176
case ONIGERR_INVALID_CODE_POINT_VALUE:

‎test/ruby/test_regexp.rb‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,4 +2348,16 @@ def test_nested_repeat_expansion_overflow
23482348
end
23492349
end;
23502350
end
2351+
2352+
def test_too_many_range_repeat
2353+
source = '(?:foobar){0,100}' * 100000
2354+
assert_raise(RegexpError) { Regexp.new(source) }
2355+
assert_raise(SyntaxError) { eval("/#{source}/") }
2356+
end
2357+
2358+
def test_too_many_null_check
2359+
source = '(?:(?:foo)?|(?:bar)?)*' * 100000
2360+
assert_raise(RegexpError) { Regexp.new(source) }
2361+
assert_raise(SyntaxError) { eval("/#{source}/") }
2362+
end
23512363
end

0 commit comments

Comments
 (0)