summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandreas_kupries <akupries@shaw.ca>2009-11-12 17:41:30 (GMT)
committerandreas_kupries <akupries@shaw.ca>2009-11-12 17:41:30 (GMT)
commitb2b8497dcdba3f96cd1cd286c39c0f0262489f68 (patch)
tree762430a7fc603752093d3196463ead7acb41a3c3
parent36ee8f97a7bc35cc7b82bb990738895b85fedff2 (diff)
downloadtcl-b2b8497dcdba3f96cd1cd286c39c0f0262489f68.zip
tcl-b2b8497dcdba3f96cd1cd286c39c0f0262489f68.tar.gz
tcl-b2b8497dcdba3f96cd1cd286c39c0f0262489f68.tar.bz2
* 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 backward port from the 8.5 branch.
-rw-r--r--ChangeLog9
-rw-r--r--generic/tclIO.c17
-rw-r--r--tests/io.test33
3 files changed, 52 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index aa1f3ac..40bda77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-11-12 Andreas Kupries <andreask@activestate.com>
+
+ * 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 backward port from the 8.5 branch.
+
2009-11-10 Pat Thoyts <patthoyts@users.sourceforge.net>
* tests/fCmd.test: Fixed a number of issues for Vista
@@ -11,7 +18,7 @@
2009-11-10 Andreas Kupries <andreask@activestate.com>
- * generic/tclObj.c: Plus memory leak in TclContinuationsEnter().
+ * generic/tclObj.c: Plug memory leak in TclContinuationsEnter().
[Bug 2895323]. Backport from Tcl 8.5 branch, change by Don Porter.
2009-11-09 Andreas Kupries <andreask@activestate.com>
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 11cb205..c6d5c36 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.61.2.33 2009/10/23 19:08:45 andreas_kupries Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.61.2.34 2009/11/12 17:41:30 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -7936,10 +7936,17 @@ CopyData(csPtr, mask)
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 1a0f72e..9c94864 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.40.2.23 2008/06/20 16:49:11 dgp Exp $
+# RCS: @(#) $Id: io.test,v 1.40.2.24 2009/11/12 17:41:31 andreas_kupries Exp $
if {[catch {package require tcltest 2}]} {
puts stderr "Skipping tests in [info script]. tcltest 2 required."
@@ -7158,6 +7158,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