]> granicus.if.org Git - python/commitdiff
bpo-37840: Fix handling of negative indices in bytearray_getitem() (GH-15250)
authorSergey Fedoseev <fedoseev.sergey@gmail.com>
Mon, 9 Sep 2019 16:28:34 +0000 (21:28 +0500)
committerT. Wouters <thomas@python.org>
Mon, 9 Sep 2019 16:28:34 +0000 (09:28 -0700)
Lib/test/test_bytes.py
Misc/NEWS.d/next/Core and Builtins/2019-08-13-18-05-20.bpo-37840.elLCci.rst [new file with mode: 0644]
Modules/_testcapimodule.c
Objects/bytearrayobject.c

index b5eeb2b4fc2901185603bde08a80ba34a0e0beb3..ddcf367f38fc81f29526753674e4e3978ecadfeb 100644 (file)
@@ -962,6 +962,15 @@ class BaseBytesTest:
         c = b.translate(None, delete=b'e')
         self.assertEqual(c, b'hllo')
 
+    def test_sq_item(self):
+        _testcapi = test.support.import_module('_testcapi')
+        obj = self.type2test((42,))
+        with self.assertRaises(IndexError):
+            _testcapi.sequence_getitem(obj, -2)
+        with self.assertRaises(IndexError):
+            _testcapi.sequence_getitem(obj, 1)
+        self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42)
+
 
 class BytesTest(BaseBytesTest, unittest.TestCase):
     type2test = bytes
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-08-13-18-05-20.bpo-37840.elLCci.rst b/Misc/NEWS.d/next/Core and Builtins/2019-08-13-18-05-20.bpo-37840.elLCci.rst
new file mode 100644 (file)
index 0000000..df689da
--- /dev/null
@@ -0,0 +1,2 @@
+Fix handling of negative indices in :c:member:`~PySequenceMethods.sq_item`
+of :class:`bytearray`. Patch by Sergey Fedoseev.
index 640ec5914577cc2e9b237047771ec9b436aa79cb..147008b0a3dc4ca3d6292988ca36ccec42c93e91 100644 (file)
@@ -5164,6 +5164,18 @@ test_write_unraisable_exc(PyObject *self, PyObject *args)
 }
 
 
+static PyObject *
+sequence_getitem(PyObject *self, PyObject *args)
+{
+    PyObject *seq;
+    Py_ssize_t i;
+    if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
+        return NULL;
+    }
+    return PySequence_GetItem(seq, i);
+}
+
+
 static PyMethodDef TestMethods[] = {
     {"raise_exception",         raise_exception,                 METH_VARARGS},
     {"raise_memoryerror",       raise_memoryerror,               METH_NOARGS},
@@ -5413,6 +5425,7 @@ static PyMethodDef TestMethods[] = {
     {"negative_refcount", negative_refcount, METH_NOARGS},
 #endif
     {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
+    {"sequence_getitem", sequence_getitem, METH_VARARGS},
     {NULL, NULL} /* sentinel */
 };
 
index 8c16cc630d7122659bfd9e98483bf8dbf949867e..c9bf11bba1dd23c349ab6cb71dcd78484a5b1d3d 100644 (file)
@@ -381,8 +381,6 @@ bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
 static PyObject *
 bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
 {
-    if (i < 0)
-        i += Py_SIZE(self);
     if (i < 0 || i >= Py_SIZE(self)) {
         PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
         return NULL;