diff options
author | andreas_kupries <akupries@shaw.ca> | 2009-11-12 17:03:02 (GMT) |
---|---|---|
committer | andreas_kupries <akupries@shaw.ca> | 2009-11-12 17:03:02 (GMT) |
commit | 149c559c4ffb00de0474db934d2565ffbec3740e (patch) | |
tree | 10ebf78bfca1a1313bf0a7761dcd34b855cab375 | |
parent | 0eac2b72b2ceafb70151fdbbab83d1853aa98aca (diff) | |
download | tcl-149c559c4ffb00de0474db934d2565ffbec3740e.zip tcl-149c559c4ffb00de0474db934d2565ffbec3740e.tar.gz tcl-149c559c4ffb00de0474db934d2565ffbec3740e.tar.bz2 |
* 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.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclIO.c | 23 |
2 files changed, 20 insertions, 10 deletions
@@ -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. |