Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix for [eabcbd08274f2d22], [read] error persists on channel with strict encoding after encoding is changed to binary. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | main |
Files: | files | file ages | folders |
SHA3-256: |
3fa3d488747890327e49b68adb5cf679 |
User & Date: | pooryorick 2023-04-16 23:10:16.303 |
References
2023-04-16
| ||
23:11 | • Ticket [eabcbd0827] read error persists on channel with strict encoding after encoding is changed to binary status still Open with 3 other changes artifact: 9c0bb685db user: pooryorick | |
Context
2023-04-17
| ||
12:12 | Correct some test descriptions in encoding.test. check-in: f9c8bbde44 user: pooryorick tags: trunk, main | |
2023-04-16
| ||
23:10 | Fix for [eabcbd08274f2d22], [read] error persists on channel with strict encoding after encoding is ... check-in: 3fa3d48874 user: pooryorick tags: trunk, main | |
18:08 | Merge 8.7 check-in: d900f1e009 user: jan.nijtmans tags: trunk, main | |
Changes
Changes to generic/tclIO.c.
︙ | ︙ | |||
4612 4613 4614 4615 4616 4617 4618 | Tcl_Size oldLength; Tcl_Encoding encoding; char *dst, *dstEnd, *eol, *eof; Tcl_EncodingState oldState; if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR)) { UpdateInterest(chanPtr); | | | 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 | Tcl_Size oldLength; Tcl_Encoding encoding; char *dst, *dstEnd, *eol, *eof; Tcl_EncodingState oldState; if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR)) { UpdateInterest(chanPtr); ResetFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED); Tcl_SetErrno(EILSEQ); return TCL_INDEX_NONE; } if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) { return TCL_INDEX_NONE; } |
︙ | ︙ | |||
5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 | int result; Tcl_Encoding encoding = statePtr->encoding; int binaryMode; #define UTF_EXPANSION_FACTOR 1024 int factor = UTF_EXPANSION_FACTOR; if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR)) { /* TODO: We don't need this call? */ UpdateInterest(chanPtr); Tcl_SetErrno(EILSEQ); return -1; } /* * Early out when next read will see eofchar. | > | 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 | int result; Tcl_Encoding encoding = statePtr->encoding; int binaryMode; #define UTF_EXPANSION_FACTOR 1024 int factor = UTF_EXPANSION_FACTOR; if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR)) { ResetFlag(statePtr, CHANNEL_EOF|CHANNEL_STICKY_EOF|CHANNEL_BLOCKED); /* TODO: We don't need this call? */ UpdateInterest(chanPtr); Tcl_SetErrno(EILSEQ); return -1; } /* * Early out when next read will see eofchar. |
︙ | ︙ | |||
6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 | /* This must comes after UpdateInterest(), which may set errno */ if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR) && (!copied || !GotFlag(statePtr, CHANNEL_NONBLOCKING))) { /* Channel either is blocking or is nonblocking with no data * succesfully red before the error. Return an error so that callers * like [read] can also return an error. */ Tcl_SetErrno(EILSEQ); copied = -1; } TclChannelRelease((Tcl_Channel)chanPtr); return copied; } | > | 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 | /* This must comes after UpdateInterest(), which may set errno */ if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR) && (!copied || !GotFlag(statePtr, CHANNEL_NONBLOCKING))) { /* Channel either is blocking or is nonblocking with no data * succesfully red before the error. Return an error so that callers * like [read] can also return an error. */ ResetFlag(statePtr, CHANNEL_EOF|CHANNEL_ENCODING_ERROR); Tcl_SetErrno(EILSEQ); copied = -1; } TclChannelRelease((Tcl_Channel)chanPtr); return copied; } |
︙ | ︙ |
Changes to tests/io.test.
︙ | ︙ | |||
9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 | lappend hd [eof $f] lappend hd [read $f] close $f set hd } -cleanup { removeFile io-75.8 } -result {41 1 {}} test io-75.9 {unrepresentable character write passes and is replaced by ?} -setup { set fn [makeFile {} io-75.9] set f [open $fn w+] fconfigure $f -encoding iso8859-1 -profile strict } -body { catch {puts -nonewline $f "A\u2022"} msg | > > > > > > > > > > > > > > > > > > > > > > > > | 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 | lappend hd [eof $f] lappend hd [read $f] close $f set hd } -cleanup { removeFile io-75.8 } -result {41 1 {}} test io-75.8.eoflater {invalid utf-8 encoding eof handling (-profile strict)} -setup { set res {} set fn [makeFile {} io-75.8] set f [open $fn w+] fconfigure $f -encoding binary # \x81 is invalid in utf-8. -eofchar is not detected, because it comes later. puts -nonewline $f A\x81\x1A flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none -eofchar \x1A \ -translation lf -profile strict } -body { after 1 set status [catch {read $f} cres copts] lappend res $status lappend res [eof $f] chan configure $f -encoding iso8859-1 lappend res [read $f] close $f set res } -cleanup { removeFile io-75.8 } -result "1 0 \x81" test io-75.9 {unrepresentable character write passes and is replaced by ?} -setup { set fn [makeFile {} io-75.9] set f [open $fn w+] fconfigure $f -encoding iso8859-1 -profile strict } -body { catch {puts -nonewline $f "A\u2022"} msg |
︙ | ︙ |