aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-10-09 08:54:46 +1000
committerSteve Bennett <steveb@workware.net.au>2016-10-09 08:56:55 +1000
commit41c5ff1809f5d84569c3f435afc2db38f768791c (patch)
treec1482865cb4b5292dafc85afbe7360aed4761a16 /jim.c
parent1b0cdc3e669b69281371ab77893792d2d8621af9 (diff)
downloadjimtcl-41c5ff1809f5d84569c3f435afc2db38f768791c.zip
jimtcl-41c5ff1809f5d84569c3f435afc2db38f768791c.tar.gz
jimtcl-41c5ff1809f5d84569c3f435afc2db38f768791c.tar.bz2
jim.c: Fix Object leak in zlib support
Change Jim_SetResultFormatted() to increment/decrement the ref count of any %#s parameters. This allows zero refcount objects to be passed in and be freed automatically. Reported-by: Evan Hunter <evan@ozhiker.com> Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index bf98eb9..04eedc6 100644
--- a/jim.c
+++ b/jim.c
@@ -10926,7 +10926,6 @@ static void JimSetProcWrongArgs(Jim_Interp *interp, Jim_Obj *procNameObj, Jim_Cm
}
}
Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s%#s\"", procNameObj, argmsg);
- Jim_FreeNewObj(interp, argmsg);
}
#ifdef jim_ext_namespace
@@ -11382,9 +11381,7 @@ void Jim_WrongNumArgs(Jim_Interp *interp, int argc, Jim_Obj *const *argv, const
objPtr = Jim_ListJoin(interp, listObjPtr, " ", 1);
Jim_DecrRefCount(interp, listObjPtr);
- Jim_IncrRefCount(objPtr);
Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s\"", objPtr);
- Jim_DecrRefCount(interp, objPtr);
}
/**
@@ -15696,6 +15693,8 @@ int Jim_IsList(Jim_Obj *objPtr)
* e.g. Jim_SetResultFormatted(interp, "Bad option \"%#s\" in proc \"%#s\"", optionObjPtr, procNamePtr);
*
* Note: We take advantage of the fact that printf has the same behaviour for both %s and %#s
+ *
+ * Note that any Jim_Obj parameters with zero ref count will be freed as a result of this call.
*/
void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...)
{
@@ -15704,6 +15703,8 @@ void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...)
int extra = 0;
int n = 0;
const char *params[5];
+ int nobjparam = 0;
+ Jim_Obj *objparam[5];
char *buf;
va_list args;
int i;
@@ -15722,6 +15723,8 @@ void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...)
Jim_Obj *objPtr = va_arg(args, Jim_Obj *);
params[n] = Jim_GetString(objPtr, &l);
+ objparam[nobjparam++] = objPtr;
+ Jim_IncrRefCount(objPtr);
}
else {
if (format[i] == '%') {
@@ -15740,6 +15743,10 @@ void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...)
va_end(args);
Jim_SetResult(interp, Jim_NewStringObjNoAlloc(interp, buf, len));
+
+ for (i = 0; i < nobjparam; i++) {
+ Jim_DecrRefCount(interp, objparam[i]);
+ }
}
/* stubs */