]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Previous userdb changes caused userdb prefetch to be used always.
authorTimo Sirainen <tss@iki.fi>
Thu, 12 Dec 2013 16:08:25 +0000 (18:08 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 12 Dec 2013 16:08:25 +0000 (18:08 +0200)
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/userdb-prefetch.c

index a6ab2eb5b4bdbf6f24e2487e2ae82e7289a37034..0752f3d8b7c2a1fba09ddc182edef7fb5d800cea 100644 (file)
@@ -631,10 +631,12 @@ auth_request_handle_passdb_callback(enum passdb_result *result,
                        auth_fields_rollback(request->extra_fields);
                        if (request->userdb_reply == NULL)
                                ;
-                       else if (!request->snapshot_has_userdb_reply)
-                               request->userdb_reply = NULL;
-                       else
+                       else if (request->snapshot_has_userdb_reply)
                                auth_fields_rollback(request->userdb_reply);
+                       else {
+                               request->userdb_reply = NULL;
+                               request->userdb_prefetch_set = FALSE;
+                       }
                }
 
                if (*result == PASSDB_RESULT_USER_UNKNOWN) {
@@ -1426,6 +1428,7 @@ void auth_request_set_field(struct auth_request *request,
                auth_request_validate_networks(request, value);
        } else if (strncmp(name, "userdb_", 7) == 0) {
                /* for prefetch userdb */
+               request->userdb_prefetch_set = TRUE;
                if (request->userdb_reply == NULL)
                        auth_request_init_userdb_reply(request);
                auth_request_set_userdb_field(request, name + 7, value);
@@ -1478,8 +1481,7 @@ void auth_request_set_null_field(struct auth_request *request, const char *name)
        if (strncmp(name, "userdb_", 7) == 0) {
                /* make sure userdb prefetch is used even if all the fields
                   were returned as NULL. */
-               if (request->userdb_reply == NULL)
-                       auth_request_init_userdb_reply(request);
+               request->userdb_prefetch_set = TRUE;
        }
 }
 
index 8526f3f70ec22415515471426dc49e93e8bf2e81..369007c34c7346953baf007dfc757c5b5bc0a865 100644 (file)
@@ -136,6 +136,9 @@ struct auth_request {
           or because one of the returned uid/gid fields couldn't be translated
           to a number */
        unsigned int userdb_lookup_tempfailed:1;
+       /* userdb_* fields have been set by the passdb lookup, userdb prefetch
+          will work. */
+       unsigned int userdb_prefetch_set:1;
 
        /* ... mechanism specific data ... */
 };
index bb3ac77b4825deec971a4b8d6d7c115e02346e96..29dbecf0993c331287ad6d0dc1f9b19f08ba88cf 100644 (file)
@@ -15,7 +15,7 @@ static void prefetch_lookup(struct auth_request *auth_request,
 {
        /* auth_request_set_field() should have already placed the userdb_*
           values to userdb_reply. */
-       if (auth_request->userdb_reply == NULL) {
+       if (!auth_request->userdb_prefetch_set) {
                if (auth_request_get_auth(auth_request)->userdbs->next == NULL) {
                        /* no other userdbs */
                        if (auth_request->userdb_lookup) {