con.executescript("select step(t) from t")
self.assertEqual(steps, values)
+ def test_custom_cursor_object_crash_gh_99886(self):
+ # This test segfaults on GH-99886
+ class MyCursor(sqlite.Cursor):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ # this can go before or after the super call; doesn't matter
+ self.some_attr = None
+
+ with memory_database() as con:
+ cur = con.cursor(MyCursor)
+ cur.close()
+ del cur
class RecursiveUseOfCursors(unittest.TestCase):
# GH-80254: sqlite3 should not segfault for recursive use of cursors.
PyTypeObject *tp = Py_TYPE(self);
assert(Py_TYPE(self)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
PyDictValues **values_ptr = _PyObject_ValuesPointer(self);
- if (*values_ptr == NULL) {
+ PyDictValues *values = *values_ptr;
+ if (values == NULL) {
return;
}
+ *values_ptr = NULL;
PyDictKeysObject *keys = CACHED_KEYS(tp);
for (Py_ssize_t i = 0; i < keys->dk_nentries; i++) {
- Py_XDECREF((*values_ptr)->values[i]);
+ Py_XDECREF(values->values[i]);
}
- free_values(*values_ptr);
+ free_values(values);
}
PyObject *