diff options
author | dgp <dgp@users.sourceforge.net> | 2014-04-25 17:34:11 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2014-04-25 17:34:11 (GMT) |
commit | 0781259dd17444340c1a926c4cd2b5ade72bfebe (patch) | |
tree | 98d9db2e41a67bb86585de1fa5cb5bd1e83b0074 | |
parent | 790e5adaf4cabf6c9dcaa3d109427dbe18f786ff (diff) | |
download | tcl-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.c | 5 | ||||
-rw-r--r-- | tests/ioTrans.test | 20 |
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 { |