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 | |
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
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | include/ruby/oniguruma.h | 2 | ||||
-rw-r--r-- | regerror.c | 2 | ||||
-rw-r--r-- | regint.h | 4 | ||||
-rw-r--r-- | regparse.c | 11 | ||||
-rw-r--r-- | version.h | 2 |
6 files changed, 28 insertions, 10 deletions
@@ -1,3 +1,20 @@ +Fri Sep 5 13:36:12 2014 NAKAMURA Usaku <usa@ruby-lang.org> + + 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. + Fri Sep 5 13:06:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * string.c (rb_str_resize): update capa only when buffer get diff --git a/include/ruby/oniguruma.h b/include/ruby/oniguruma.h index 0b645bd935..cdc4382596 100644 --- a/include/ruby/oniguruma.h +++ b/include/ruby/oniguruma.h @@ -340,6 +340,7 @@ int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p)); /* config parameters */ #define ONIG_NREGION 10 #define ONIG_MAX_BACKREF_NUM 1000 +#define ONIG_MAX_CAPTURE_GROUP_NUM 32767 #define ONIG_MAX_REPEAT_NUM 100000 #define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000 /* constants */ @@ -584,6 +585,7 @@ ONIG_EXTERN const OnigSyntaxType* OnigDefaultSyntax; #define ONIGERR_NEVER_ENDING_RECURSION -221 #define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 #define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 +#define ONIGERR_TOO_MANY_CAPTURE_GROUPS -224 #define ONIGERR_INVALID_CODE_POINT_VALUE -400 #define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 #define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 diff --git a/regerror.c b/regerror.c index 9c94d23018..d32b50d12b 100644 --- a/regerror.c +++ b/regerror.c @@ -133,6 +133,8 @@ onig_error_code_to_format(OnigPosition code) p = "too short multibyte code string"; break; case ONIGERR_TOO_BIG_BACKREF_NUMBER: p = "too big backref number"; break; + case ONIGERR_TOO_MANY_CAPTURE_GROUPS: + p = "too many capture groups are specified"; break; case ONIGERR_INVALID_BACKREF: #ifdef USE_NAMED_GROUP p = "invalid backref number/name"; break; @@ -239,8 +239,8 @@ # include <stddef.h> #endif -#ifdef __BORLANDC__ -#include <malloc.h> +#ifdef _WIN32 +#include <malloc.h> /* for alloca() */ #endif #ifdef ONIG_DEBUG 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); } @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.0.0" #define RUBY_RELEASE_DATE "2014-09-05" -#define RUBY_PATCHLEVEL 549 +#define RUBY_PATCHLEVEL 550 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 9 |