Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Lib/test/test_io/test_bufferedio.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from collections import deque, UserList
from itertools import cycle, count
from test import support
from test.support import check_sanitizer
Comment thread
hyongtao-code marked this conversation as resolved.
Outdated
from test.support import os_helper, threading_helper
from .utils import byteslike, CTestCase, PyTestCase

Expand Down Expand Up @@ -623,6 +624,22 @@ def test_bad_readinto_type(self):
bufio.readline()
self.assertIsInstance(cm.exception.__cause__, TypeError)

@unittest.skipUnless(sys.maxsize > 2**32, 'requires 64bit platform')
Comment thread
hyongtao-code marked this conversation as resolved.
@unittest.skipIf(check_sanitizer(thread=True),
Comment thread
sobolevn marked this conversation as resolved.
'ThreadSanitizer aborts on huge allocations (exit code 66).')
def test_read1_error_does_not_cause_reentrant_failure(self):
Comment thread
sobolevn marked this conversation as resolved.
self.addCleanup(os_helper.unlink, os_helper.TESTFN)
with self.open(os_helper.TESTFN, "wb") as f:
f.write(b"hello")

with self.open(os_helper.TESTFN, "rb", buffering=0) as raw:
bufio = self.tp(raw, buffer_size=8)
huge = 10**18
Comment thread
sobolevn marked this conversation as resolved.
Outdated
with self.assertRaises(MemoryError):
bufio.read1(huge)

self.assertEqual(bufio.read1(1), b"h")
Comment thread
hyongtao-code marked this conversation as resolved.


class PyBufferedReaderTest(BufferedReaderTest, PyTestCase):
tp = pyio.BufferedReader
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix :meth:`io.BufferedReader.read1` state cleanup on buffer allocation failure.
1 change: 1 addition & 0 deletions Modules/_io/bufferedio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1073,6 +1073,7 @@ _io__Buffered_read1_impl(buffered *self, Py_ssize_t n)

PyBytesWriter *writer = PyBytesWriter_Create(n);
if (writer == NULL) {
LEAVE_BUFFERED(self)
return NULL;
}

Expand Down
Loading