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); + ¶ms); - 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;

