Issue #18519: the Python authorizer callback of sqlite3 must not raise Python exceptions

The exception is printed if sqlite3.enable_callback_tracebacks(True) has been
called, otherwise the exception is cleared.
This commit is contained in:
Victor Stinner 2013-07-26 22:23:33 +02:00
parent 8cda5e6093
commit d4095d95f8
1 changed files with 21 additions and 22 deletions

View File

@ -884,32 +884,31 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co
gilstate = PyGILState_Ensure();
#endif
if (!PyErr_Occurred()) {
ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
if (!ret) {
if (_enable_callback_tracebacks) {
PyErr_Print();
} else {
PyErr_Clear();
}
if (ret == NULL) {
if (_enable_callback_tracebacks)
PyErr_Print();
else
PyErr_Clear();
rc = SQLITE_DENY;
} else {
if (PyLong_Check(ret)) {
rc = _PyLong_AsInt(ret);
if (rc == -1 && PyErr_Occurred())
rc = SQLITE_DENY;
} else {
rc = SQLITE_DENY;
}
Py_DECREF(ret);
}
rc = SQLITE_DENY;
}
else {
/* A previous call to the authorizer callback failed and raised an
exception: don't call the Python authorizer callback */
rc = SQLITE_DENY;
if (PyLong_Check(ret)) {
rc = _PyLong_AsInt(ret);
if (rc == -1 && PyErr_Occurred()) {
if (_enable_callback_tracebacks)
PyErr_Print();
else
PyErr_Clear();
rc = SQLITE_DENY;
}
}
else {
rc = SQLITE_DENY;
}
Py_DECREF(ret);
}
#ifdef WITH_THREAD