summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--generic/tclIO.c23
2 files changed, 20 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index bc57886..3904bed 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
+ which used the number of _written_ bytes or character to update
+ the counters for the read bytes/characters. See last entry for the
+ test case.
+
2009-11-12 Don Porter <dgp@users.sourceforge.net>
*** 8.5.8 TAGGED FOR RELEASE ***
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 2b57079..b072cbf 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.137.2.14 2009/11/11 00:04:27 ferrieux Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.137.2.15 2009/11/12 17:03:02 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -8726,14 +8726,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:
@@ -8755,7 +8758,7 @@ CopyData(
}
/*
- * Update the current byte count. Do it now so the count is valid
+ * (UP) Update the current byte count. Do it now so the count is valid
* before a return or break takes us out of the loop. The invariant at
* the top of the loop should be that csPtr->toRead holds the number
* of bytes left to copy.