summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-12-21 21:26:09 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-12-21 21:26:09 (GMT)
commit6cfc5124f2a615922d32ac19a319ffab8edaad0f (patch)
tree1d6b68e8021f9e1e10d7b32fad7708e39f4b30de
parent9fc6b6c4536417283c6f52b6dfb4c82afb372448 (diff)
downloadcpython-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.py20
-rw-r--r--Lib/test/test_io.py13
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_io/bufferedio.c6
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):
diff --git a/Misc/NEWS b/Misc/NEWS
index 0ff81de..6a216edc 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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}
};