[Python-checkins] cpython: Issue #18519, #18408: Fix sqlite authorizer callback

victor.stinner python-checkins at python.org
Sun Jul 21 13:09:25 CEST 2013


http://hg.python.org/cpython/rev/026593cbc006
changeset:   84760:026593cbc006
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sun Jul 21 13:05:38 2013 +0200
summary:
  Issue #18519, #18408: Fix sqlite authorizer callback

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.

files:
  Modules/_sqlite/connection.c |  38 ++++++++++++++---------
  1 files changed, 23 insertions(+), 15 deletions(-)


diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -883,25 +883,33 @@
 
     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();
+    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 {
-            PyErr_Clear();
+            if (PyLong_Check(ret)) {
+                rc = _PyLong_AsInt(ret);
+                if (rc == -1 && PyErr_Occurred())
+                    rc = SQLITE_DENY;
+            } else {
+                rc = SQLITE_DENY;
+            }
+            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;
-    } else {
-        if (PyLong_Check(ret)) {
-            rc = _PyLong_AsInt(ret);
-            if (rc == -1 && PyErr_Occurred())
-                rc = SQLITE_DENY;
-        } else {
-            rc = SQLITE_DENY;
-        }
-        Py_DECREF(ret);
     }
 
 #ifdef WITH_THREAD

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list