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/