]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: ldap: Drop partially saved results before retrying request
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 26 Jan 2022 14:09:29 +0000 (16:09 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 2 Feb 2022 10:16:38 +0000 (10:16 +0000)
Fixes "LDAP search returned multiple entries" happening after reconnects.

src/auth/db-ldap.c

index 80b3f4cc7bfa61d12678cdc29f501989d8afe924..8083108627f4e2f41e7bb3c17a561b05ae765fce 100644 (file)
@@ -178,6 +178,7 @@ static bool db_ldap_abort_requests(struct ldap_connection *conn,
                                   unsigned int max_count,
                                   unsigned int timeout_secs,
                                   bool error, const char *reason);
+static void db_ldap_request_free(struct ldap_request *request);
 
 static int deref2str(const char *str, int *ref_r)
 {
@@ -410,6 +411,9 @@ static bool db_ldap_request_queue_next(struct ldap_connection *conn)
                   whenever attempting to send the request. */
                ret = 0;
        } else {
+               /* clear away any partial results saved before reconnecting */
+               db_ldap_request_free(request);
+
                switch (request->type) {
                case LDAP_REQUEST_TYPE_BIND:
                        ret = db_ldap_request_bind(conn, request);
@@ -893,7 +897,8 @@ db_ldap_request_free(struct ldap_request *request)
                                if (named_res->result != NULL)
                                        db_ldap_result_unref(&named_res->result);
                        }
-                       array_clear(&srequest->named_results);
+                       array_free(&srequest->named_results);
+                       srequest->name_idx = 0;
                }
        }
 }