diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-08-06 20:29:56 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-08-06 20:29:56 (GMT) |
commit | a0ceb731fb8bbd4aeefdb25b7aa9d5fa7abed5f9 (patch) | |
tree | db12e3aab0d1a9c340a243d5c6fab8cfe26ee6d5 /Modules/_io | |
parent | 5a5453978fbe389b910450eded53456c233f6650 (diff) | |
download | cpython-a0ceb731fb8bbd4aeefdb25b7aa9d5fa7abed5f9.zip cpython-a0ceb731fb8bbd4aeefdb25b7aa9d5fa7abed5f9.tar.gz cpython-a0ceb731fb8bbd4aeefdb25b7aa9d5fa7abed5f9.tar.bz2 |
Merged revisions 74336 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r74336 | antoine.pitrou | 2009-08-06 22:18:29 +0200 (jeu., 06 août 2009) | 8 lines
Issue #6629: Fix a data corruption issue in the new `io` package, which could
occur when writing to a BufferedRandom object (e.g. a file opened in "rb+" or
"wb+" mode) after having buffered a certain amount of data for reading. This
bug was not present in the pure Python implementation.
Yes, this is a serious issue.
........
Diffstat (limited to 'Modules/_io')
-rw-r--r-- | Modules/_io/bufferedio.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 98f8413..d8b6471 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1757,6 +1757,19 @@ bufferedwriter_write(buffered *self, PyObject *args) } Py_CLEAR(res); + /* Adjust the raw stream position if it is away from the logical stream + position. This happens if the read buffer has been filled but not + modified (and therefore _bufferedwriter_flush_unlocked() didn't rewind + the raw stream by itself). + Fixes issue #6629. + */ + n = RAW_OFFSET(self); + if (n != 0) { + if (_buffered_raw_seek(self, -n, 1) < 0) + goto error; + self->raw_pos -= n; + } + /* Then write buf itself. At this point the buffer has been emptied. */ remaining = buf.len; written = 0; |