From: Stephan Bosch Date: Mon, 2 Oct 2017 17:53:28 +0000 (+0200) Subject: lib-auth-client: auth-master - Add reference counting for the connection object X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf6f2556c62e5cbf03f6eb637364e97bc8bfbfd1;p=thirdparty%2Fdovecot%2Fcore.git lib-auth-client: auth-master - Add reference counting for the connection object --- diff --git a/src/lib-auth-client/auth-master-private.h b/src/lib-auth-client/auth-master-private.h index fd5d6be1f7..0ebf62249c 100644 --- a/src/lib-auth-client/auth-master-private.h +++ b/src/lib-auth-client/auth-master-private.h @@ -15,6 +15,7 @@ struct auth_master_connection { struct connection conn; struct connection_list *clist; + int refcount; pool_t pool; struct event *event_parent, *event; diff --git a/src/lib-auth-client/auth-master.c b/src/lib-auth-client/auth-master.c index ae225557ae..bc42577d90 100644 --- a/src/lib-auth-client/auth-master.c +++ b/src/lib-auth-client/auth-master.c @@ -58,6 +58,7 @@ auth_master_init(const char *auth_socket_path, enum auth_master_flags flags) pool = pool_alloconly_create("auth_master_connection", 1024); conn = p_new(pool, struct auth_master_connection, 1); conn->pool = pool; + conn->refcount = 1; conn->auth_socket_path = p_strdup(pool, auth_socket_path); conn->flags = flags; conn->timeout_msecs = 1000*MASTER_AUTH_LOOKUP_TIMEOUT_SECS; @@ -89,13 +90,24 @@ void auth_master_disconnect(struct auth_master_connection *conn) conn->sent_handshake = FALSE; } -void auth_master_deinit(struct auth_master_connection **_conn) +static void +auth_master_ref(struct auth_master_connection *conn) +{ + conn->refcount++; +} + +static void +auth_master_unref(struct auth_master_connection **_conn) { struct auth_master_connection *conn = *_conn; struct connection_list *clist = conn->clist; *_conn = NULL; + i_assert(conn->refcount > 0); + if (--conn->refcount > 0) + return; + auth_master_disconnect(conn); connection_deinit(&conn->conn); connection_list_deinit(&clist); @@ -103,6 +115,16 @@ void auth_master_deinit(struct auth_master_connection **_conn) pool_unref(&conn->pool); } +void auth_master_deinit(struct auth_master_connection **_conn) +{ + struct auth_master_connection *conn = *_conn; + + *_conn = NULL; + + auth_master_disconnect(conn); + auth_master_unref(&conn); +} + void auth_master_set_timeout(struct auth_master_connection *conn, unsigned int msecs) { @@ -233,9 +255,14 @@ static int auth_master_input_line(struct connection *_conn, const char *line) struct ioloop *cur_ioloop = conn->ioloop; int ret; + auth_master_ref(conn); + ret = connection_input_line_default(_conn, line); if (ret > 0 && !io_loop_is_running(cur_ioloop)) - return 0; + ret = 0; + + auth_master_unref(&conn); + return ret; }