[Dovecot] auth-ldap not resetting connection state after failed bind
Brendan Braybrook
brendan at tucows.com
Mon Oct 15 22:32:23 EEST 2007
timo, i think i found a small problem with the ldap implementation:
when using auth_bind (this might be in all conditions, not just that one
- i haven't tested further), if the server lost connection to the ldap
server (ie, the ldap server died) dovecot-auth would never reconnect to
the ldap server and all subsequent auth attempts would fail. after a
little more digging, i discovered that if the ldap server went down and
came back up before the next dovecot request then everything would be
fine. however, if a request came in while the ldap server was down then
dovecot-auth would "cache" that the server was unavailable and never
recheck it.
i believe i tracked it down to a couple lines in db_ldap_bind and fixed
it - dovecot-auth is reconnecting to ldap in the condition where it was
not previously:
--- dovecot-1.0.3/src/auth/db-ldap.c 2007-10-15 18:26:55.983349000 +0000
+++ dovecot-1.0.3/src/auth/db-ldap.c.new 2007-10-15
18:28:03.124136000 +0000
@@ -446,7 +446,10 @@
msgid = ldap_bind(conn->ld, conn->set.dn, conn->set.dnpass,
LDAP_AUTH_SIMPLE);
if (msgid == -1) {
- db_ldap_connect_finish(conn, ldap_get_errno(conn));
+ if (db_ldap_connect_finish(conn, ldap_get_errno(conn)) <
0) {
+ /* lost connection, close it */
+ ldap_conn_close(conn, TRUE);
+ }
i_free(ldap_request);
return -1;
}
More information about the dovecot
mailing list