Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5038:b2921478f94f HEAD
Several fixes to handling deinitialization without crashing.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 19 Jan 2007 17:19:32 +0200 |
parents | d7198e2682c6 |
children | 953f02db95dc |
files | src/auth/auth-master-connection.c src/auth/auth-master-connection.h src/auth/auth-request-handler.c src/auth/auth.c src/auth/db-ldap.h src/auth/main.c src/auth/userdb-ldap.c |
diffstat | 7 files changed, 52 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/auth-master-connection.c Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/auth-master-connection.c Fri Jan 19 17:19:32 2007 +0200 @@ -229,6 +229,7 @@ conn = i_new(struct auth_master_connection, 1); conn->listener = listener; + conn->refcount = 1; conn->fd = fd; conn->input = i_stream_create_file(fd, default_pool, MAX_INBUF_SIZE, FALSE); @@ -267,14 +268,15 @@ conn->destroyed = TRUE; if (conn->input != NULL) - i_stream_destroy(&conn->input); + i_stream_close(conn->input); if (conn->output != NULL) - o_stream_destroy(&conn->output); + o_stream_close(conn->output); if (conn->io != NULL) io_remove(&conn->io); if (conn->fd != -1) { if (close(conn->fd) < 0) i_error("close(): %m"); + conn->fd = -1; } conns = array_get(&conn->listener->masters, &count); @@ -286,6 +288,31 @@ } if (!standalone && auth_master_listeners_masters_left() == 0) io_loop_stop(ioloop); - + + auth_master_connection_unref(&conn); +} + +void auth_master_connection_ref(struct auth_master_connection *conn) +{ + i_assert(conn->refcount > 0); + + conn->refcount++; +} + +void auth_master_connection_unref(struct auth_master_connection **_conn) +{ + struct auth_master_connection *conn = *_conn; + + *_conn = NULL; + i_assert(conn->refcount > 0); + + if (--conn->refcount > 0) + return; + + if (conn->input != NULL) + i_stream_unref(&conn->input); + if (conn->output != NULL) + o_stream_unref(&conn->output); + i_free(conn); }
--- a/src/auth/auth-master-connection.h Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/auth-master-connection.h Fri Jan 19 17:19:32 2007 +0200 @@ -3,6 +3,7 @@ struct auth_master_connection { struct auth_master_listener *listener; + int refcount; int fd; struct istream *input; @@ -17,6 +18,9 @@ auth_master_connection_create(struct auth_master_listener *listener, int fd); void auth_master_connection_destroy(struct auth_master_connection **conn); +void auth_master_connection_ref(struct auth_master_connection *conn); +void auth_master_connection_unref(struct auth_master_connection **conn); + void auth_master_connection_send_handshake(struct auth_master_connection *conn); void auth_master_connections_send_handshake(void);
--- a/src/auth/auth-request-handler.c Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/auth-request-handler.c Fri Jan 19 17:19:32 2007 +0200 @@ -8,6 +8,7 @@ #include "str.h" #include "str-sanitize.h" #include "auth-request.h" +#include "auth-master-connection.h" #include "auth-request-handler.h" #include <stdlib.h> @@ -427,6 +428,7 @@ } handler->master_callback(str_c(str), request->master); + auth_master_connection_unref(&request->master); auth_request_unref(&request); auth_request_handler_unref(&handler); } @@ -469,7 +471,9 @@ request->context = handler; request->master = master; - /* handler is referenced until userdb_callback is called. */ + /* master and handler are referenced until userdb_callback i + s called. */ + auth_master_connection_ref(master); handler->refcount++; auth_request_lookup_user(request, userdb_callback); } @@ -505,6 +509,7 @@ void auth_request_handler_deinit(void) { + auth_request_handler_flush_failures(); buffer_free(auth_failures_buf); timeout_remove(&to_auth_failures); }
--- a/src/auth/auth.c Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/auth.c Fri Jan 19 17:19:32 2007 +0200 @@ -280,7 +280,6 @@ *_auth = NULL; - passdb_cache_deinit(); for (passdb = auth->masterdbs; passdb != NULL; passdb = passdb->next) passdb_deinit(passdb); for (passdb = auth->passdbs; passdb != NULL; passdb = passdb->next) @@ -288,5 +287,8 @@ for (userdb = auth->userdbs; userdb != NULL; userdb = userdb->next) userdb_deinit(userdb); + auth_request_handler_deinit(); + passdb_cache_deinit(); + pool_unref(auth->pool); }
--- a/src/auth/db-ldap.h Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/db-ldap.h Fri Jan 19 17:19:32 2007 +0200 @@ -66,6 +66,7 @@ unsigned int connected:1; unsigned int connecting:1; + unsigned int binding:1; unsigned int retrying:1; /* just reconnected, resending requests */ unsigned int last_auth_bind:1; };
--- a/src/auth/main.c Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/main.c Fri Jan 19 17:19:32 2007 +0200 @@ -283,7 +283,6 @@ auth_worker_server_deinit(); auth_master_listeners_deinit(); - auth_request_handler_deinit(); auth_deinit(&auth); mech_deinit();
--- a/src/auth/userdb-ldap.c Fri Jan 19 17:18:24 2007 +0200 +++ b/src/auth/userdb-ldap.c Fri Jan 19 17:19:32 2007 +0200 @@ -142,12 +142,14 @@ enum userdb_result result = USERDB_RESULT_INTERNAL_FAILURE; int ret; - ret = ldap_result2error(conn->ld, res, 0); - if (ret != LDAP_SUCCESS) { - auth_request_log_error(auth_request, "ldap", - "ldap_search() failed: %s", ldap_err2string(ret)); - urequest->userdb_callback(result, NULL, auth_request); - return; + if (res != NULL) { + ret = ldap_result2error(conn->ld, res, 0); + if (ret != LDAP_SUCCESS) { + auth_request_log_error(auth_request, "ldap", + "ldap_search() failed: %s", ldap_err2string(ret)); + urequest->userdb_callback(result, NULL, auth_request); + return; + } } entry = res == NULL ? NULL : ldap_first_entry(conn->ld, res);