]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: ldap - Fix potential crash at deinit main
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 12 Aug 2025 10:08:08 +0000 (13:08 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 12 Aug 2025 10:08:25 +0000 (13:08 +0300)
Continuation of 5ff9a8686a29c423e1fcf90f2d36af521cef6f7d. It didn't fix
a situation where there were passdb requests still pending, because
passdb deinit only unreferenced db-ldap and then freed passdb settings.
Only after userdb deinit unreferenced db-ldap again did it try to abort
the ldap requests, but now the passdb settings were already NULL.

src/auth/db-ldap.c
src/auth/db-ldap.h
src/auth/passdb-ldap.c
src/auth/userdb-ldap.c

index 302faf38f43eca5b4be1664e66bd45ce680a17b6..6122cb7d18781b13f6231ba71be34ec5efde3425 100644 (file)
@@ -1528,7 +1528,6 @@ void db_ldap_unref(struct ldap_connection **_conn)
                }
        }
 
-       db_ldap_abort_requests(conn, UINT_MAX, 0, FALSE, "Shutting down");
        i_assert(conn->pending_count == 0);
        db_ldap_conn_close(conn);
        i_assert(conn->to == NULL);
@@ -1545,6 +1544,11 @@ void db_ldap_unref(struct ldap_connection **_conn)
        pool_unref(&conn->pool);
 }
 
+void db_ldap_abort_all_requests(struct ldap_connection *conn)
+{
+       db_ldap_abort_requests(conn, UINT_MAX, 0, FALSE, "Shutting down");
+}
+
 #ifndef BUILTIN_LDAP
 /* Building a plugin */
 extern struct passdb_module_interface passdb_ldap_plugin;
index 7b2f60f65ff980826173ff9fa98498f26f8c07a0..b4530e523f97c788e543d69422f7c47372f87f9c 100644 (file)
@@ -163,6 +163,7 @@ void db_ldap_get_attribute_names(pool_t pool,
 
 struct ldap_connection *db_ldap_init(struct event *event);
 void db_ldap_unref(struct ldap_connection **conn);
+void db_ldap_abort_all_requests(struct ldap_connection *conn);
 
 int db_ldap_connect(struct ldap_connection *conn);
 void db_ldap_connect_delayed(struct ldap_connection *conn);
index 34ebc005035b99f9f4f14eaffc52e50a345f26d5..426da2404d84169dc7f66d810f05a55f02d3c32f 100644 (file)
@@ -487,6 +487,7 @@ static void passdb_ldap_deinit(struct passdb_module *_module)
        struct ldap_passdb_module *module =
                container_of(_module, struct ldap_passdb_module, module);
 
+       db_ldap_abort_all_requests(module->conn);
        db_ldap_unref(&module->conn);
 }
 
index b13bc3beda0089daef2becd4753cb633f838548c..21f127c11e2628ca39df49da581d0c97515c3c33 100644 (file)
@@ -370,6 +370,7 @@ static void userdb_ldap_deinit(struct userdb_module *_module)
        struct ldap_userdb_module *module =
                container_of(_module, struct ldap_userdb_module, module);
 
+       db_ldap_abort_all_requests(module->conn);
        db_ldap_unref(&module->conn);
 }