Package: release.debian.org
Severity: normal
Tags: bookworm
X-Debbugs-Cc: [email protected]
Control: affects -1 + src:dovecot
User: [email protected]
Usertags: pu

Dovecot was updated in bookworm to fix several vulnerabilities with DSA
6197.  There are two issues with the backported fixes that need to be
addressed, but that weren't of a high enough severity to warrant another DSA
revision.  I'd like to correct these issues in the next bookworm point
release.

The issues corrected here are:

An incomplete backport of the CVE-2026-27855 patch from upstream failed to
wrap a call to set_credentials() with the appropriate event delimeters as
intended by upstream.  This was due to a refactor in the 2.4.x development
lifecycle moving this call to another file, and the person performing the
backport to 2.3.x didn't account for the refactor.

The second issue is a memory leak inadvertently introduced when backporting
the fix for CVE-2026-27857.  This is the same leak that needs fixing in
trixie (#1135871).  The solution is to remove the unnecessary
reinitialization of a pointer in src/imap-login/imap-login-cmd-id.c.  Fixing
this also required refreshing subsequent patches for the same vulnerability
due to contextual changes.

debdiff is attached.

noah
diff -Nru dovecot-2.3.19.1+dfsg1/debian/changelog 
dovecot-2.3.19.1+dfsg1/debian/changelog
--- dovecot-2.3.19.1+dfsg1/debian/changelog     2026-04-23 09:40:11.000000000 
-0400
+++ dovecot-2.3.19.1+dfsg1/debian/changelog     2026-05-06 16:09:12.000000000 
-0400
@@ -1,3 +1,10 @@
+dovecot (1:2.3.19.1+dfsg1-2.1+deb12u5) bookworm; urgency=medium
+
+  * [faff670] Correct incomplete backport of CVE-2026-27855 fix
+  * [0e4447b] Fix memory leak in CVE-2026-27857 fix
+
+ -- Noah Meyerhans <[email protected]>  Wed, 06 May 2026 16:09:12 -0400
+
 dovecot (1:2.3.19.1+dfsg1-2.1+deb12u4) bookworm-security; urgency=medium
 
   * [0669596] Add tests for bug 1134464 regression
diff -Nru dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27855-3.patch 
dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27855-3.patch
--- dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27855-3.patch        
2026-04-23 09:40:11.000000000 -0400
+++ dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27855-3.patch        
2026-05-05 20:24:18.000000000 -0400
@@ -17,10 +17,10 @@
  src/auth/auth-worker-server.c | 2 ++
  2 files changed, 6 insertions(+)
 
-Index: dovecot/src/auth/auth-request.c
+Index: 2.3/src/auth/auth-request.c
 ===================================================================
---- dovecot.orig/src/auth/auth-request.c
-+++ dovecot/src/auth/auth-request.c
+--- 2.3.orig/src/auth/auth-request.c
++++ 2.3/src/auth/auth-request.c
 @@ -1341,6 +1341,8 @@ void auth_request_set_credentials(struct
        struct auth_passdb *passdb = request->passdb;
        const char *cache_key, *new_credentials;
@@ -39,3 +39,18 @@
  }
  
  static void auth_request_userdb_save_cache(struct auth_request *request,
+Index: 2.3/src/auth/auth-worker-client.c
+===================================================================
+--- 2.3.orig/src/auth/auth-worker-client.c
++++ 2.3/src/auth/auth-worker-client.c
+@@ -490,8 +490,10 @@ auth_worker_handle_setcred(struct auth_w
+               }
+       }
+ 
++      auth_request_passdb_event_begin(auth_request);
+       auth_request->passdb->passdb->iface.
+               set_credentials(auth_request, creds, set_credentials_callback);
++      auth_request_passdb_event_end(auth_request);
+       return TRUE;
+ }
+ 
diff -Nru dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-2.patch 
dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-2.patch
--- dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-2.patch        
2026-04-23 09:40:11.000000000 -0400
+++ dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-2.patch        
2026-05-05 20:24:18.000000000 -0400
@@ -20,10 +20,10 @@
  src/plugins/virtual/virtual-config.c   |  2 +-
  13 files changed, 30 insertions(+), 19 deletions(-)
 
