diff options
author | dgp <dgp@users.sourceforge.net> | 2014-05-06 13:56:29 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2014-05-06 13:56:29 (GMT) |
commit | 0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad (patch) | |
tree | fa61f6d0b9e13e6360d0df2d9abb116cbb1768d7 /generic | |
parent | 7d27109da91753ce0ed031d0c7c3eb095b0b7fed (diff) | |
download | tcl-0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad.zip tcl-0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad.tar.gz tcl-0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad.tar.bz2 |
Have to manage the lifetime of the self handle in testchannel transform.
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( |