Attachment "fcopy-fix-simpler.patch" to
ticket [2895565fff]
added by
andreas_kupries
2009-11-12 23:59:39.
Index: generic/tclIO.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclIO.c,v
retrieving revision 1.137.2.14
diff -w -u -r1.137.2.14 tclIO.c
--- generic/tclIO.c 11 Nov 2009 00:04:27 -0000 1.137.2.14
+++ generic/tclIO.c 12 Nov 2009 16:57:14 -0000
@@ -8726,15 +8726,18 @@
sizeb = DoWriteChars(outStatePtr->topChanPtr, buffer, sizeb);
}
- if (inBinary || sameEncoding) {
/*
- * Both read and write counted bytes.
+ * [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.
*/
- size = sizeb;
- } /* else: Read counted characters, write counted bytes, i.e.
- * size != sizeb */
-
if (sizeb < 0) {
writeError:
if (interp) {
@@ -8755,7 +8758,7 @@
}
/*
- * 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.