]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-auth-client: auth-master - Handle connection failures in auth_master_connection_f...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 3 Jun 2020 10:42:42 +0000 (12:42 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 27 Aug 2025 11:37:24 +0000 (13:37 +0200)
src/lib-auth-client/auth-master-request.c
src/lib-auth-client/auth-master.c

index 5b4d21599961d79ade665fb380f41b6973539339..1f3ba339c9b73b9a81e560aece08b2189527aab1 100644 (file)
@@ -9,7 +9,8 @@
 
 void auth_request_lookup_abort(struct auth_master_connection *conn)
 {
-       io_loop_stop(conn->ioloop);
+       if (conn->ioloop != NULL)
+               io_loop_stop(conn->ioloop);
        conn->aborted = TRUE;
 }
 
index f49e6b4b1d2ad7354f8efc5eccbf02ddfc870182..7ba36303d5df3d616da2ef65a1b2347354f8cfff 100644 (file)
@@ -82,14 +82,28 @@ auth_master_init(const char *auth_socket_path, enum auth_master_flags flags)
        return conn;
 }
 
-void auth_master_disconnect(struct auth_master_connection *conn)
+static void
+auth_master_connection_failure(struct auth_master_connection *conn,
+                              const char *reason)
 {
+       if (reason == NULL)
+               reason = "Disconnected from auth service";
+
+       if (conn->connected)
+               e_debug(conn->conn.event, "%s", reason);
+
        conn->connected = FALSE;
-       connection_disconnect(&conn->conn);
+       conn->sent_handshake = FALSE;
 
        timeout_remove(&conn->to);
 
-       conn->sent_handshake = FALSE;
+       auth_request_lookup_abort(conn);
+}
+
+void auth_master_disconnect(struct auth_master_connection *conn)
+{
+       connection_disconnect(&conn->conn);
+       auth_master_connection_failure(conn, NULL);
 }
 
 static void
@@ -149,24 +163,30 @@ static void auth_master_destroy(struct connection *_conn)
 
        switch (_conn->disconnect_reason) {
        case CONNECTION_DISCONNECT_HANDSHAKE_FAILED:
+               auth_master_connection_failure(
+                       conn, "Handshake with auth service failed");
                break;
        case CONNECTION_DISCONNECT_BUFFER_FULL:
                e_error(conn->conn.event, "BUG: Received more than %d bytes",
                        MAX_INBUF_SIZE);
+               auth_master_connection_failure(conn, NULL);
                break;
        default:
                if (!conn->aborted)
                        e_error(conn->conn.event, "Disconnected unexpectedly");
+               auth_master_connection_failure(conn, NULL);
        }
-       auth_request_lookup_abort(conn);
 }
 
 static void auth_request_timeout(struct auth_master_connection *conn)
 {
-       if (!connection_handshake_received(&conn->conn))
+       if (!connection_handshake_received(&conn->conn)) {
                e_error(conn->conn.event, "Connecting timed out");
-       else
-               e_error(conn->conn.event, "Request timed out");
+               auth_master_connection_failure(conn, "Connecting timed out");
+               return;
+       }
+
+       e_error(conn->conn.event, "Request timed out");
        auth_request_lookup_abort(conn);
 }
 
@@ -186,16 +206,13 @@ auth_master_handshake_line(struct connection *_conn, const char *line)
                        e_error(conn->conn.event,
                                "Auth server sent invalid version line: %s",
                                line);
-                       auth_request_lookup_abort(conn);
                        return -1;
                }
 
                if (connection_verify_version(_conn, "auth-master",
                                              major_version,
-                                             minor_version) < 0) {
-                       auth_request_lookup_abort(conn);
+                                             minor_version) < 0)
                        return -1;
-               }
                return 0;
        } else if (strcmp(tmp[0], "SPID") != 0) {
                return 0;
@@ -255,7 +272,7 @@ auth_master_input_args(struct connection *_conn, const char *const *args)
 
        ret = auth_master_handle_input(conn, args);
        if (ret < 0) {
-               auth_request_lookup_abort(conn);
+               auth_master_disconnect(conn);
                return -1;
        }
        /* The continue/stop return 0/1 semantics for auth_master_handle_input()