diff options
author | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-05 03:51:50 +0000 |
---|---|---|
committer | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-05 03:51:50 +0000 |
commit | 74d91a4c311f0209b1864171a973ea22a1a54632 (patch) | |
tree | 341f5ba043e957104b3b4195eb467eace6e5caa7 /ext/tk/tcltklib.c | |
parent | 107e177cb8a679baba5726cc299ae8b1cb50803c (diff) |
* ext/tk/tcltklib.c: fixed memory leak when tk_funcall raised
exception. (copies argv into heap in tk_funcall instead of
caller)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8922 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/tcltklib.c')
-rw-r--r-- | ext/tk/tcltklib.c | 57 |
1 files changed, 17 insertions, 40 deletions
diff --git a/ext/tk/tcltklib.c b/ext/tk/tcltklib.c index 1151b50578..9dffee2a4c 100644 --- a/ext/tk/tcltklib.c +++ b/ext/tk/tcltklib.c @@ -4540,19 +4540,14 @@ ip_thread_vwait(self, var) VALUE self; VALUE var; { - VALUE *argv; + VALUE argv[2]; VALUE retval; volatile VALUE cmd_str = rb_str_new2("thread_vwait"); - argv = ALLOC_N(VALUE, 2); argv[0] = cmd_str; argv[1] = var; - retval = ip_invoke_real(2, argv, self); - - free(argv); - - return retval; + return ip_invoke_real(2, argv, self); } static VALUE @@ -4561,20 +4556,15 @@ ip_thread_tkwait(self, mode, target) VALUE mode; VALUE target; { - VALUE *argv; + VALUE argv[3]; VALUE retval; volatile VALUE cmd_str = rb_str_new2("thread_tkwait"); - argv = ALLOC_N(VALUE, 3); argv[0] = cmd_str; argv[1] = mode; argv[2] = target; - retval = ip_invoke_real(3, argv, self); - - free(argv); - - return retval; + return ip_invoke_real(3, argv, self); } @@ -5283,8 +5273,7 @@ ip_create_slave(argc, argv, self) struct tcltkip *master = get_ip(self); VALUE safemode; VALUE name; - VALUE *callargv; - VALUE retval; + VALUE callargv[2]; /* ip is deleted? */ if (deleted_ip(master)) { @@ -5301,16 +5290,11 @@ ip_create_slave(argc, argv, self) rb_secure(4); } - callargv = ALLOC_N(VALUE, 2); StringValue(name); callargv[0] = name; callargv[1] = safemode; - retval = tk_funcall(ip_create_slave_core, 2, callargv, self); - - free(callargv); - - return retval; + return tk_funcall(ip_create_slave_core, 2, callargv, self); } #if defined(MAC_TCL) || defined(__WIN32__) @@ -5796,6 +5780,13 @@ tk_funcall(func, argc, argv, obj) thr_crit_bup = rb_thread_critical; rb_thread_critical = Qtrue; + /* allocate memory (argv cross over thread : must be in heap) */ + if (argv) { + VALUE *temp = ALLOC_N(VALUE, argc); + MEMCPY(temp, argv, VALUE, argc); + argv = temp; + } + /* allocate memory (keep result) */ alloc_done = (int*)ALLOC(int); *alloc_done = 0; @@ -5836,6 +5827,7 @@ tk_funcall(func, argc, argv, obj) /* get result & free allocated memory */ ret = RARRAY(result)->ptr[0]; free(alloc_done); + if (argv) free(argv); Tcl_Release(callq); @@ -7046,15 +7038,9 @@ ip_invoke_real(argc, argv, interp) { VALUE v; struct tcltkip *ptr; /* tcltkip data struct */ - int i; - Tcl_CmdInfo info; - char *s; - int len; - int thr_crit_bup; #if TCL_MAJOR_VERSION >= 8 Tcl_Obj **av = (Tcl_Obj **)NULL; - Tcl_Obj *resultPtr; #else /* TCL_MAJOR_VERSION < 8 */ char **av = (char **)NULL; #endif @@ -7390,21 +7376,18 @@ ip_get_variable2(self, varname, index, flag) VALUE index; VALUE flag; { - VALUE *argv; + VALUE argv[3]; VALUE retval; StringValue(varname); if (!NIL_P(index)) StringValue(index); - argv = ALLOC_N(VALUE, 3); argv[0] = varname; argv[1] = index; argv[2] = flag; retval = tk_funcall(ip_get_variable2_core, 3, argv, self); - free(argv); - if (NIL_P(retval)) { return rb_tainted_str_new2(""); } else { @@ -7527,14 +7510,13 @@ ip_set_variable2(self, varname, index, value, flag) VALUE value; VALUE flag; { - VALUE *argv; + VALUE argv[4]; VALUE retval; StringValue(varname); if (!NIL_P(index)) StringValue(index); StringValue(value); - argv = ALLOC_N(VALUE, 4); argv[0] = varname; argv[1] = index; argv[2] = value; @@ -7542,8 +7524,6 @@ ip_set_variable2(self, varname, index, value, flag) retval = tk_funcall(ip_set_variable2_core, 4, argv, self); - free(argv); - if (NIL_P(retval)) { return rb_tainted_str_new2(""); } else { @@ -7604,21 +7584,18 @@ ip_unset_variable2(self, varname, index, flag) VALUE index; VALUE flag; { - VALUE *argv; + VALUE argv[3]; VALUE retval; StringValue(varname); if (!NIL_P(index)) StringValue(index); - argv = ALLOC_N(VALUE, 3); argv[0] = varname; argv[1] = index; argv[2] = flag; retval = tk_funcall(ip_unset_variable2_core, 3, argv, self); - free(argv); - if (NIL_P(retval)) { return rb_tainted_str_new2(""); } else { |