From 900eb0c79d67fcee9a25be79a2f13dea60a6428e Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Wed, 24 Jul 2024 14:01:03 +1000 Subject: leval: fix some reference counting issues Signed-off-by: Steve Bennett --- jim.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/jim.c b/jim.c index 64a8521..a7ae27c 100644 --- a/jim.c +++ b/jim.c @@ -11202,27 +11202,37 @@ static Jim_Obj *JimParseListEval(Jim_Interp *interp, struct Jim_Obj *objPtr) tokens = Jim_Alloc(sizeof(ScriptToken) * wordtokens); for (j = 0; j < wordtokens; j++) { tokens[j].objPtr = Jim_NewStringObj(interp, tokenlist.list[i + j].token, tokenlist.list[i + j].len); + Jim_IncrRefCount(tokens[j].objPtr); tokens[j].type = tokenlist.list[i + j].type; } i += wordtokens; wordObjPtr = JimInterpolateTokens(interp, tokens, wordtokens, JIM_NONE); + + if (wordObjPtr) { + if (expand) { + /* Expand the word into multiple elements */ + Jim_IncrRefCount(wordObjPtr); + for (j = 0; j < Jim_ListLength(interp, wordObjPtr); j++) { + Jim_ListAppendElement(interp, listObj, Jim_ListGetIndex(interp, wordObjPtr, j)); + } + /* No longer need the list value */ + Jim_DecrRefCount(interp, wordObjPtr); + } + else { + Jim_ListAppendElement(interp, listObj, wordObjPtr); + } + } + for (j = 0; j < wordtokens; j++) { + Jim_DecrRefCount(interp, tokens[j].objPtr); + } Jim_Free(tokens); + if (wordObjPtr == NULL) { /* e.g. reference to a variable that doesn't exist */ ret = JIM_ERR; break; } - - if (expand) { - /* Expand the word into multiple elements */ - for (j = 0; j < Jim_ListLength(interp, wordObjPtr); j++) { - Jim_ListAppendElement(interp, listObj, Jim_ListGetIndex(interp, wordObjPtr, j)); - } - } - else { - Jim_ListAppendElement(interp, listObj, wordObjPtr); - } } if (ret != JIM_OK) { -- cgit v1.1