summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2014-05-06 13:56:29 (GMT)
committerdgp <dgp@users.sourceforge.net>2014-05-06 13:56:29 (GMT)
commit0fc3bdcc7e6bd2903a1e84017073bf39dff8a3ad (patch)
treefa61f6d0b9e13e6360d0df2d9abb116cbb1768d7 /generic
parent7d27109da91753ce0ed031d0c7c3eb095b0b7fed (diff)
downloadtcl-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.c15
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(