-Index: dovecot/src/imap-login/imap-login-client.c
+Index: 2.3/src/imap-login/imap-login-client.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-client.c
-+++ dovecot/src/imap-login/imap-login-client.c
+--- 2.3.orig/src/imap-login/imap-login-client.c
++++ 2.3/src/imap-login/imap-login-client.c
 @@ -379,7 +379,7 @@ static void imap_client_create(struct cl
        imap_client->parser =
                imap_parser_create(imap_client->common.input,
@@ -42,25 +42,24 @@
  
        /* CRLF is lost from buffer when streams are reopened. */
        imap_client->skip_line = FALSE;
-Index: dovecot/src/imap-login/imap-login-cmd-id.c
+Index: 2.3/src/imap-login/imap-login-cmd-id.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-cmd-id.c
-+++ dovecot/src/imap-login/imap-login-cmd-id.c
-@@ -237,7 +237,9 @@ int cmd_id(struct imap_client *client)
+--- 2.3.orig/src/imap-login/imap-login-cmd-id.c
++++ 2.3/src/imap-login/imap-login-cmd-id.c
+@@ -237,7 +237,8 @@ int cmd_id(struct imap_client *client)
                client->cmd_id = id = i_new(struct imap_client_cmd_id, 1);
                id->parser = imap_parser_create(client->common.input,
                                                client->common.output,
 -                                              IMAP_LOGIN_MAX_LINE_LENGTH);
 +                                              IMAP_LOGIN_MAX_LINE_LENGTH,
 +                                              NULL);
-+              id->log_reply = str_new(default_pool, 64);
                if (client->set->imap_literal_minus)
                        imap_parser_enable_literal_minus(id->parser);
                parser_flags = IMAP_PARSE_FLAG_STOP_AT_LIST;
-Index: dovecot/src/imap/cmd-append.c
+Index: 2.3/src/imap/cmd-append.c
 ===================================================================
---- dovecot.orig/src/imap/cmd-append.c
-+++ dovecot/src/imap/cmd-append.c
+--- 2.3.orig/src/imap/cmd-append.c
++++ 2.3/src/imap/cmd-append.c
 @@ -947,7 +947,8 @@ bool cmd_append(struct client_command_co
        o_stream_unset_flush_callback(client->output);
  
@@ -71,10 +70,10 @@
        if (client->set->imap_literal_minus)
                imap_parser_enable_literal_minus(ctx->save_parser);
  
-Index: dovecot/src/imap/cmd-setmetadata.c
+Index: 2.3/src/imap/cmd-setmetadata.c
 ===================================================================
---- dovecot.orig/src/imap/cmd-setmetadata.c
-+++ dovecot/src/imap/cmd-setmetadata.c
+--- 2.3.orig/src/imap/cmd-setmetadata.c
++++ 2.3/src/imap/cmd-setmetadata.c
 @@ -289,7 +289,8 @@ cmd_setmetadata_start(struct imap_setmet
           asynchronously the same way as APPEND does. */
        client->input_lock = cmd;
@@ -85,10 +84,10 @@
        if (client->set->imap_literal_minus)
                imap_parser_enable_literal_minus(ctx->parser);
        o_stream_unset_flush_callback(client->output);
-Index: dovecot/src/imap/imap-client.c
+Index: 2.3/src/imap/imap-client.c
 ===================================================================
---- dovecot.orig/src/imap/imap-client.c
-+++ dovecot/src/imap/imap-client.c
+--- 2.3.orig/src/imap/imap-client.c
++++ 2.3/src/imap/imap-client.c
 @@ -953,7 +953,8 @@ client_command_new(struct client *client
        } else {
                cmd->parser =
@@ -99,10 +98,10 @@
                if (client->set->imap_literal_minus)
                        imap_parser_enable_literal_minus(cmd->parser);
        }
-Index: dovecot/src/lib-imap-client/imapc-connection.c
+Index: 2.3/src/lib-imap-client/imapc-connection.c
 ===================================================================
---- dovecot.orig/src/lib-imap-client/imapc-connection.c
-+++ dovecot/src/lib-imap-client/imapc-connection.c
+--- 2.3.orig/src/lib-imap-client/imapc-connection.c
++++ 2.3/src/lib-imap-client/imapc-connection.c
 @@ -1822,7 +1822,8 @@ static void imapc_connection_connect_nex
        o_stream_set_flush_callback(conn->output, imapc_connection_connected,
                                    conn);
@@ -113,10 +112,10 @@
        conn->to = timeout_add(conn->client->set.connect_timeout_msecs,
                               imapc_connection_timeout, conn);
        conn->to_output = timeout_add(conn->client->set.max_idle_time*1000,
-Index: dovecot/src/lib-imap-storage/imap-msgpart.c
+Index: 2.3/src/lib-imap-storage/imap-msgpart.c
 ===================================================================
---- dovecot.orig/src/lib-imap-storage/imap-msgpart.c
-+++ dovecot/src/lib-imap-storage/imap-msgpart.c
+--- 2.3.orig/src/lib-imap-storage/imap-msgpart.c
++++ 2.3/src/lib-imap-storage/imap-msgpart.c
 @@ -148,7 +148,7 @@ imap_msgpart_get_header_fields(pool_t po
        int result = 0;
  
@@ -126,10 +125,10 @@
  
        if (imap_parser_finish_line(parser, 0, 0, &args) > 0 &&
            imap_arg_get_list_full(args, &hdr_list, &list_count) &&
-Index: dovecot/src/lib-imap/imap-bodystructure.c
+Index: 2.3/src/lib-imap/imap-bodystructure.c
 ===================================================================
---- dovecot.orig/src/lib-imap/imap-bodystructure.c
-+++ dovecot/src/lib-imap/imap-bodystructure.c
+--- 2.3.orig/src/lib-imap/imap-bodystructure.c
++++ 2.3/src/lib-imap/imap-bodystructure.c
 @@ -694,7 +694,7 @@ int imap_bodystructure_parse_full(const
        input = i_stream_create_from_data(bodystructure, strlen(bodystructure));
        (void)i_stream_read(input);
@@ -148,10 +147,10 @@
        ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE |
                                      IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
        if (ret < 0) {
-Index: dovecot/src/lib-imap/imap-envelope.c
+Index: 2.3/src/lib-imap/imap-envelope.c
 ===================================================================
---- dovecot.orig/src/lib-imap/imap-envelope.c
-+++ dovecot/src/lib-imap/imap-envelope.c
+--- 2.3.orig/src/lib-imap/imap-envelope.c
++++ 2.3/src/lib-imap/imap-envelope.c
 @@ -222,7 +222,7 @@ bool imap_envelope_parse(const char *env
        input = i_stream_create_from_data(envelope, strlen(envelope));
        (void)i_stream_read(input);
@@ -161,10 +160,10 @@
        ret = imap_parser_finish_line(parser, 0,
                                      IMAP_PARSE_FLAG_LITERAL_TYPE, &args);
        if (ret < 0) {
-Index: dovecot/src/lib-imap/imap-parser.c
+Index: 2.3/src/lib-imap/imap-parser.c
 ===================================================================
---- dovecot.orig/src/lib-imap/imap-parser.c
-+++ dovecot/src/lib-imap/imap-parser.c
+--- 2.3.orig/src/lib-imap/imap-parser.c
++++ 2.3/src/lib-imap/imap-parser.c
 @@ -69,7 +69,8 @@ struct imap_parser {
  
  struct imap_parser *
@@ -175,10 +174,10 @@
  {
        struct imap_parser *parser;
  
-Index: dovecot/src/lib-imap/imap-parser.h
+Index: 2.3/src/lib-imap/imap-parser.h
 ===================================================================
---- dovecot.orig/src/lib-imap/imap-parser.h
-+++ dovecot/src/lib-imap/imap-parser.h
+--- 2.3.orig/src/lib-imap/imap-parser.h
++++ 2.3/src/lib-imap/imap-parser.h
 @@ -38,6 +38,9 @@ enum imap_parser_error {
        IMAP_PARSE_ERROR_LITERAL_TOO_BIG
  };
@@ -199,10 +198,10 @@
  void imap_parser_ref(struct imap_parser *parser);
  void imap_parser_unref(struct imap_parser **parser);
  
-Index: dovecot/src/lib-imap/test-imap-parser.c
+Index: 2.3/src/lib-imap/test-imap-parser.c
 ===================================================================
---- dovecot.orig/src/lib-imap/test-imap-parser.c
-+++ dovecot/src/lib-imap/test-imap-parser.c
+--- 2.3.orig/src/lib-imap/test-imap-parser.c
++++ 2.3/src/lib-imap/test-imap-parser.c
 @@ -16,7 +16,7 @@ static void test_imap_parser_crlf(void)
  
        test_begin("imap parser crlf handling");
@@ -239,10 +238,10 @@
                        ret = imap_parser_read_command_name(parser, &atom);
                        test_assert_idx(ret == tests[i].ret, i);
                        test_assert_idx(ret <= 0 || strcmp(tests[i].tag, atom) 
== 0, i);
-Index: dovecot/src/plugins/virtual/virtual-config.c
+Index: 2.3/src/plugins/virtual/virtual-config.c
 ===================================================================
---- dovecot.orig/src/plugins/virtual/virtual-config.c
-+++ dovecot/src/plugins/virtual/virtual-config.c
+--- 2.3.orig/src/plugins/virtual/virtual-config.c
++++ 2.3/src/plugins/virtual/virtual-config.c
 @@ -54,7 +54,7 @@ virtual_search_args_parse(const string_t
        input = i_stream_create_from_data(str_data(rule), str_len(rule));
        (void)i_stream_read(input);
@@ -252,10 +251,10 @@
        ret = imap_parser_finish_line(imap_parser, 0,  0, &args);
        if (ret < 0) {
                sargs = NULL;
-Index: dovecot/src/lib-imap/imap-id.c
+Index: 2.3/src/lib-imap/imap-id.c
 ===================================================================
---- dovecot.orig/src/lib-imap/imap-id.c
-+++ dovecot/src/lib-imap/imap-id.c
+--- 2.3.orig/src/lib-imap/imap-id.c
++++ 2.3/src/lib-imap/imap-id.c
 @@ -111,7 +111,7 @@ const char *imap_id_reply_generate(const
        input = i_stream_create_from_data(settings, strlen(settings));
        (void)i_stream_read(input);
@@ -265,10 +264,10 @@
        if (imap_parser_finish_line(parser, 0, 0, &args) <= 0)
                ret = "NIL";
        else
-Index: dovecot/src/director/director-test.c
+Index: 2.3/src/director/director-test.c
 ===================================================================
---- dovecot.orig/src/director/director-test.c
-+++ dovecot/src/director/director-test.c
+--- 2.3.orig/src/director/director-test.c
++++ 2.3/src/director/director-test.c
 @@ -250,7 +250,7 @@ static void imap_client_create(int fd)
        o_stream_set_no_error_handling(client->output, TRUE);
        client->io = io_add(fd, IO_READ, imap_client_input, client);
diff -Nru dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-4.patch 
dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-4.patch
--- dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-4.patch        
2026-04-23 09:40:11.000000000 -0400
+++ dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-4.patch        
2026-05-06 07:50:20.000000000 -0400
@@ -11,10 +11,10 @@
  src/imap-login/imap-login-cmd-id.c |  6 +++++-
  3 files changed, 17 insertions(+), 3 deletions(-)
 
-Index: dovecot/src/imap-login/imap-login-client.c
+Index: 2.3/src/imap-login/imap-login-client.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-client.c
-+++ dovecot/src/imap-login/imap-login-client.c
+--- 2.3.orig/src/imap-login/imap-login-client.c
++++ 2.3/src/imap-login/imap-login-client.c
 @@ -375,11 +375,14 @@ static void imap_client_create(struct cl
  {
        struct imap_client *imap_client = (struct imap_client *)client;
@@ -47,10 +47,10 @@
  
        /* CRLF is lost from buffer when streams are reopened. */
        imap_client->skip_line = FALSE;
-Index: dovecot/src/imap-login/imap-login-client.h
+Index: 2.3/src/imap-login/imap-login-client.h
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-client.h
-+++ dovecot/src/imap-login/imap-login-client.h
+--- 2.3.orig/src/imap-login/imap-login-client.h
++++ 2.3/src/imap-login/imap-login-client.h
 @@ -11,6 +11,10 @@
  /* maximum length for IMAP command line. */
  #define IMAP_LOGIN_MAX_LINE_LENGTH 8192
@@ -62,10 +62,10 @@
  enum imap_client_id_state {
        IMAP_CLIENT_ID_STATE_LIST = 0,
        IMAP_CLIENT_ID_STATE_KEY,
-Index: dovecot/src/imap-login/imap-login-cmd-id.c
+Index: 2.3/src/imap-login/imap-login-cmd-id.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-cmd-id.c
-+++ dovecot/src/imap-login/imap-login-cmd-id.c
+--- 2.3.orig/src/imap-login/imap-login-cmd-id.c
++++ 2.3/src/imap-login/imap-login-cmd-id.c
 @@ -235,10 +235,14 @@ int cmd_id(struct imap_client *client)
  
        if (client->cmd_id == NULL) {
@@ -79,6 +79,6 @@
                                                IMAP_LOGIN_MAX_LINE_LENGTH,
 -                                              NULL);
 +                                              &params);
-               id->log_reply = str_new(default_pool, 64);
                if (client->set->imap_literal_minus)
                        imap_parser_enable_literal_minus(id->parser);
+               parser_flags = IMAP_PARSE_FLAG_STOP_AT_LIST;
diff -Nru dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-5.patch 
dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-5.patch
--- dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-5.patch        
2026-04-23 09:40:11.000000000 -0400
+++ dovecot-2.3.19.1+dfsg1/debian/patches/CVE-2026-27857-5.patch        
2026-05-06 08:02:06.000000000 -0400
@@ -9,10 +9,10 @@
  src/lib-imap/test-imap-parser.c    | 2 +-
  3 files changed, 4 insertions(+), 4 deletions(-)
 
-Index: dovecot/src/imap-login/imap-login-client.c
+Index: 2.3/src/imap-login/imap-login-client.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-client.c
-+++ dovecot/src/imap-login/imap-login-client.c
+--- 2.3.orig/src/imap-login/imap-login-client.c
++++ 2.3/src/imap-login/imap-login-client.c
 @@ -375,7 +375,7 @@ static void imap_client_create(struct cl
  {
        struct imap_client *imap_client = (struct imap_client *)client;
@@ -31,10 +31,10 @@
                .list_count_limit = IMAP_LOGIN_LIST_COUNT_LIMIT,
        };
        imap_parser_unref(&imap_client->parser);
-Index: dovecot/src/imap-login/imap-login-cmd-id.c
+Index: 2.3/src/imap-login/imap-login-cmd-id.c
 ===================================================================
---- dovecot.orig/src/imap-login/imap-login-cmd-id.c
-+++ dovecot/src/imap-login/imap-login-cmd-id.c
+--- 2.3.orig/src/imap-login/imap-login-cmd-id.c
++++ 2.3/src/imap-login/imap-login-cmd-id.c
 @@ -236,7 +236,7 @@ int cmd_id(struct imap_client *client)
        if (client->cmd_id == NULL) {
                client->cmd_id = id = i_new(struct imap_client_cmd_id, 1);
@@ -44,10 +44,10 @@
                        .list_count_limit = IMAP_LOGIN_LIST_COUNT_LIMIT,
                };
                id->parser = imap_parser_create(client->common.input,
-Index: dovecot/src/lib-imap/test-imap-parser.c
+Index: 2.3/src/lib-imap/test-imap-parser.c
 ===================================================================
---- dovecot.orig/src/lib-imap/test-imap-parser.c
-+++ dovecot/src/lib-imap/test-imap-parser.c
+--- 2.3.orig/src/lib-imap/test-imap-parser.c
++++ 2.3/src/lib-imap/test-imap-parser.c
 @@ -95,7 +95,7 @@ static void test_imap_parser_list_limit(
        const struct imap_arg *args;
  

Reply via email to