Index: Modules/_sqlite/connection.c =================================================================== --- Modules/_sqlite/connection.c (révision 76754) +++ Modules/_sqlite/connection.c (copie de travail) @@ -778,7 +778,8 @@ PyErr_SetString(pysqlite_OperationalError, "Error creating function"); return NULL; } else { - PyDict_SetItem(self->function_pinboard, func, Py_None); + if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1) + return NULL; Py_INCREF(Py_None); return Py_None; @@ -805,7 +806,8 @@ PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate"); return NULL; } else { - PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None); + if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1) + return NULL; Py_INCREF(Py_None); return Py_None; @@ -895,7 +897,8 @@ PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback"); return NULL; } else { - PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None); + if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1) + return NULL; Py_INCREF(Py_None); return Py_None; @@ -919,7 +922,8 @@ sqlite3_progress_handler(self->db, 0, 0, (void*)0); } else { sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler); - PyDict_SetItem(self->function_pinboard, progress_handler, Py_None); + if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1) + return NULL; } Py_INCREF(Py_None); @@ -1309,9 +1313,11 @@ } if (callable != Py_None) { - PyDict_SetItem(self->collations, uppercase_name, callable); + if (PyDict_SetItem(self->collations, uppercase_name, callable) == -1) + goto finally; } else { - PyDict_DelItem(self->collations, uppercase_name); + if (PyDict_DelItem(self->collations, uppercase_name) == -1) + goto finally; } rc = sqlite3_create_collation(self->db, Index: Lib/sqlite3/test/regression.py =================================================================== --- Lib/sqlite3/test/regression.py (révision 76754) +++ Lib/sqlite3/test/regression.py (copie de travail) @@ -167,6 +167,23 @@ self.assertRaises(UnicodeEncodeError, setattr, con, "isolation_level", u"\xe9") + def CheckSetDict(self): + """ + See issue 7478. + """ + class NotHashable: + def __call__(self, *args, **kw): + pass + def __hash__(self): + raise TypeError() + var = NotHashable() + valid_collation = str + con = sqlite.connect(":memory:") + self.assertRaises(TypeError, con.create_function, var) + self.assertRaises(TypeError, con.create_aggregate, var) + self.assertRaises(TypeError, con.set_authorizer, var) + self.assertRaises(TypeError, con.set_progress_handler, var) + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check")