check for NULL tp_as_mapping in PySequence_(Get/Set/Del)Slice #9834

This commit is contained in:
Benjamin Peterson 2010-09-11 16:02:03 +00:00
parent e861598dcb
commit 568867a6f2
2 changed files with 10 additions and 3 deletions

View File

@ -108,6 +108,13 @@ Library
guaranteed to exist in all Python implementations and the names of hash guaranteed to exist in all Python implementations and the names of hash
algorithms available in the current process. algorithms available in the current process.
C-API
-----
- Issue #9834: Don't segfault in PySequence_GetSlice, PySequence_SetSlice, or
PySequence_DelSlice when the object doesn't have any mapping operations
defined.
Tools/Demos Tools/Demos
----------- -----------

View File

@ -1612,7 +1612,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
if (!s) return null_error(); if (!s) return null_error();
mp = s->ob_type->tp_as_mapping; mp = s->ob_type->tp_as_mapping;
if (mp->mp_subscript) { if (mp && mp->mp_subscript) {
PyObject *res; PyObject *res;
PyObject *slice = _PySlice_FromIndices(i1, i2); PyObject *slice = _PySlice_FromIndices(i1, i2);
if (!slice) if (!slice)
@ -1690,7 +1690,7 @@ PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
} }
mp = s->ob_type->tp_as_mapping; mp = s->ob_type->tp_as_mapping;
if (mp->mp_ass_subscript) { if (mp && mp->mp_ass_subscript) {
int res; int res;
PyObject *slice = _PySlice_FromIndices(i1, i2); PyObject *slice = _PySlice_FromIndices(i1, i2);
if (!slice) if (!slice)
@ -1715,7 +1715,7 @@ PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
} }
mp = s->ob_type->tp_as_mapping; mp = s->ob_type->tp_as_mapping;
if (mp->mp_ass_subscript) { if (mp && mp->mp_ass_subscript) {
int res; int res;
PyObject *slice = _PySlice_FromIndices(i1, i2); PyObject *slice = _PySlice_FromIndices(i1, i2);
if (!slice) if (!slice)