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

ruby-changes:38382

From: nobu <ko1@a...>
Date: Sun, 10 May 2015 21:35:26 +0900 (JST)
Subject: [ruby-changes:38382] nobu:r50463 (trunk): proc.c, vm.c: fix possible memory leak

nobu	2015-05-10 21:34:26 +0900 (Sun, 10 May 2015)

  New Revision: 50463

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50463

  Log:
    proc.c, vm.c: fix possible memory leak
    
    * proc.c (proc_binding): fix possible memory leak of rb_env_t when
      TypedData_Wrap_Struct failed.
    
    * vm.c (vm_make_env_each): ditto.

  Modified files:
    trunk/proc.c
    trunk/vm.c
Index: proc.c
===================================================================
--- proc.c	(revision 50462)
+++ proc.c	(revision 50463)
@@ -2510,16 +2510,15 @@ proc_binding(VALUE self) https://github.com/ruby/ruby/blob/trunk/proc.c#L2510
 	if (iseq && env->local_size < iseq->local_size) {
 	    int prev_local_size = env->local_size;
 	    int local_size = iseq->local_size;
-	    rb_env_t *newenv;
-	    VALUE newenvval;
-	    newenv = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
+	    VALUE newenvval = TypedData_Wrap_Struct(RBASIC_CLASS(envval), RTYPEDDATA_TYPE(envval), 0);
+	    rb_env_t *newenv = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
+	    RTYPEDDATA_DATA(newenvval) = newenv;
 	    newenv->env_size = local_size + 2;
 	    newenv->local_size = local_size;
 	    newenv->prev_envval = env->prev_envval;
 	    newenv->block = env->block;
 	    MEMCPY(newenv->env, env->env, VALUE, prev_local_size + 1);
 	    rb_mem_clear(newenv->env + prev_local_size + 1, local_size - prev_local_size);
-	    newenvval = TypedData_Wrap_Struct(RBASIC_CLASS(envval), RTYPEDDATA_TYPE(envval), newenv);
 	    newenv->env[local_size + 1] = newenvval;
 	    envval = newenvval;
 	}
Index: vm.c
===================================================================
--- vm.c	(revision 50462)
+++ vm.c	(revision 50463)
@@ -507,6 +507,7 @@ vm_make_env_each(const rb_thread_t *cons https://github.com/ruby/ruby/blob/trunk/vm.c#L507
 	local_size = cfp->iseq->local_size;
     }
 
+    envval = TypedData_Wrap_Struct(rb_cEnv, &env_data_type, 0);
     /* allocate env */
     env = xmalloc(sizeof(rb_env_t) + ((local_size + 1) * sizeof(VALUE)));
     env->env_size = local_size + 1 + 1;
@@ -525,7 +526,7 @@ vm_make_env_each(const rb_thread_t *cons https://github.com/ruby/ruby/blob/trunk/vm.c#L526
 #endif
 
     /* be careful not to trigger GC after this */
-    envval = TypedData_Wrap_Struct(rb_cEnv, &env_data_type, env);
+    RTYPEDDATA_DATA(envval) = env;
 
    /*
     * must happen after TypedData_Wrap_Struct to ensure penvval is markable

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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