From 0ff9c6a9c918c519b765feaa5c09bf489290d50c Mon Sep 17 00:00:00 2001 From: andreas_kupries Date: Thu, 12 Nov 2009 17:25:18 +0000 Subject: * generic/tclIO.c (CopyData): [Bug 2895565]. Dropped bogosity * tests/io.test: which used the number of _written_ bytes or character to update the counters for the read bytes/characters. New test io-53.11. This is a forward port from the 8.5 branch. --- ChangeLog | 7 +++++++ generic/tclIO.c | 21 ++++++++++++--------- tests/io.test | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5fea35..7757b62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-11-12 Andreas Kupries + + * generic/tclIO.c (CopyData): [Bug 2895565]. Dropped bogosity + * tests/io.test: which used the number of _written_ bytes or + character to update the counters for the read bytes/characters. + New test io-53.11. This is a forward port from the 8.5 branch. + 2009-11-11 Don Porter * generic/tclClock.c (TclClockInit): Do not create [clock] support diff --git a/generic/tclIO.c b/generic/tclIO.c index e295c82..e8d231a 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIO.c,v 1.166 2009/11/10 23:50:17 ferrieux Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.167 2009/11/12 17:25:18 andreas_kupries Exp $ */ #include "tclInt.h" @@ -9092,14 +9092,17 @@ CopyData( sizeb = DoWriteChars(outStatePtr->topChanPtr, buffer, sizeb); } - if (inBinary || sameEncoding) { - /* - * Both read and write counted bytes. - */ - - size = sizeb; - } /* else: Read counted characters, write counted bytes, i.e. - * size != sizeb */ + /* + * [Bug 2895565]. At this point 'size' still contains the number of + * bytes or characters which have been read. We keep this to later to + * update the totals and toRead information, see marker (UP) below. We + * must not overwrite it with 'sizeb', which is the number of written + * bytes or characters, and both EOL translation and encoding + * conversion may have changed this number unpredictably in relation + * to 'size' (It can be smaller or larger, in the latter case able to + * drive toRead below -1, causing infinite looping). Completely + * unsuitable for updating totals and toRead. + */ if (sizeb < 0) { writeError: diff --git a/tests/io.test b/tests/io.test index 0ab8909..1ad9f6e 100644 --- a/tests/io.test +++ b/tests/io.test @@ -13,7 +13,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: io.test,v 1.93 2008/12/19 17:07:47 dgp Exp $ +# RCS: @(#) $Id: io.test,v 1.94 2009/11/12 17:25:18 andreas_kupries Exp $ if {[catch {package require tcltest 2}]} { puts stderr "Skipping tests in [info script]. tcltest 2 required." @@ -7126,6 +7126,37 @@ test io-53.10 {Bug 1350564, multi-directional fcopy} -setup { removeFile err catch {unset ::forever} } -result {AB BA} +test io-53.11 {Bug 2895565} -setup { + set in [makeFile {} in] + set f [open $in w] + fconfigure $f -encoding utf-8 -translation binary + puts -nonewline $f [string repeat "Ho hum\n" 11] + close $f + set inChan [open $in r] + fconfigure $inChan -translation binary + set out [makeFile {} out] + set outChan [open $out w] + fconfigure $outChan -encoding cp1252 -translation crlf + proc CopyDone {bytes args} { + variable done + if {[llength $args]} { + set done "Error: '[lindex $args 0]' after $bytes bytes copied" + } else { + set done "$bytes bytes copied" + } + } +} -body { + variable done + after 2000 [list set [namespace which -variable done] timeout] + fcopy $inChan $outChan -size 40 -command [namespace which CopyDone] + vwait [namespace which -variable done] + set done +} -cleanup { + close $outChan + close $inChan + removeFile out + removeFile in +} -result {40 bytes copied} test io-54.1 {Recursive channel events} {socket fileevent} { # This test checks to see if file events are delivered during recursive -- cgit v0.12