gh-149738: Fix segmentation fault bug in sqllite3 (#149754) · python/cpython@60fdb31

GitHub

@@ -557,6 +557,47 @@ pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory)

557557returncursor;

558558}

559559560+staticPyObject*

561+connection_get_row_factory(PyObject*op, void*closure)

562+{

563+pysqlite_Connection*self= (pysqlite_Connection*)op;

564+returnPy_NewRef(self->row_factory);

565+}

566+567+staticint

568+connection_set_row_factory(PyObject*op, PyObject*value, void*closure)

569+{

570+pysqlite_Connection*self= (pysqlite_Connection*)op;

571+if (value==NULL) {

572+PyErr_SetString(PyExc_AttributeError,

573+"cannot delete row_factory attribute");

574+return-1;

575+ }

576+Py_XSETREF(self->row_factory, Py_NewRef(value));

577+return0;

578+}

579+580+staticPyObject*

581+connection_get_text_factory(PyObject*op, void*closure)

582+{

583+pysqlite_Connection*self= (pysqlite_Connection*)op;

584+returnPy_NewRef(self->text_factory);

585+}

586+587+staticint

588+connection_set_text_factory(PyObject*op, PyObject*value, void*closure)

589+{

590+pysqlite_Connection*self= (pysqlite_Connection*)op;

591+if (value==NULL) {

592+PyErr_SetString(PyExc_AttributeError,

593+"cannot delete text_factory attribute");

594+return-1;

595+ }

596+Py_XSETREF(self->text_factory, Py_NewRef(value));

597+return0;

598+}

599+600+560601/*[clinic input]

561602_sqlite3.Connection.blobopen as blobopen

562603@@ -2620,6 +2661,10 @@ static PyGetSetDef connection_getset[] = {

26202661 {"in_transaction", pysqlite_connection_get_in_transaction, NULL},

26212662 {"autocommit", get_autocommit, set_autocommit},

26222663 {"__text_signature__", get_sig, NULL},

2664+ {"row_factory", connection_get_row_factory,

2665+connection_set_row_factory},

2666+ {"text_factory", connection_get_text_factory,

2667+connection_set_text_factory},

26232668 {NULL}

26242669};

26252670@@ -2667,8 +2712,6 @@ static struct PyMemberDef connection_members[] =

26672712 {"InternalError", _Py_T_OBJECT, offsetof(pysqlite_Connection, InternalError), Py_READONLY},

26682713 {"ProgrammingError", _Py_T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), Py_READONLY},

26692714 {"NotSupportedError", _Py_T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), Py_READONLY},

2670- {"row_factory", _Py_T_OBJECT, offsetof(pysqlite_Connection, row_factory)},

2671- {"text_factory", _Py_T_OBJECT, offsetof(pysqlite_Connection, text_factory)},

26722715 {NULL}

26732716};

26742717