From 915605c59a82ca0f0015c4deec40b3e211ccb0c1 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 24 Feb 2011 20:53:48 +0000 Subject: [PATCH] Merged revisions 88550 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ 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. ........ --- Lib/test/test_capi.py | 2 ++ Misc/NEWS | 3 +++ Modules/_testcapimodule.c | 11 +++++++++++ Objects/memoryobject.c | 5 +++++ 4 files changed, 21 insertions(+) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 32f8fae25af..529a2a5e163 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 a7f9ba5a567..e1710324511 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 f326568ea29..f19d0df5944 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 7782076a5b5..2e32b2a0e9f 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)