summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2018-01-28 17:42:31 (GMT)
committerGitHub <noreply@github.com>2018-01-28 17:42:31 (GMT)
commit1d896ed2cddada4455f40782e4120249defbfa70 (patch)
tree622344d12b5c4ebd59fccc346103c17a928e9e1e /Modules
parent33febfb03998598a35f97b4ef66d33a2d43716cd (diff)
downloadcpython-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.c14
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: