summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2014-04-25 17:34:11 (GMT)
committerdgp <dgp@users.sourceforge.net>2014-04-25 17:34:11 (GMT)
commit0781259dd17444340c1a926c4cd2b5ade72bfebe (patch)
tree98d9db2e41a67bb86585de1fa5cb5bd1e83b0074
parent790e5adaf4cabf6c9dcaa3d109427dbe18f786ff (diff)
downloadtcl-0781259dd17444340c1a926c4cd2b5ade72bfebe.zip
tcl-0781259dd17444340c1a926c4cd2b5ade72bfebe.tar.gz
tcl-0781259dd17444340c1a926c4cd2b5ade72bfebe.tar.bz2
Test iortrans-4.8.2 demos an infinite loop. Possible trouble with
pushback buffers.
-rw-r--r--generic/tclIO.c5
-rw-r--r--tests/ioTrans.test20
2 files changed, 25 insertions, 0 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index e6439ef..41ac1e1 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -5611,6 +5611,11 @@ DoReadChars(
ResetFlag(statePtr, CHANNEL_BLOCKED);
}
result = GetInput(chanPtr);
+if (chanPtr != statePtr->topChanPtr) {
+Tcl_Release(chanPtr);
+chanPtr = statePtr->topChanPtr;
+Tcl_Preserve(chanPtr);
+}
if (result != 0) {
if (result == EAGAIN) {
break;
diff --git a/tests/ioTrans.test b/tests/ioTrans.test
index b21d894..3bbd170 100644
--- a/tests/ioTrans.test
+++ b/tests/ioTrans.test
@@ -559,6 +559,26 @@ test iortrans-4.8.1 {chan read, bug 721ec69271} -setup {
rename foo {}
} -result {{read rt* {test data
}} file*}
+test iortrans-4.8.2 {chan read, bug 721ec69271} -setup {
+ set res {}
+} -match glob -body {
+ proc foo {fd args} {
+ handle.initialize
+ handle.finalize
+ lappend ::res $args
+ # Kill and recreate transform while it is operating
+ chan pop $fd
+ chan push $fd [list foo $fd]
+ return x
+ }
+ set c [chan push [set c [tempchan]] [list foo $c]]
+ chan configure $c -buffersize 1
+ lappend res [read $c]
+} -cleanup {
+ tempdone
+ rename foo {}
+} -result {{read rt* {test data
+}} file*}
test iortrans-4.9 {chan read, gets, bug 2921116} -setup {
set res {}
} -match glob -body {