diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-04 05:15:15 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-04 05:15:15 +0000 |
commit | 9cb20d6449f9e2e7106b5fb319026aa731041174 (patch) | |
tree | c5b8e41d359cfd7f1d7e95aa0bffa00dc72c3d68 | |
parent | 47bb1804cbe9df69c2c2dd1d127482057095c429 (diff) |
merge revision(s) 18212:
* regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory.
* regex.c (DOUBLE_STACK, re_compile_fastmap0, re_adjust_startpos),
(re_search, re_match_exec): check if failed to allocate memory.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@18345 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | regex.c | 46 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 44 insertions, 11 deletions
@@ -1,3 +1,10 @@ +Mon Aug 4 14:13:15 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory. + + * regex.c (DOUBLE_STACK, re_compile_fastmap0, re_adjust_startpos), + (re_search, re_match_exec): check if failed to allocate memory. + Mon Aug 4 13:53:42 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> * bignum.c (rb_big2str0, bigsqr): made interruptible. [ruby-Bugs-20622] @@ -50,6 +50,9 @@ /* We need this for `regex.h', and perhaps for the Emacs include files. */ # include <sys/types.h> #endif +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif #if !defined(__STDC__) && !defined(_MSC_VER) # define volatile @@ -63,6 +66,10 @@ #ifdef RUBY_PLATFORM #include "defines.h" +#undef xmalloc +#undef xrealloc +#undef xcalloc +#undef xfree # define RUBY extern int rb_prohibit_interrupt; @@ -104,6 +111,11 @@ void *alloca (); # include <strings.h> #endif +#define xmalloc malloc +#define xrealloc realloc +#define xcalloc calloc +#define xfree free + #ifdef C_ALLOCA #define FREE_VARIABLES() alloca(0) #else @@ -127,10 +139,12 @@ void *alloca (); unsigned int xlen = stacke - stackb; \ if (stackb == stacka) { \ stackx = (type*)xmalloc(2 * xlen * sizeof(type)); \ + if (!stackx) goto memory_exhausted; \ memcpy(stackx, stackb, xlen * sizeof (type)); \ } \ else { \ stackx = (type*)xrealloc(stackb, 2 * xlen * sizeof(type)); \ + if (!stackx) goto memory_exhausted; \ } \ /* Rearrange the pointers. */ \ stackp = stackx + (stackp - stackb); \ @@ -2775,8 +2789,8 @@ bm_search(little, llen, big, blen, skip, translate) The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as bufp->fastmap. The other components of bufp describe the pattern to be used. */ -void -re_compile_fastmap(bufp) +static int +re_compile_fastmap0(bufp) struct re_pattern_buffer *bufp; { unsigned char *pattern = (unsigned char*)bufp->buffer; @@ -2944,7 +2958,7 @@ re_compile_fastmap(bufp) fastmap[j] = 1; } if (bufp->can_be_null) { - FREE_AND_RETURN_VOID(stackb); + FREE_AND_RETURN(stackb, 0); } /* Don't return; check the alternative paths so we can set can_be_null if appropriate. */ @@ -3110,7 +3124,16 @@ re_compile_fastmap(bufp) else break; } - FREE_AND_RETURN_VOID(stackb); + FREE_AND_RETURN(stackb, 0); + memory_exhausted: + FREE_AND_RETURN(stackb, -2); +} + +void +re_compile_fastmap(bufp) + struct re_pattern_buffer *bufp; +{ + (void)re_compile_fastmap0(bufp); } /* adjust startpos value to the position between characters. */ @@ -3144,7 +3167,8 @@ re_adjust_startpos(bufp, string, size, startpos, range) { /* Update the fastmap now if not correct already. */ if (!bufp->fastmap_accurate) { - re_compile_fastmap(bufp); + int ret = re_compile_fastmap0(bufp); + if (ret) return ret; } /* Adjust startpos for mbc string */ @@ -3190,7 +3214,8 @@ re_search(bufp, string, size, startpos, range, regs) /* Update the fastmap now if not correct already. */ if (fastmap && !bufp->fastmap_accurate) { - re_compile_fastmap(bufp); + int ret = re_compile_fastmap0(bufp); + if (ret) return ret; } @@ -3580,7 +3605,7 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs) ``dummy''; if a failure happens and the failure point is a dummy, it gets discarded and the next next one is tried. */ - unsigned char **stacka; + unsigned char **const stacka = 0; unsigned char **stackb; unsigned char **stackp; unsigned char **stacke; @@ -3629,8 +3654,7 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs) } /* Initialize the stack. */ - stacka = RE_TALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*); - stackb = stacka; + stackb = TMALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*); stackp = stackb; stacke = &stackb[MAX_NUM_FAILURE_ITEMS * NFAILURES]; @@ -4400,6 +4424,8 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs) goto restore_best_regs; FREE_AND_RETURN(stackb,(-1)); /* Failure to match. */ + memory_exhausted: + FREE_AND_RETURN(stackb,(-2)); } @@ -4663,5 +4689,5 @@ utf8_startpos(string, pos) mode : C c-file-style : "gnu" tab-width : 8 - End : + End */ @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2008-08-04" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20080804 -#define RUBY_PATCHLEVEL 67 +#define RUBY_PATCHLEVEL 68 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 |