Skip to content

Commit b98be3d

Browse files
committed
merge segfault fix for [43acb96e678a66ef]: avoid access to freed memory in TpoolRelease
2 parents 9be1c4b + e48a9c4 commit b98be3d

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

generic/threadPoolCmd.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,9 @@ TpoolCancelObjCmd(
674674
tpoolPtr->workTail = rPtr->prevPtr;
675675
}
676676
SetResult(NULL, rPtr); /* Just to free the result */
677-
ckfree(rPtr->script);
677+
if (rPtr->script) {
678+
ckfree(rPtr->script);
679+
}
678680
ckfree((char *)rPtr);
679681
Tcl_ListObjAppendElement(interp, doneList, wObjv[ii]);
680682
break;
@@ -1239,6 +1241,7 @@ TpoolWorker(
12391241
Tcl_MutexUnlock(&tpoolPtr->mutex);
12401242
TpoolEval(interp, rPtr->script, rPtr->scriptLen, rPtr);
12411243
ckfree(rPtr->script);
1244+
rPtr->script = NULL;
12421245
Tcl_MutexLock(&tpoolPtr->mutex);
12431246
if (!rPtr->detached) {
12441247
int isNew;
@@ -1715,8 +1718,11 @@ TpoolRelease(
17151718
* Cleanup jobs posted but never completed.
17161719
*/
17171720

1718-
for (rPtr = tpoolPtr->workHead; rPtr; rPtr = rPtr->nextPtr) {
1719-
ckfree(rPtr->script);
1721+
for (rPtr = tpoolPtr->workHead; rPtr; rPtr = tpoolPtr->workHead) {
1722+
tpoolPtr->workHead = rPtr->nextPtr;
1723+
if (rPtr->script) {
1724+
ckfree(rPtr->script);
1725+
}
17201726
ckfree((char *)rPtr);
17211727
}
17221728
Tcl_MutexFinalize(&tpoolPtr->mutex);

0 commit comments

Comments
 (0)