diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-09-05 04:42:09 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-09-05 04:42:09 +0000 |
commit | cad94dbe222bb3337bfabefb66d5fb05d28dc133 (patch) | |
tree | 20be0655bbd4690acd30c11f6db7c7c8a6d9ceae /regparse.c | |
parent | b9e630607ed20bd35adf75faee325d88654c42e4 (diff) |
merge r46831 partially. these changes are from:
https://github.com/k-takata/Onigmo/commit/7abd7b29481f98eb92be786e3d33611fc7d000a0
[Bug #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_0_0@47400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regparse.c')
-rw-r--r-- | regparse.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/regparse.c b/regparse.c index 774ee0a960..7e57cfaaee 100644 --- a/regparse.c +++ b/regparse.c @@ -978,6 +978,8 @@ scan_env_add_mem_entry(ScanEnv* env) Node** p; need = env->num_mem + 1; + if (need > ONIG_MAX_CAPTURE_GROUP_NUM) + return ONIGERR_TOO_MANY_CAPTURE_GROUPS; if (need >= SCANENV_MEMNODES_SIZE) { if (env->mem_alloc <= need) { if (IS_NULL(env->mem_nodes_dynamic)) { @@ -4960,14 +4962,9 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, *np = node_new_enclose_memory(env->option, 0); CHECK_NULL_RETURN_MEMERR(*np); num = scan_env_add_mem_entry(env); - if (num < 0) { - onig_node_free(*np); - return num; - } - else if (num >= (int )BIT_STATUS_BITS_NUM) { - onig_node_free(*np); + if (num < 0) return num; + if (num >= (int )BIT_STATUS_BITS_NUM) return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY; - } NENCLOSE(*np)->regnum = num; BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num); } |