]> granicus.if.org Git - python/commitdiff
check for NULL tp_as_mapping in PySequence_(Get/Set/Del)Slice #9834
authorBenjamin Peterson <benjamin@python.org>
Sat, 11 Sep 2010 16:02:03 +0000 (16:02 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sat, 11 Sep 2010 16:02:03 +0000 (16:02 +0000)
Misc/NEWS
Objects/abstract.c

index ca64883fd1a0ac23991d87e9d40b43dfa88cbe60..225531b47147413ea26faebee49ffac30f97dea8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -108,6 +108,13 @@ Library
   guaranteed to exist in all Python implementations and the names of hash
   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
 -----------
 
index 612271da2e5deda50ff3c25bfcb11e00b9e2e9dc..4eb33d3bc509652f83977666144b1c03ad1a7d46 100644 (file)
@@ -1612,7 +1612,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
     if (!s) return null_error();
 
     mp = s->ob_type->tp_as_mapping;
-    if (mp->mp_subscript) {
+    if (mp && mp->mp_subscript) {
         PyObject *res;
         PyObject *slice = _PySlice_FromIndices(i1, i2);
         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;
-    if (mp->mp_ass_subscript) {
+    if (mp && mp->mp_ass_subscript) {
         int res;
         PyObject *slice = _PySlice_FromIndices(i1, i2);
         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;
-    if (mp->mp_ass_subscript) {
+    if (mp && mp->mp_ass_subscript) {
         int res;
         PyObject *slice = _PySlice_FromIndices(i1, i2);
         if (!slice)