summaryrefslogtreecommitdiffstats
path: root/generic/tclIOGT.c
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)
commitba89a15d53a14ebf8bd49c38ce10a665f6f26181 (patch)
treefa61f6d0b9e13e6360d0df2d9abb116cbb1768d7 /generic/tclIOGT.c
parentb8c001575a86863e6ee5002f7232c8f9cab7b274 (diff)
downloadtcl-ba89a15d53a14ebf8bd49c38ce10a665f6f26181.zip
tcl-ba89a15d53a14ebf8bd49c38ce10a665f6f26181.tar.gz
tcl-ba89a15d53a14ebf8bd49c38ce10a665f6f26181.tar.bz2
Have to manage the lifetime of the self handle in testchannel transform.
Diffstat (limited to 'generic/tclIOGT.c')
-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(