Commit a24869ad authored by Georg Brandl's avatar Georg Brandl

#3312: fix two sqlite3 crashes.

parent 4ed9be73
......@@ -153,6 +153,20 @@ class RegressionTests(unittest.TestCase):
con.execute("insert into foo(bar) values (5)")
con.execute(SELECT)
def CheckRegisterAdapter(self):
"""
See issue 3312.
"""
self.assertRaises(TypeError, sqlite.register_adapter, {}, None)
def CheckSetIsolationLevel(self):
"""
See issue 3312.
"""
con = sqlite.connect(":memory:")
self.assertRaises(UnicodeEncodeError, setattr, con,
"isolation_level", u"\xe9")
def suite():
regression_suite = unittest.makeSuite(RegressionTests, "Check")
......
......@@ -63,6 +63,8 @@ Core and Builtins
Library
-------
- Issue #3312: Fix two crashes in sqlite3.
- Issue #1608818: Fix misbehavior in os.listdir() if readdir() fails.
- Issue #3125: Remove copy_reg in multiprocessing and replace it with
......
......@@ -940,6 +940,7 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py
{
PyObject* res;
PyObject* begin_statement;
char* begin_statement_str;
Py_XDECREF(self->isolation_level);
......@@ -972,12 +973,18 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py
return -1;
}
self->begin_statement = PyMem_Malloc(PyString_Size(begin_statement) + 2);
begin_statement_str = PyString_AsString(begin_statement);
if (!begin_statement_str) {
Py_DECREF(begin_statement);
return -1;
}
self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2);
if (!self->begin_statement) {
Py_DECREF(begin_statement);
return -1;
}
strcpy(self->begin_statement, PyString_AsString(begin_statement));
strcpy(self->begin_statement, begin_statement_str);
Py_DECREF(begin_statement);
}
......
......@@ -147,6 +147,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
{
PyTypeObject* type;
PyObject* caster;
int rc;
if (!PyArg_ParseTuple(args, "OO", &type, &caster)) {
return NULL;
......@@ -159,7 +160,9 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
pysqlite_BaseTypeAdapted = 1;
}
microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
rc = microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
if (rc == -1)
return NULL;
Py_INCREF(Py_None);
return Py_None;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment