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/