diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-12-02 08:34:58 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-12-02 08:34:58 +1000 |
commit | d160ac7e0cdd776e46c502ab1ad33aa5366acc99 (patch) | |
tree | 871a69cb39309f1b831287deb5ed2b7df35c9cea | |
parent | 6c6a315bb5d422df3764d4bf508dc741ee4742bc (diff) | |
download | jimtcl-d160ac7e0cdd776e46c502ab1ad33aa5366acc99.zip jimtcl-d160ac7e0cdd776e46c502ab1ad33aa5366acc99.tar.gz jimtcl-d160ac7e0cdd776e46c502ab1ad33aa5366acc99.tar.bz2 |
Fix memory leak with filenames
Under some circumstances, source filenames were being leaked.
Use shared strings consistently for filenames.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Reported-By: Piotr Esden-Tempski <piotr@esden.net>
-rw-r--r-- | jim.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -2782,7 +2782,7 @@ typedef struct ScriptObj int inUse; /* Used to share a ScriptObj. Currently only used by Jim_EvalObj() as protection against shimmering of the currently evaluated object. */ - char *fileName; + const char *fileName; int line; /* Line number of the first line */ } ScriptObj; @@ -2798,7 +2798,9 @@ void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) Jim_DecrRefCount(interp, script->token[i].objPtr); } Jim_Free(script->token); - Jim_Free(script->fileName); + if (script->fileName) { + Jim_ReleaseSharedString(interp, script->fileName); + } Jim_Free(script); } @@ -3094,7 +3096,7 @@ int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) /* Try to get information about filename / line number */ if (objPtr->typePtr == &sourceObjType) { - script->fileName = Jim_StrDup(objPtr->internalRep.sourceValue.fileName); + script->fileName = Jim_GetSharedString(interp, objPtr->internalRep.sourceValue.fileName); script->line = objPtr->internalRep.sourceValue.lineNumber; } else { @@ -3123,7 +3125,7 @@ int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) ScriptTokenListFree(&tokenlist); if (!script->fileName) { - script->fileName = Jim_StrDup(""); + script->fileName = Jim_GetSharedString(interp, ""); } /* Free the old internal rep and set the new one. */ @@ -5416,12 +5418,12 @@ int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) struct JimParserCtx parser; const char *str; int strLen; - char *filename = NULL; + const char *filename = NULL; int linenr = 1; /* Try to preserve information about filename / line number */ if (objPtr->typePtr == &sourceObjType) { - filename = Jim_StrDup(objPtr->internalRep.sourceValue.fileName); + filename = Jim_GetSharedString(interp, objPtr->internalRep.sourceValue.fileName); linenr = objPtr->internalRep.sourceValue.lineNumber; } @@ -5450,7 +5452,9 @@ int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) } ListAppendElement(objPtr, elementPtr); } - free(filename); + if (filename) { + Jim_ReleaseSharedString(interp, filename); + } return JIM_OK; } |