]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34229: Check start and stop of slice object to be long when they are not int...
authorXtreak <tirkarthi@users.noreply.github.com>
Thu, 26 Jul 2018 16:20:34 +0000 (21:50 +0530)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 26 Jul 2018 16:20:34 +0000 (19:20 +0300)
Lib/test/test_capi.py
Misc/NEWS.d/next/C API/2018-07-26-12-24-29.bpo-34229.SupCZK.rst [new file with mode: 0644]
Modules/_testcapimodule.c
Objects/sliceobject.c

index d281be61649d1ce5e1ef4b444b470e62d6d539fd..6f4a5b3a39445d0e7014a22d377eb7e9c4453633 100644 (file)
@@ -108,6 +108,20 @@ class Test6012(unittest.TestCase):
         self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
 
 
+class TestGetIndices(unittest.TestCase):
+
+    def test_get_indices(self):
+        self.assertEqual(_testcapi.get_indices(slice(10L, 20, 1), 100), (0, 10, 20, 1))
+        self.assertEqual(_testcapi.get_indices(slice(10.1, 20, 1), 100), None)
+        self.assertEqual(_testcapi.get_indices(slice(10, 20L, 1), 100), (0, 10, 20, 1))
+        self.assertEqual(_testcapi.get_indices(slice(10, 20.1, 1), 100), None)
+
+        self.assertEqual(_testcapi.get_indices(slice(10L, 20, 1L), 100), (0, 10, 20, 1))
+        self.assertEqual(_testcapi.get_indices(slice(10.1, 20, 1L), 100), None)
+        self.assertEqual(_testcapi.get_indices(slice(10, 20L, 1L), 100), (0, 10, 20, 1))
+        self.assertEqual(_testcapi.get_indices(slice(10, 20.1, 1L), 100), None)
+
+
 class SkipitemTest(unittest.TestCase):
 
     def test_skipitem(self):
@@ -266,7 +280,7 @@ def test_main():
                 raise support.TestFailed, sys.exc_info()[1]
 
     support.run_unittest(CAPITest, TestPendingCalls, SkipitemTest,
-                         TestThreadState)
+                         TestThreadState, TestGetIndices)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Misc/NEWS.d/next/C API/2018-07-26-12-24-29.bpo-34229.SupCZK.rst b/Misc/NEWS.d/next/C API/2018-07-26-12-24-29.bpo-34229.SupCZK.rst
new file mode 100644 (file)
index 0000000..df5b34b
--- /dev/null
@@ -0,0 +1,2 @@
+Check start and stop of slice object to be long when they are not int in
+:c:func:`PySlice_GetIndices`.
index f57176d63237df7b535aa4b8c458fe7630389c4e..67488e70e45ff10c1f316cc5a2f4001e5d233dca 100644 (file)
@@ -1559,6 +1559,29 @@ getargs_et_hash(PyObject *self, PyObject *args)
     return result;
 }
 
+static PyObject *
+get_indices(PyObject *self, PyObject *args)
+{
+    int result;
+    PySliceObject *slice;
+    Py_ssize_t length, start, stop, step;
+
+    if (!PyArg_ParseTuple(args, "On", &slice, &length))
+        return NULL;
+
+    result = PySlice_GetIndices(slice, length, &start, &stop, &step);
+
+    if (PyErr_Occurred()) {
+        assert(result == -1);
+        return NULL;
+    }
+
+    if (result == -1) {
+        Py_RETURN_NONE;
+    }
+    return Py_BuildValue("innn", result, start, stop, step);
+}
+
 static PyObject *
 parse_tuple_and_keywords(PyObject *self, PyObject *args)
 {
@@ -2664,6 +2687,7 @@ static PyMethodDef TestMethods[] = {
 #ifdef Py_USING_UNICODE
     {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
 #endif
+    {"get_indices", get_indices, METH_VARARGS},
     {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
     {"test_null_strings",       (PyCFunction)test_null_strings,  METH_NOARGS},
     {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
index c66e057cdb39a9d5fbb3182f51bec7f1a9dc7602..9daeafcc4a18d3b00e055331f3404cdc63cf16b0 100644 (file)
@@ -113,14 +113,14 @@ PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
     if (r->start == Py_None) {
         *start = *step < 0 ? length-1 : 0;
     } else {
-        if (!PyInt_Check(r->start) && !PyLong_Check(r->step)) return -1;
+        if (!PyInt_Check(r->start) && !PyLong_Check(r->start)) return -1;
         *start = PyInt_AsSsize_t(r->start);
         if (*start < 0) *start += length;
     }
     if (r->stop == Py_None) {
         *stop = *step < 0 ? -1 : length;
     } else {
-        if (!PyInt_Check(r->stop) && !PyLong_Check(r->step)) return -1;
+        if (!PyInt_Check(r->stop) && !PyLong_Check(r->stop)) return -1;
         *stop = PyInt_AsSsize_t(r->stop);
         if (*stop < 0) *stop += length;
     }