Skip to content

Commit be2ae51

Browse files
committed
merge r46831 partially. extracted commits are as follows.
k-takata/Onigmo@b9fba1d k-takata/Onigmo@c1fc76b k-takata/Onigmo@a0efc0a k-takata/Onigmo@c7cda4e [Bug ruby#8716] * include/ruby/oniguruma.h (ONIG_MAX_CAPTURE_GROUP_NUM, ONIGERR_TOO_MANY_CAPTURE_GROUPS): add cheking the number of capture groups. * regerror.c (onig_error_code_to_format): ditto. * regparse.c (scan_env_add_mem_entry): ditto. * regexec.c (onig_region_copy, match_at): fix: segmation fault occurs when many groups are used. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@47223 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 4ac47f3 commit be2ae51

File tree

6 files changed

+61
-8
lines changed

6 files changed

+61
-8
lines changed

ChangeLog

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
Tue Aug 19 23:31:48 2014 CHIKANAGA Tomoyuki <[email protected]>
2+
3+
merge r46831 partially. extracted commits are as follows.
4+
https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
5+
https://github.com/k-takata/Onigmo/commit/c1fc76b9bd463948ffc5058bc352bf93732f0314
6+
https://github.com/k-takata/Onigmo/commit/a0efc0a200f7108ca3d5ac3039c8f952e0051619
7+
https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13
8+
[Bug #8716]
9+
10+
* include/ruby/oniguruma.h (ONIG_MAX_CAPTURE_GROUP_NUM,
11+
ONIGERR_TOO_MANY_CAPTURE_GROUPS): add cheking the number of capture
12+
groups.
13+
14+
* regerror.c (onig_error_code_to_format): ditto.
15+
16+
* regparse.c (scan_env_add_mem_entry): ditto.
17+
18+
* regexec.c (onig_region_copy, match_at): fix: segmation fault occurs
19+
when many groups are used.
20+
121
Mon Aug 18 23:38:21 2014 Nobuyoshi Nakada <[email protected]>
222

323
* encoding.c (enc_find): [DOC] never accepted a symbol.

include/ruby/oniguruma.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p));
338338
/* config parameters */
339339
#define ONIG_NREGION 10
340340
#define ONIG_MAX_BACKREF_NUM 1000
341+
#define ONIG_MAX_CAPTURE_GROUP_NUM 32767
341342
#define ONIG_MAX_REPEAT_NUM 100000
342343
#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000
343344
/* constants */
@@ -582,6 +583,7 @@ ONIG_EXTERN const OnigSyntaxType* OnigDefaultSyntax;
582583
#define ONIGERR_NEVER_ENDING_RECURSION -221
583584
#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222
584585
#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223
586+
#define ONIGERR_TOO_MANY_CAPTURE_GROUPS -224
585587
#define ONIGERR_INVALID_CODE_POINT_VALUE -400
586588
#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400
587589
#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401

regerror.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ onig_error_code_to_format(OnigPosition code)
133133
p = "too short multibyte code string"; break;
134134
case ONIGERR_TOO_BIG_BACKREF_NUMBER:
135135
p = "too big backref number"; break;
136+
case ONIGERR_TOO_MANY_CAPTURE_GROUPS:
137+
p = "too many capture groups are specified"; break;
136138
case ONIGERR_INVALID_BACKREF:
137139
#ifdef USE_NAMED_GROUP
138140
p = "invalid backref number/name"; break;

regexec.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,26 @@ onig_region_copy(OnigRegion* to, OnigRegion* from)
444444

445445

446446

