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.
........
This commit is contained in:
Antoine Pitrou 2011-02-24 20:53:48 +00:00
parent ec8f0df229
commit 915605c59a
4 changed files with 21 additions and 0 deletions

View File

@ -50,6 +50,8 @@ class CAPITest(unittest.TestCase):
b'Fatal Python error:' b'Fatal Python error:'
b' PyThreadState_Get: no current thread') 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.') @unittest.skipUnless(threading, 'Threading required for this test.')
class TestPendingCalls(unittest.TestCase): class TestPendingCalls(unittest.TestCase):

View File

@ -10,6 +10,9 @@ What's New in Python 3.2.1?
Core and Builtins 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 - Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
sys.stdin uses universal newline (replace '\r\n' by '\n'). sys.stdin uses universal newline (replace '\r\n' by '\n').

View File

@ -2231,6 +2231,15 @@ make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
return PyErr_NewExceptionWithDoc(name, doc, base, dict); 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 /* Test that the fatal error from not having a current thread doesn't
cause an infinite loop. Run via Lib/test/test_capi.py */ cause an infinite loop. Run via Lib/test/test_capi.py */
static PyObject * static PyObject *
@ -2326,6 +2335,8 @@ static PyMethodDef TestMethods[] = {
{"code_newempty", code_newempty, METH_VARARGS}, {"code_newempty", code_newempty, METH_VARARGS},
{"make_exception_with_doc", (PyCFunction)make_exception_with_doc, {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
METH_VARARGS | METH_KEYWORDS}, 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}, {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };

View File

@ -75,6 +75,11 @@ PyMemoryView_FromBuffer(Py_buffer *info)
{ {
PyMemoryViewObject *mview; 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 *) mview = (PyMemoryViewObject *)
PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type); PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
if (mview == NULL) if (mview == NULL)