diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-12-21 21:26:09 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-12-21 21:26:09 (GMT) |
commit | 6cfc5124f2a615922d32ac19a319ffab8edaad0f (patch) | |
tree | 1d6b68e8021f9e1e10d7b32fad7708e39f4b30de | |
parent | 9fc6b6c4536417283c6f52b6dfb4c82afb372448 (diff) | |
download | cpython-6cfc5124f2a615922d32ac19a319ffab8edaad0f.zip cpython-6cfc5124f2a615922d32ac19a319ffab8edaad0f.tar.gz cpython-6cfc5124f2a615922d32ac19a319ffab8edaad0f.tar.bz2 |
Merged revisions 87427 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87427 | antoine.pitrou | 2010-12-21 22:20:59 +0100 (mar., 21 déc. 2010) | 3 lines
Issue #10750: The `raw` attribute of buffered IO objects is now read-only.
........
-rw-r--r-- | Lib/_pyio.py | 20 | ||||
-rw-r--r-- | Lib/test/test_io.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_io/bufferedio.c | 6 |
4 files changed, 32 insertions, 9 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 4485233..b350bd4 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -674,7 +674,7 @@ class _BufferedIOMixin(BufferedIOBase): """ def __init__(self, raw): - self.raw = raw + self._raw = raw ### Positioning ### @@ -718,8 +718,8 @@ class _BufferedIOMixin(BufferedIOBase): if self.raw is None: raise ValueError("raw stream already detached") self.flush() - raw = self.raw - self.raw = None + raw = self._raw + self._raw = None return raw ### Inquiries ### @@ -734,6 +734,10 @@ class _BufferedIOMixin(BufferedIOBase): return self.raw.writable() @property + def raw(self): + return self._raw + + @property def closed(self): return self.raw.closed @@ -1444,7 +1448,7 @@ class TextIOWrapper(TextIOBase): if not isinstance(errors, str): raise ValueError("invalid errors: %r" % errors) - self.buffer = buffer + self._buffer = buffer self._line_buffering = line_buffering self._encoding = encoding self._errors = errors @@ -1499,6 +1503,10 @@ class TextIOWrapper(TextIOBase): def line_buffering(self): return self._line_buffering + @property + def buffer(self): + return self._buffer + def seekable(self): return self._seekable @@ -1713,8 +1721,8 @@ class TextIOWrapper(TextIOBase): if self.buffer is None: raise ValueError("buffer is already detached") self.flush() - buffer = self.buffer - self.buffer = None + buffer = self._buffer + self._buffer = None return buffer def seek(self, cookie, whence=0): diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index ab8479d..5f62494 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -693,6 +693,13 @@ class CommonBufferedTests: b.close() self.assertRaises(ValueError, b.flush) + def test_readonly_attributes(self): + raw = self.MockRawIO() + buf = self.tp(raw) + x = self.MockRawIO() + with self.assertRaises(AttributeError): + buf.raw = x + class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): read_mode = "rb" @@ -2210,6 +2217,12 @@ class TextIOWrapperTest(unittest.TestCase): txt.close() self.assertRaises(ValueError, txt.flush) + def test_readonly_attributes(self): + txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii") + buf = self.BytesIO(self.testdata) + with self.assertRaises(AttributeError): + txt.buffer = buf + class CTextIOWrapperTest(TextIOWrapperTest): def test_initialization(self): @@ -24,6 +24,8 @@ Core and Builtins Library ------- +- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only. + - Issue #6791: Limit header line length (to 65535 bytes) in http.client and http.server, to avoid denial of services from the other party. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 11bc0b6..71c4052 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1500,7 +1500,7 @@ static PyMethodDef bufferedreader_methods[] = { }; static PyMemberDef bufferedreader_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} }; @@ -1882,7 +1882,7 @@ static PyMethodDef bufferedwriter_methods[] = { }; static PyMemberDef bufferedwriter_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} }; @@ -2272,7 +2272,7 @@ static PyMethodDef bufferedrandom_methods[] = { }; static PyMemberDef bufferedrandom_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} }; |