447-
#define STACK_INIT(alloc_addr, ptr_num, stack_num) do {\
448-
if (msa->stack_p) {\
447+
#define MAX_PTR_NUM 100
448+
449+
#define STACK_INIT(alloc_addr, heap_addr, ptr_num, stack_num) do {\
450+
if (ptr_num > MAX_PTR_NUM) {\
451+
alloc_addr = (char* )xmalloc(sizeof(OnigStackIndex) * (ptr_num));\
452+
heap_addr = alloc_addr;\
453+
if (msa->stack_p) {\
454+
stk_alloc = (OnigStackType* )(msa->stack_p);\
455+
stk_base = stk_alloc;\
456+
stk = stk_base;\
457+
stk_end = stk_base + msa->stack_n;\
458+
} else {\
459+
stk_alloc = (OnigStackType* )xalloca(sizeof(OnigStackType) * (stack_num));\
460+
stk_base = stk_alloc;\
461+
stk = stk_base;\
462+
stk_end = stk_base + (stack_num);\
463+
}\
464+
} else if (msa->stack_p) {\
449465
alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num));\
466+
heap_addr = NULL;\
450467
stk_alloc = (OnigStackType* )(msa->stack_p);\
451468
stk_base = stk_alloc;\
452469
stk = stk_base;\
@@ -455,6 +472,7 @@ onig_region_copy(OnigRegion* to, OnigRegion* from)
455472
else {\
456473
alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num)\
457474
+ sizeof(OnigStackType) * (stack_num));\
475+
heap_addr = NULL;\
458476
stk_alloc = (OnigStackType* )(alloc_addr + sizeof(OnigStackIndex) * (ptr_num));\
459477
stk_base = stk_alloc;\
460478
stk = stk_base;\
@@ -529,7 +547,11 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end,
529547
#define STACK_ENSURE(n) do {\
530548
if (stk_end - stk < (n)) {\
531549
int r = stack_double(&stk_base, &stk_end, &stk, stk_alloc, msa);\
532-
if (r != 0) { STACK_SAVE; return r; } \
550+
if (r != 0) {\
551+
STACK_SAVE;\
552+
if (xmalloc_base) xfree(xmalloc_base);\
553+
return r;\
554+
}\
533555
}\
534556
} while(0)
535557

@@ -1325,6 +1347,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
13251347
UChar *p = reg->p;
13261348
UChar *pkeep;
13271349
char *alloca_base;
1350+
char *xmalloc_base = NULL;
13281351
OnigStackType *stk_alloc, *stk_base, *stk, *stk_end;
13291352
OnigStackType *stkp; /* used as any purpose. */
13301353
OnigStackIndex si;
@@ -1340,7 +1363,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
13401363
/* Stack #0 is used to store the pattern itself and used for (?R), \g<0>, etc. */
13411364
n = reg->num_repeat + (reg->num_mem + 1) * 2;
13421365

1343-
STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);
1366+
STACK_INIT(alloca_base, xmalloc_base, n, INIT_MATCH_STACK_SIZE);
13441367
pop_level = reg->stack_pop_level;
13451368
num_mem = reg->num_mem;
13461369
repeat_stk = (OnigStackIndex* )alloca_base;
@@ -1354,7 +1377,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
13541377
/* Stack #0 not is used. */
13551378
n = reg->num_repeat + reg->num_mem * 2;
13561379

1357-
STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);
1380+
STACK_INIT(alloca_base, xmalloc_base, n, INIT_MATCH_STACK_SIZE);
13581381
pop_level = reg->stack_pop_level;
13591382
num_mem = reg->num_mem;
13601383
repeat_stk = (OnigStackIndex* )alloca_base;
@@ -2916,20 +2939,24 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
29162939

29172940
finish:
29182941
STACK_SAVE;
2942+
if (xmalloc_base) xfree(xmalloc_base);
29192943
return best_len;
29202944

29212945
#ifdef ONIG_DEBUG
29222946
stack_error:
29232947
STACK_SAVE;
2948+
if (xmalloc_base) xfree(xmalloc_base);
29242949
return ONIGERR_STACK_BUG;
29252950
#endif
29262951

29272952
bytecode_error:
29282953
STACK_SAVE;
2954+
if (xmalloc_base) xfree(xmalloc_base);
29292955
return ONIGERR_UNDEFINED_BYTECODE;
29302956

29312957
unexpected_bytecode_error:
29322958
STACK_SAVE;
2959+
if (xmalloc_base) xfree(xmalloc_base);
29332960
return ONIGERR_UNEXPECTED_BYTECODE;
29342961
}
29352962

regparse.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,8 @@ scan_env_add_mem_entry(ScanEnv* env)
978978
Node** p;
979979

980980
need = env->num_mem + 1;
981+
if (need > ONIG_MAX_CAPTURE_GROUP_NUM)
982+
return ONIGERR_TOO_MANY_CAPTURE_GROUPS;
981983
if (need >= SCANENV_MEMNODES_SIZE) {
982984
if (env->mem_alloc <= need) {
983985
if (IS_NULL(env->mem_nodes_dynamic)) {

version.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#define RUBY_VERSION "2.1.2"
2-
#define RUBY_RELEASE_DATE "2014-08-18"
3-
#define RUBY_PATCHLEVEL 202
2+
#define RUBY_RELEASE_DATE "2014-08-20"
3+
#define RUBY_PATCHLEVEL 203
44

55
#define RUBY_RELEASE_YEAR 2014
66
#define RUBY_RELEASE_MONTH 8
7-
#define RUBY_RELEASE_DAY 18
7+
#define RUBY_RELEASE_DAY 20
88

99
#include "ruby/version.h"
1010

0 commit comments

Comments
 (0)