summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2025-06-17 16:06:02 (GMT)
committerdgp <dgp@users.sourceforge.net>2025-06-17 16:06:02 (GMT)
commitec6493f2b8337529026bd3dbecfd8e19b9550d76 (patch)
treeff30dd6c17dfcd11d9d961538b492b648973a447
parent74867b094cd985a524abead929ae1d952497aee4 (diff)
parentf07a0838c24852b4b3c981d159eb4ab6e0e9c52e (diff)
downloadtcl-ec6493f2b8337529026bd3dbecfd8e19b9550d76.zip
tcl-ec6493f2b8337529026bd3dbecfd8e19b9550d76.tar.gz
tcl-ec6493f2b8337529026bd3dbecfd8e19b9550d76.tar.bz2
[da5e1bc7bc] exec channel not closed on errors
-rw-r--r--generic/tclIOCmd.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/generic/tclIOCmd.c b/generic/tclIOCmd.c
index 485812f..bd3a462 100644
--- a/generic/tclIOCmd.c
+++ b/generic/tclIOCmd.c
@@ -948,8 +948,16 @@ Tcl_ExecObjCmd(
Tcl_SetResult(interp, "No value given for option -encoding.",
TCL_STATIC);
return TCL_ERROR;
+ } else {
+ Tcl_Encoding encoding;
+ encodingObj = objv[skip];
+ /* Verify validity - bug [da5e1bc7bc] */
+ if (Tcl_GetEncodingFromObj(interp, encodingObj, &encoding)
+ != TCL_OK) {
+ return TCL_ERROR;
+ }
+ Tcl_FreeEncoding(encoding);
}
- encodingObj = objv[skip];
break;
}
}
@@ -1014,16 +1022,14 @@ Tcl_ExecObjCmd(
/* Bug [0f1ddc0df7] - encoding errors - use replace profile */
if (Tcl_SetChannelOption(interp, chan, "-profile", "replace") != TCL_OK) {
- return TCL_ERROR;
+ goto errorWithOpenChannel;
}
/* TIP 716 */
- if (encodingObj) {
- if (Tcl_SetChannelOption(
- interp, chan, "-encoding", Tcl_GetString(encodingObj)) !=
- TCL_OK) {
- return TCL_ERROR;
- }
+ if (encodingObj &&
+ Tcl_SetChannelOption(interp, chan, "-encoding",
+ Tcl_GetString(encodingObj)) != TCL_OK) {
+ goto errorWithOpenChannel;
}
TclNewObj(resultPtr);
@@ -1042,7 +1048,7 @@ Tcl_ExecObjCmd(
Tcl_PosixError(interp)));
Tcl_DecrRefCount(resultPtr);
}
- return TCL_ERROR;
+ goto errorWithOpenChannel;
}
}
@@ -1069,6 +1075,11 @@ Tcl_ExecObjCmd(
Tcl_SetObjResult(interp, resultPtr);
return result;
+
+errorWithOpenChannel:
+ /* Interpreter should already contain error. Pass NULL to not overwrite */
+ (void)Tcl_CloseEx(NULL, chan, 0);
+ return TCL_ERROR;
}
/*