]> dgit.raspbian.org Git - dovecot.git/commitdiff
[PATCH 2/5] submission-login: client - Fix panic occurring at mail_max_userip_connect...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 28 Nov 2025 03:12:10 +0000 (04:12 +0100)
committerNoah Meyerhans <noahm@debian.org>
Wed, 16 Sep 2026 19:06:35 +0000 (15:06 -0400)
Panic was:
Panic: epoll_ctl(del, 8) failed: Bad file descriptor

Fixed by making sure the underlying smtp-server connection is always closed before the connection FD is closed.

Gbp-Pq: Name 0002-submission-login-client-Fix-panic-occurring-at-mail_.patch

src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server.h
src/submission-login/client.c

index f2ef80ae3d2333a5761e49c5b579539ddd0d0775..c0988eadba395da8d9eed7ce4dc22d4cc213bb60 100644 (file)
@@ -1401,6 +1401,11 @@ void smtp_server_connection_close(struct smtp_server_connection **_conn,
        smtp_server_connection_unref(&conn);
 }
 
+bool smtp_server_connection_is_closed(struct smtp_server_connection *conn)
+{
+       return conn->closed;
+}
+
 void smtp_server_connection_terminate(struct smtp_server_connection **_conn,
                                      const char *enh_code, const char *reason)
 {
index 2ee7b6af776098b1478663a30305d1aacfde376c..9f5bff51a2f18780c36fbbbeaf638d26f7b9bc93 100644 (file)
@@ -476,6 +476,7 @@ void smtp_server_connection_set_ssl_streams(struct smtp_server_connection *conn,
 
 void smtp_server_connection_close(struct smtp_server_connection **_conn,
                                  const char *reason) ATTR_NULL(2);
+bool smtp_server_connection_is_closed(struct smtp_server_connection *conn);
 void smtp_server_connection_terminate(struct smtp_server_connection **_conn,
                                      const char *enh_code, const char *reason)
                                      ATTR_NULL(3);
index 7d8b37e09aeceb2923f59d19c2a9d543c14de9c5..87763b29b9d6b8ccf487fe069aaaee382321445e 100644 (file)
@@ -146,6 +146,21 @@ static int submission_client_create(struct client *client)
        return 0;
 }
 
+static void
+submission_client_disconnect(struct client *client, const char *reason)
+{
+       struct submission_client *subm_client =
+               container_of(client, struct submission_client, common);
+
+       /* If the smtp-server connection is already in its close cascade (i.e.
+          we're being called via its conn_disconnect callback), skip closing
+          it again. Doing so would null subm_client->conn and prevent the
+          conn_free callback from invoking client_destroy(). */
+       if (subm_client->conn != NULL &&
+           !smtp_server_connection_is_closed(subm_client->conn))
+               smtp_server_connection_close(&subm_client->conn, reason);
+}
+
 static void submission_client_destroy(struct client *client)
 {
        struct submission_client *subm_client =
@@ -320,6 +335,7 @@ static const struct smtp_server_callbacks smtp_callbacks = {
 static struct client_vfuncs submission_client_vfuncs = {
        .alloc = submission_client_alloc,
        .create = submission_client_create,
+       .disconnect = submission_client_disconnect,
        .destroy = submission_client_destroy,
        .reload_config = submission_client_reload_config,
        .notify_auth_ready = submission_client_notify_auth_ready,