diff options
author | dgp <dgp@users.sourceforge.net> | 2014-05-06 14:10:57 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2014-05-06 14:10:57 (GMT) |
commit | 738fe7424e7be63a02664f8cef5ccefe0b0974c1 (patch) | |
tree | ec1c3bc670e24677d30b90950c4a69d2716f9fff /generic | |
parent | 684f4f5c83268d2894a7606620e81f0ca87e5a17 (diff) | |
parent | 0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad (diff) | |
download | tcl-738fe7424e7be63a02664f8cef5ccefe0b0974c1.zip tcl-738fe7424e7be63a02664f8cef5ccefe0b0974c1.tar.gz tcl-738fe7424e7be63a02664f8cef5ccefe0b0974c1.tar.bz2 |
merge 8.5
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclIOGT.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/generic/tclIOGT.c b/generic/tclIOGT.c index beddf4f..c5372b1 100644 --- a/generic/tclIOGT.c +++ b/generic/tclIOGT.c @@ -298,7 +298,6 @@ TclChannelTransform( } Tcl_DStringFree(&ds); - dataPtr->self = chan; dataPtr->watchMask = 0; dataPtr->mode = mode; dataPtr->timer = NULL; @@ -317,6 +316,7 @@ TclChannelTransform( ReleaseData(dataPtr); return TCL_ERROR; } + Tcl_Preserve(dataPtr->self); /* * At last initialize the transformation at the script level. @@ -437,6 +437,9 @@ ExecuteCallback( break; case TRANSMIT_DOWN: + if (dataPtr->self == NULL) { + break; + } resObj = Tcl_GetObjResult(eval); resBuf = Tcl_GetByteArrayFromObj(resObj, &resLen); Tcl_WriteRaw(Tcl_GetStackedChannel(dataPtr->self), (char *) resBuf, @@ -444,6 +447,9 @@ ExecuteCallback( break; case TRANSMIT_SELF: + if (dataPtr->self == NULL) { + break; + } resObj = Tcl_GetObjResult(eval); resBuf = Tcl_GetByteArrayFromObj(resObj, &resLen); Tcl_WriteRaw(dataPtr->self, (char *) resBuf, resLen); @@ -579,6 +585,8 @@ TransformCloseProc( * General cleanup. */ + Tcl_Release(dataPtr->self); + dataPtr->self = NULL; ReleaseData(dataPtr); return TCL_OK; } @@ -614,7 +622,7 @@ TransformInputProc( * Should assert(dataPtr->mode & TCL_READABLE); */ - if (toRead == 0) { + if (toRead == 0 || dataPtr->self == NULL) { /* * Catch a no-op. */ @@ -1083,6 +1091,9 @@ TransformWatchProc( * unchanged. */ + if (dataPtr->self == NULL) { + return; + } downChan = Tcl_GetStackedChannel(dataPtr->self); Tcl_GetChannelType(downChan)->watchProc( |