summaryrefslogtreecommitdiffstats
path: root/generic
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)
commit4e43d260f93216348337518eaead94855b2dadbf (patch)
tree762430a7fc603752093d3196463ead7acb41a3c3 /generic
parent9583d3790107a8b094e98be8b587b484eed858c3 (diff)
downloadtcl-4e43d260f93216348337518eaead94855b2dadbf.zip
tcl-4e43d260f93216348337518eaead94855b2dadbf.tar.gz
tcl-4e43d260f93216348337518eaead94855b2dadbf.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.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclIO.c17
1 files changed, 12 insertions, 5 deletions
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: