Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix for issue [ea69b0258a9833cb], crash when using a channel transformation on TCP client socket. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | core-8-6-branch |
Files: | files | file ages | folders |
SHA3-256: |
a8b8ecbc039fb4e0a7794eb590c3d5a0 |
User & Date: | pooryorick 2023-03-13 19:07:25.166 |
References
2023-03-13
| ||
21:02 | • Pending ticket [ea69b0258a]: Crash when using a channel transformation on TCP client socket plus 4 other changes artifact: 851b534171 user: pooryorick | |
Context
2023-03-14
| ||
10:05 | Add "ucs-2" constraint to encoding-bug-183a1adcc0-5 testcase, otherwise it fails with TCL_UTF_MAX>3.... check-in: 7609a40b91 user: jan.nijtmans tags: core-8-6-branch | |
2023-03-13
| ||
19:07 | Fix for issue [ea69b0258a9833cb], crash when using a channel transformation on TCP client socket. check-in: a8b8ecbc03 user: pooryorick tags: core-8-6-branch | |
13:44 | Bug [183a1adcc0]. Buffer overflow in Tcl_UtfToExternal check-in: 4785751542 user: apnadkarni tags: core-8-6-branch | |
12:22 | Fix for issue [ea69b0258a9833cb], crash when using a channel transformation on TCP client socket. check-in: 052f54ddfb user: pooryorick tags: bug-ea69b0258a9833cb6 | |
Changes
Changes to generic/tclIO.c.
︙ | ︙ | |||
8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 | * events too. This compiles on all platforms, and also passes the * testsuite on all of them. */ mask &= ~TCL_EXCEPTION; if (!statePtr->timer) { statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME, ChannelTimerProc, chanPtr); } } } ChanWatch(chanPtr, mask); } | > | 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 | * events too. This compiles on all platforms, and also passes the * testsuite on all of them. */ mask &= ~TCL_EXCEPTION; if (!statePtr->timer) { TclChannelPreserve((Tcl_Channel)chanPtr); statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME, ChannelTimerProc, chanPtr); } } } ChanWatch(chanPtr, mask); } |
︙ | ︙ | |||
8580 8581 8582 8583 8584 8585 8586 | ChannelTimerProc( ClientData clientData) { Channel *chanPtr = (Channel *)clientData; ChannelState *statePtr = chanPtr->state; /* State info for channel */ | > > > | | | | | | | | | | | | | | | | > > | 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 | ChannelTimerProc( ClientData clientData) { Channel *chanPtr = (Channel *)clientData; ChannelState *statePtr = chanPtr->state; /* State info for channel */ if (chanPtr->typePtr == NULL) { TclChannelRelease((Tcl_Channel)chanPtr); } else { if (!GotFlag(statePtr, CHANNEL_NEED_MORE_DATA) && (statePtr->interestMask & TCL_READABLE) && (statePtr->inQueueHead != NULL) && IsBufferReady(statePtr->inQueueHead)) { /* * Restart the timer in case a channel handler reenters the event loop * before UpdateInterest gets called by Tcl_NotifyChannel. */ statePtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME, ChannelTimerProc,chanPtr); Tcl_Preserve(statePtr); Tcl_NotifyChannel((Tcl_Channel) chanPtr, TCL_READABLE); Tcl_Release(statePtr); } else { statePtr->timer = NULL; UpdateInterest(chanPtr); TclChannelRelease((Tcl_Channel)chanPtr); } } } /* *---------------------------------------------------------------------- * * Tcl_CreateChannelHandler -- |
︙ | ︙ |
Changes to tests/ioTrans.test.
︙ | ︙ | |||
629 630 631 632 633 634 635 636 637 638 639 640 641 642 | if {[string length $result] == 0} { driver finalize $chan } return $result } } } # Channel read transform that is just the identity - pass all through proc idxform {cmd handle args} { switch -- $cmd { initialize { return {initialize finalize read} } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 | if {[string length $result] == 0} { driver finalize $chan } return $result } } } namespace eval reflector { proc initialize {_ chan mode} { return {initialize finalize watch read} } proc finalize {_ chan} { namespace delete $_ } proc read {_ chan count} { namespace upvar $_ source source set res [string range $source 0 $count-1] set source [string range $source $count end] return $res } proc watch {_ chan events} { after 0 [list chan postevent $chan read] return read } namespace ensemble create -parameters _ namespace export * } namespace eval inputfilter { proc initialize {chan mode} { return {initialize finalize read} } proc read {chan buffer} { return $buffer } proc finalize chan { namespace delete $chan } namespace ensemble create namespace export * } # Channel read transform that is just the identity - pass all through proc idxform {cmd handle args} { switch -- $cmd { initialize { return {initialize finalize read} } |
︙ | ︙ | |||
2085 2086 2087 2088 2089 2090 2091 | vwait ::res set res } -cleanup { thread::send $tidb tempdone thread::release $tidb } -result {Owner lost} | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 | vwait ::res set res } -cleanup { thread::send $tidb tempdone thread::release $tidb } -result {Owner lost} test iortrans-ea69b0258a9833cb { Crash when using a channel transformation on TCP client socket "line two" does not make it into result. This issue should probably be addressed, but it is outside the scope of this test. } -setup { set res {} set read 0 } -body { namespace eval reflector1 { variable source "line one\nline two" interp alias {} [namespace current]::dispatch {} [ namespace parent]::reflector [namespace current] } set chan [chan create read [namespace which reflector1::dispatch]] chan configure $chan -blocking 0 chan push $chan inputfilter chan event $chan read [list ::apply [list chan { variable res variable read set gets [gets $chan] append res $gets incr read } [namespace current]] $chan] vwait [namespace current]::read chan pop $chan vwait [namespace current]::read return $res } -cleanup { catch {unset read} close $chan } -result {line one} cleanupTests return |