]> granicus.if.org Git - python/commitdiff
Issue #18519, #18408: Fix sqlite authorizer callback
authorVictor Stinner <victor.stinner@gmail.com>
Sun, 21 Jul 2013 11:05:38 +0000 (13:05 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Sun, 21 Jul 2013 11:05:38 +0000 (13:05 +0200)
If a previous call to the authorizer callback failed and raised an exception,
don't call the Python authorizer callback, but just return SQLITE_DENY.

Modules/_sqlite/connection.c

index 6a58431aa6c8cb9e5ea728b6e1164a5dca3698cd..ed4ae1c197ef27570f709534a010a0b116336ec6 100644 (file)
@@ -883,25 +883,33 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co
 
     gilstate = PyGILState_Ensure();
 #endif
-    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 (!PyErr_Occurred()) {
+        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();
+            }
 
-        rc = SQLITE_DENY;
-    } else {
-        if (PyLong_Check(ret)) {
-            rc = _PyLong_AsInt(ret);
-            if (rc == -1 && PyErr_Occurred())
-                rc = SQLITE_DENY;
-        } else {
             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);
         }
-        Py_DECREF(ret);
+    }
+    else {
+        /* A previous call to the authorizer callback failed and raised an
+           exception: don't call the Python authorizer callback */
+        rc = SQLITE_DENY;
     }
 
 #ifdef WITH_THREAD