summaryrefslogtreecommitdiffstats
path: root/generic/tclIORChan.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2014-05-09 13:33:27 (GMT)
committerdgp <dgp@users.sourceforge.net>2014-05-09 13:33:27 (GMT)
commitfbab4e790df526d0da43a1122d1cca31cfd24e66 (patch)
treee100a9dd09c5eefd4e813b1d2574ed68490f5f7d /generic/tclIORChan.c
parentc9eee4b29ab5763b1c99d721139fa5b7180721ba (diff)
parentd28769d37874fb207bec2ac0d3c8206c7ab566f8 (diff)
downloadtcl-fbab4e790df526d0da43a1122d1cca31cfd24e66.zip
tcl-fbab4e790df526d0da43a1122d1cca31cfd24e66.tar.gz
tcl-fbab4e790df526d0da43a1122d1cca31cfd24e66.tar.bz2
Test iocmd-32.1 is not "impossible" but after writing it properly it does segfault trying to use a deleted interp. Fixed.
Diffstat (limited to 'generic/tclIORChan.c')
-rw-r--r--generic/tclIORChan.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c
index 0b462c4..6a43441 100644
--- a/generic/tclIORChan.c
+++ b/generic/tclIORChan.c
@@ -450,8 +450,8 @@ static const char *msg_write_nothing = "{write wrote nothing}";
static const char *msg_seek_beforestart = "{Tried to seek before origin}";
#ifdef TCL_THREADS
static const char *msg_send_originlost = "{Channel thread lost}";
-static const char *msg_send_dstlost = "{Owner lost}";
#endif /* TCL_THREADS */
+static const char *msg_send_dstlost = "{Owner lost}";
static const char *msg_dstlost = "-code 1 -level 0 -errorcode NONE -errorinfo {} -errorline 1 {Owner lost}";
/*
@@ -1397,6 +1397,7 @@ ReflectOutput(
/* ASSERT: rcPtr->mode & TCL_WRITABLE */
Tcl_Preserve(rcPtr);
+ Tcl_Preserve(rcPtr->interp);
bufObj = Tcl_NewByteArrayObj((unsigned char *) buf, toWrite);
Tcl_IncrRefCount(bufObj);
@@ -1413,6 +1414,14 @@ ReflectOutput(
goto invalid;
}
+ if (Tcl_InterpDeleted(rcPtr->interp)) {
+ /*
+ * The interp was destroyed during InvokeTclMethod().
+ */
+
+ SetChannelErrorStr(rcPtr->chan, msg_send_dstlost);
+ goto invalid;
+ }
if (Tcl_GetIntFromObj(rcPtr->interp, resObj, &written) != TCL_OK) {
Tcl_SetChannelError(rcPtr->chan, MarshallError(rcPtr->interp));
goto invalid;
@@ -1442,6 +1451,7 @@ ReflectOutput(
stop:
Tcl_DecrRefCount(bufObj);
Tcl_DecrRefCount(resObj); /* Remove reference held from invoke */
+ Tcl_Release(rcPtr->interp);
Tcl_Release(rcPtr);
return written;
invalid: