ruby-changes:4944
From: ko1@a...
Date: Sat, 17 May 2008 03:27:28 +0900 (JST)
Subject: [ruby-changes:4944] matz - Ruby:r16437 (trunk): * array.c (rb_ary_sort_bang): stop memory leak.
matz 2008-05-17 03:27:01 +0900 (Sat, 17 May 2008) New Revision: 16437 Modified files: trunk/ChangeLog trunk/array.c trunk/re.c trunk/regexec.c trunk/version.h Log: * array.c (rb_ary_sort_bang): stop memory leak. [ruby-dev:34726] * re.c (rb_reg_search): need to free allocated buffer in re_register. * regexec.c (onig_region_new): more pedantic malloc check. * regexec.c (onig_region_resize): ditto. * regexec.c (STATE_CHECK_BUFF_INIT): ditto. * regexec.c (onig_region_copy): use onig_region_resize. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=16437&r2=16436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/array.c?r1=16437&r2=16436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/regexec.c?r1=16437&r2=16436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16437&r2=16436&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/re.c?r1=16437&r2=16436&diff_format=u Index: array.c =================================================================== --- array.c (revision 16436) +++ array.c (revision 16437) @@ -1513,16 +1513,17 @@ RBASIC(tmp)->klass = 0; ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE), rb_block_given_p()?sort_1:sort_2, &RBASIC(tmp)->klass); - sort_reentered(&RBASIC(tmp)->klass); - RARRAY(ary)->ptr = RARRAY(tmp)->ptr; - RARRAY(ary)->len = RARRAY(tmp)->len; - RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa; + if (RARRAY(ary)->ptr != RARRAY(tmp)->ptr) { + xfree(RARRAY(ary)->ptr); + RARRAY(ary)->ptr = RARRAY(tmp)->ptr; + RARRAY(ary)->len = RARRAY(tmp)->len; + RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa; + }; FL_UNSET(ary, ELTS_SHARED); RARRAY(tmp)->ptr = 0; RARRAY(tmp)->len = 0; RARRAY(tmp)->aux.capa = 0; RBASIC(tmp)->klass = RBASIC(ary)->klass; - OBJ_FREEZE(tmp); } return ary; } Index: re.c =================================================================== --- re.c (revision 16436) +++ re.c (revision 16437) @@ -1300,6 +1300,7 @@ } if (!busy) FL_UNSET(re, REG_BUSY); if (result < 0) { + onig_region_free(®s, 0); if (result == ONIG_MISMATCH) { rb_backref_set(Qnil); return result; @@ -1323,6 +1324,7 @@ } onig_region_copy(RMATCH_REGS(match), ®s); + onig_region_free(®s, 0); RMATCH(match)->str = rb_str_new4(str); RMATCH(match)->regexp = re; RMATCH(match)->rmatch->char_offset_updated = 0; Index: ChangeLog =================================================================== --- ChangeLog (revision 16436) +++ ChangeLog (revision 16437) @@ -1,3 +1,17 @@ +Sat May 17 03:21:29 2008 Yukihiro Matsumoto <matz@r...> + + * array.c (rb_ary_sort_bang): stop memory leak. [ruby-dev:34726] + + * re.c (rb_reg_search): need to free allocated buffer in re_register. + + * regexec.c (onig_region_new): more pedantic malloc check. + + * regexec.c (onig_region_resize): ditto. + + * regexec.c (STATE_CHECK_BUFF_INIT): ditto. + + * regexec.c (onig_region_copy): use onig_region_resize. + Fri May 16 12:48:33 2008 Yukihiro Matsumoto <matz@r...> * math.c (to_flo): rb_Float() accepts even strings for input. Index: regexec.c =================================================================== --- regexec.c (revision 16436) +++ regexec.c (revision 16437) @@ -178,17 +178,35 @@ if (region->allocated == 0) { region->beg = (int* )xmalloc(n * sizeof(int)); + if (region->beg == 0) + return ONIGERR_MEMORY; + region->end = (int* )xmalloc(n * sizeof(int)); - - if (region->beg == 0 || region->end == 0) + if (region->end == 0) { + xfree(region->beg); return ONIGERR_MEMORY; + } region->allocated = n; } else if (region->allocated < n) { - region->beg = (int* )xrealloc(region->beg, n * sizeof(int)); - region->end = (int* )xrealloc(region->end, n * sizeof(int)); + int *tmp; + region->allocated = 0; + tmp = (int* )xrealloc(region->beg, n * sizeof(int)); + if (tmp == 0) { + xfree(region->beg); + xfree(region->end); + return ONIGERR_MEMORY; + } + region->beg = tmp; + tmp = (int* )xrealloc(region->end, n * sizeof(int)); + if (tmp == 0) { + xfree(region->beg); + return ONIGERR_MEMORY; + } + region->end = tmp; + if (region->beg == 0 || region->end == 0) return ONIGERR_MEMORY; @@ -240,7 +258,8 @@ OnigRegion* r; r = (OnigRegion* )xmalloc(sizeof(OnigRegion)); - onig_region_init(r); + if (r) + onig_region_init(r); return r; } @@ -268,19 +287,7 @@ if (to == from) return; - if (to->allocated == 0) { - if (from->num_regs > 0) { - to->beg = (int* )xmalloc(RREGC_SIZE); - to->end = (int* )xmalloc(RREGC_SIZE); - to->allocated = from->num_regs; - } - } - else if (to->allocated < from->num_regs) { - to->beg = (int* )xrealloc(to->beg, RREGC_SIZE); - to->end = (int* )xrealloc(to->end, RREGC_SIZE); - to->allocated = from->num_regs; - } - + onig_region_resize(to, from->num_regs); for (i = 0; i < from->num_regs; i++) { to->beg[i] = from->beg[i]; to->end[i] = from->end[i]; @@ -352,8 +359,10 @@ unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\ offset = ((offset) * (state_num)) >> 3;\ if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\ - if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) \ + if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) {\ (msa).state_check_buff = (void* )xmalloc(size);\ + CHECK_NULL_RETURN_MEMERR((msa).state_check_buff);\ + }\ else \ (msa).state_check_buff = (void* )xalloca(size);\ xmemset(((char* )((msa).state_check_buff)+(offset)), 0, \ @@ -378,7 +387,6 @@ }\ } while(0) #else -#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) #define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p) #endif Index: version.h =================================================================== --- version.h (revision 16436) +++ version.h (revision 16437) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-05-16" +#define RUBY_RELEASE_DATE "2008-05-17" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080516 +#define RUBY_RELEASE_CODE 20080517 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 5 -#define RUBY_RELEASE_DAY 16 +#define RUBY_RELEASE_DAY 17 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/