[Python-checkins] cpython (merge 3.3 -> default): Issue #17671: Fixed a crash when use non-initialized io.BufferedRWPair.

serhiy.storchaka python-checkins at python.org
Wed Feb 12 09:55:42 CET 2014


http://hg.python.org/cpython/rev/f003ef13c555
changeset: 89169:f003ef13c555
parent: 89166:efaf12106d68
parent: 89168:25ff4625680d
user: Serhiy Storchaka <storchaka at gmail.com>
date: Wed Feb 12 10:55:07 2014 +0200
summary:
 Issue #17671: Fixed a crash when use non-initialized io.BufferedRWPair.
Based on patch by Stephen Tu.
files:
 Lib/test/test_io.py | 38 ++++++++++++++++++++++++++++
 Misc/NEWS | 3 ++
 Modules/_io/bufferedio.c | 9 +++++-
 3 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -855,6 +855,16 @@
 bufio.__init__(rawio)
 self.assertEqual(b"abc", bufio.read())
 
+ def test_uninitialized(self):
+ bufio = self.tp.__new__(self.tp)
+ del bufio
+ bufio = self.tp.__new__(self.tp)
+ self.assertRaisesRegex((ValueError, AttributeError),
+ 'uninitialized|has no attribute',
+ bufio.read, 0)
+ bufio.__init__(self.MockRawIO())
+ self.assertEqual(bufio.read(0), b'')
+
 def test_read(self):
 for arg in (None, 7):
 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
@@ -1106,6 +1116,16 @@
 bufio.flush()
 self.assertEqual(b"".join(rawio._write_stack), b"abcghi")
 
+ def test_uninitialized(self):
+ bufio = self.tp.__new__(self.tp)
+ del bufio
+ bufio = self.tp.__new__(self.tp)
+ self.assertRaisesRegex((ValueError, AttributeError),
+ 'uninitialized|has no attribute',
+ bufio.write, b'')
+ bufio.__init__(self.MockRawIO())
+ self.assertEqual(bufio.write(b''), 0)
+
 def test_detach_flush(self):
 raw = self.MockRawIO()
 buf = self.tp(raw)
@@ -1390,6 +1410,20 @@
 pair = self.tp(self.MockRawIO(), self.MockRawIO())
 self.assertFalse(pair.closed)
 
+ def test_uninitialized(self):
+ pair = self.tp.__new__(self.tp)
+ del pair
+ pair = self.tp.__new__(self.tp)
+ self.assertRaisesRegex((ValueError, AttributeError),
+ 'uninitialized|has no attribute',
+ pair.read, 0)
+ self.assertRaisesRegex((ValueError, AttributeError),
+ 'uninitialized|has no attribute',
+ pair.write, b'')
+ pair.__init__(self.MockRawIO(), self.MockRawIO())
+ self.assertEqual(pair.read(0), b'')
+ self.assertEqual(pair.write(b''), 0)
+
 def test_detach(self):
 pair = self.tp(self.MockRawIO(), self.MockRawIO())
 self.assertRaises(self.UnsupportedOperation, pair.detach)
@@ -1516,6 +1550,10 @@
 BufferedReaderTest.test_constructor(self)
 BufferedWriterTest.test_constructor(self)
 
+ def test_uninitialized(self):
+ BufferedReaderTest.test_uninitialized(self)
+ BufferedWriterTest.test_uninitialized(self)
+
 def test_read_and_write(self):
 raw = self.MockRawIO((b"asdf", b"ghjk"))
 rw = self.tp(raw, 8)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@
 Library
 -------
 
+- Issue #17671: Fixed a crash when use non-initialized io.BufferedRWPair.
+ Based on patch by Stephen Tu.
+
 - Issue #20594: Avoid name clash with the libc function posix_close.
 
 - Issue #19856: shutil.move() failed to move a directory to other directory
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -2305,9 +2305,14 @@
 static PyObject *
 _forward_call(buffered *self, _Py_Identifier *name, PyObject *args)
 {
- PyObject *func = _PyObject_GetAttrId((PyObject *)self, name);
- PyObject *ret;
+ PyObject *func, *ret;
+ if (self == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "I/O operation on uninitialized object");
+ return NULL;
+ }
 
+ func = _PyObject_GetAttrId((PyObject *)self, name);
 if (func == NULL) {
 PyErr_SetString(PyExc_AttributeError, name->string);
 return NULL;
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /