From aab0f74c3be83a18f676d3b80d08e61818a8274f Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 12 Aug 2025 13:08:08 +0300 Subject: [PATCH] auth: ldap - Fix potential crash at deinit 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 | 6 +++++- src/auth/db-ldap.h | 1 + src/auth/passdb-ldap.c | 1 + src/auth/userdb-ldap.c | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/auth/db-ldap.c b/src/auth/db-ldap.c index 302faf38f4..6122cb7d18 100644 --- a/src/auth/db-ldap.c +++ b/src/auth/db-ldap.c @@ -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; diff --git a/src/auth/db-ldap.h b/src/auth/db-ldap.h index 7b2f60f65f..b4530e523f 100644 --- a/src/auth/db-ldap.h +++ b/src/auth/db-ldap.h @@ -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); diff --git a/src/auth/passdb-ldap.c b/src/auth/passdb-ldap.c index 34ebc00503..426da2404d 100644 --- a/src/auth/passdb-ldap.c +++ b/src/auth/passdb-ldap.c @@ -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); } diff --git a/src/auth/userdb-ldap.c b/src/auth/userdb-ldap.c index b13bc3beda..21f127c11e 100644 --- a/src/auth/userdb-ldap.c +++ b/src/auth/userdb-ldap.c @@ -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); } -- 2.47.2