summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-02-24 20:53:48 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-02-24 20:53:48 (GMT)
commit915605c59a82ca0f0015c4deec40b3e211ccb0c1 (patch)
treeab036ac0f497a40d837148444ff2d17cd32787dd
parentec8f0df2296cfb88cd932eeb053edaa316600725 (diff)
downloadcpython-915605c59a82ca0f0015c4deec40b3e211ccb0c1.zip
cpython-915605c59a82ca0f0015c4deec40b3e211ccb0c1.tar.gz
cpython-915605c59a82ca0f0015c4deec40b3e211ccb0c1.tar.bz2
Merged revisions 88550 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r88550 | antoine.pitrou | 2011-02-24 21:50:49 +0100 (jeu., 24 févr. 2011) | 4 lines Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with a buffer struct having a NULL data pointer. ........
-rw-r--r--Lib/test/test_capi.py2
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_testcapimodule.c11
-rw-r--r--Objects/memoryobject.c5
4 files changed, 21 insertions, 0 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 32f8fae..529a2a5 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -50,6 +50,8 @@ class CAPITest(unittest.TestCase):
b'Fatal Python error:'
b' PyThreadState_Get: no current thread')
+ def test_memoryview_from_NULL_pointer(self):
+ self.assertRaises(ValueError, _testcapi.make_memoryview_from_NULL_pointer)
@unittest.skipUnless(threading, 'Threading required for this test.')
class TestPendingCalls(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
index a7f9ba5..e171032 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.2.1?
Core and Builtins
-----------------
+- Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
+ a buffer struct having a NULL data pointer.
+
- Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
sys.stdin uses universal newline (replace '\r\n' by '\n').
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index f326568..f19d0df 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -2231,6 +2231,15 @@ make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
return PyErr_NewExceptionWithDoc(name, doc, base, dict);
}
+static PyObject *
+make_memoryview_from_NULL_pointer(PyObject *self)
+{
+ Py_buffer info;
+ if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
+ return NULL;
+ return PyMemoryView_FromBuffer(&info);
+}
+
/* Test that the fatal error from not having a current thread doesn't
cause an infinite loop. Run via Lib/test/test_capi.py */
static PyObject *
@@ -2326,6 +2335,8 @@ static PyMethodDef TestMethods[] = {
{"code_newempty", code_newempty, METH_VARARGS},
{"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
METH_VARARGS | METH_KEYWORDS},
+ {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
+ METH_NOARGS},
{"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c
index 7782076..2e32b2a 100644
--- a/Objects/memoryobject.c
+++ b/Objects/memoryobject.c
@@ -75,6 +75,11 @@ PyMemoryView_FromBuffer(Py_buffer *info)
{
PyMemoryViewObject *mview;
+ if (info->buf == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot make memory view from a buffer with a NULL data pointer");
+ return NULL;
+ }
mview = (PyMemoryViewObject *)
PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
if (mview == NULL)