[前][次][番号順一覧][スレッド一覧]

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(&regs, 0);
 	if (result == ONIG_MISMATCH) {
 	    rb_backref_set(Qnil);
 	    return result;
@@ -1323,6 +1324,7 @@
     }
 
     onig_region_copy(RMATCH_REGS(match), &regs);
+    onig_region_free(&regs, 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/

[前][次][番号順一覧][スレッド一覧]