[3.15] gh-150913: Fix sqlite3.Blob validation for empty slice assignment (GH-150915) (GH-150923)

ass_subscript_slice() returned early when the computed slice length
was zero, bypassing validation performed for non-empty slices.
(cherry picked from commit fc9c4db130)

Co-authored-by: Jiseok CHOI <jiseok.dev@gmail.com>
This commit is contained in:
Miss Islington (bot) 2026-06-04 16:10:30 +02:00 committed by GitHub
parent 42a41cc69f
commit c6d64cc60d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 6 deletions

View file

@ -1400,6 +1400,18 @@ def test_blob_set_empty_slice(self):
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]

View file

@ -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.

View 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 {