mirror of
https://github.com/python/cpython.git
synced 2026-06-27 19:36:07 +00:00
[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:
parent
42a41cc69f
commit
c6d64cc60d
3 changed files with 25 additions and 6 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue