diff options
author | Antoine Pitrou <pitrou@free.fr> | 2018-01-28 17:42:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-28 17:42:31 (GMT) |
commit | 1d896ed2cddada4455f40782e4120249defbfa70 (patch) | |
tree | 622344d12b5c4ebd59fccc346103c17a928e9e1e /Modules | |
parent | 33febfb03998598a35f97b4ef66d33a2d43716cd (diff) | |
download | cpython-1d896ed2cddada4455f40782e4120249defbfa70.zip cpython-1d896ed2cddada4455f40782e4120249defbfa70.tar.gz cpython-1d896ed2cddada4455f40782e4120249defbfa70.tar.bz2 |
[3.6] bpo-32228: Reset raw_pos after unwinding the raw stream (GH-4858) (#5389)
Ensure that ``truncate()`` preserves the file position (as reported by ``tell()``) after writes longer than the buffer size..
(cherry picked from commit 059f58ce938d9c3f0286412a4efb1b9131339421)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_io/bufferedio.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index efc7d05..3235581 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1311,7 +1311,6 @@ _io__Buffered_seek_impl(buffered *self, PyObject *targetobj, int whence) if (res == NULL) goto end; Py_CLEAR(res); - _bufferedwriter_reset_buf(self); } /* TODO: align on block boundary and read buffer if needed? */ @@ -1878,8 +1877,6 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len) return n; } -/* `restore_pos` is 1 if we need to restore the raw stream position at - the end, 0 otherwise. */ static PyObject * _bufferedwriter_flush_unlocked(buffered *self) { @@ -1920,9 +1917,18 @@ _bufferedwriter_flush_unlocked(buffered *self) goto error; } - _bufferedwriter_reset_buf(self); end: + /* This ensures that after return from this function, + VALID_WRITE_BUFFER(self) returns false. + + This is a required condition because when a tell() is called + after flushing and if VALID_READ_BUFFER(self) is false, we need + VALID_WRITE_BUFFER(self) to be false to have + RAW_OFFSET(self) == 0. + + Issue: https://bugs.python.org/issue32228 */ + _bufferedwriter_reset_buf(self); Py_RETURN_NONE; error: |