]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.15] gh-150913: Fix sqlite3.Blob validation for empty slice assignment (GH-150915...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 4 Jun 2026 14:10:30 +0000 (16:10 +0200)
committerGitHub <noreply@github.com>
Thu, 4 Jun 2026 14:10:30 +0000 (14:10 +0000)
ass_subscript_slice() returned early when the computed slice length
was zero, bypassing validation performed for non-empty slices.
(cherry picked from commit fc9c4db1302f8be7527e70cf0938b629985a1d72)

Co-authored-by: Jiseok CHOI <jiseok.dev@gmail.com>
Lib/test/test_sqlite3/test_dbapi.py
Misc/NEWS.d/next/Library/2026-06-04-21-49-18.gh-issue-150913.EmptyBl.rst [new file with mode: 0644]
Modules/_sqlite/blob.c

index 73b40e82a96811f38aee622cdd5eda0aee19da1c..5f6cb527955ca17c5a3041975be8e88b65b77a49 100644 (file)
@@ -1400,6 +1400,18 @@ class BlobTests(unittest.TestCase):
         self.blob[0:0] = b""
         self.assertEqual(self.blob[:], self.data)
 
+    def test_blob_set_empty_slice_wrong_type(self):
+        with self.assertRaises(TypeError):
+            self.blob[5:5] = None
+
+    def test_blob_set_empty_slice_wrong_size(self):
+        with self.assertRaisesRegex(IndexError, "wrong size"):
+            self.blob[5:5] = b"123"
+
+    def test_blob_set_empty_slice_correct(self):
+        self.blob[5:5] = b""
+        self.assertEqual(self.blob[:], self.data)
+
     def test_blob_set_slice_with_skip(self):
         self.blob[0:10:2] = b"12345"
         actual = self.cx.execute("select b from test").fetchone()[0]
diff --git a/Misc/NEWS.d/next/Library/2026-06-04-21-49-18.gh-issue-150913.EmptyBl.rst b/Misc/NEWS.d/next/Library/2026-06-04-21-49-18.gh-issue-150913.EmptyBl.rst
new file mode 100644 (file)
index 0000000..f95a6ee
--- /dev/null
@@ -0,0 +1,3 @@
+Fix :class:`sqlite3.Blob` slice assignment to raise
+:exc:`TypeError` and :exc:`IndexError` for type and size mismatches
+respectively, even when the target slice is empty.
index 2cc62751054278ff7952c72e9b74b88aaf24e728..d81784409e5d91abb64a4576a49ecccae215a0aa 100644 (file)
@@ -531,21 +531,25 @@ ass_subscript_slice(pysqlite_Blob *self, PyObject *item, PyObject *value)
         return -1;
     }
 
-    if (len == 0) {
-        return 0;
-    }
-
     Py_buffer vbuf;
     if (PyObject_GetBuffer(value, &vbuf, PyBUF_SIMPLE) < 0) {
         return -1;
     }
 
-    int rc = -1;
     if (vbuf.len != len) {
         PyErr_SetString(PyExc_IndexError,
                         "Blob slice assignment is wrong size");
+        PyBuffer_Release(&vbuf);
+        return -1;
     }
-    else if (step == 1) {
+
+    if (len == 0) {
+        PyBuffer_Release(&vbuf);
+        return 0;
+    }
+
+    int rc = -1;
+    if (step == 1) {
         rc = inner_write(self, vbuf.buf, len, start);
     }
     else {