From: Timo Sirainen Date: Fri, 13 Mar 2020 09:55:51 +0000 (+0200) Subject: imap: Fix using $ in a SEARCH that also uses SAVE, or fails with BAD X-Git-Tag: 2.3.11.2~525 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3fd9db0dd0d3c6216709b42a79ee49f59828c34f;p=thirdparty%2Fdovecot%2Fcore.git imap: Fix using $ in a SEARCH that also uses SAVE, or fails with BAD SEARCH RETURN (SAVE) $ cleared the $ instead of being a no-op. Also using a SEARCH that returns BAD shouldn't have cleared $ (but NO reply especially for BADCHARSET should clear it). --- diff --git a/src/imap/imap-search-args.c b/src/imap/imap-search-args.c index c288c553f6..1ff8b2d32a 100644 --- a/src/imap/imap-search-args.c +++ b/src/imap/imap-search-args.c @@ -35,6 +35,14 @@ static bool search_args_have_searchres(struct mail_search_arg *sargs) return FALSE; } +static void imap_search_saved_uidset_clear(struct client_command_context *cmd) +{ + if (array_is_created(&cmd->client->search_saved_uidset)) + array_clear(&cmd->client->search_saved_uidset); + else + i_array_init(&cmd->client->search_saved_uidset, 128); +} + int imap_search_args_build(struct client_command_context *cmd, const struct imap_arg *args, const char *charset, struct mail_search_args **search_args_r) @@ -55,6 +63,8 @@ int imap_search_args_build(struct client_command_context *cmd, mail_search_parser_deinit(&parser); if (ret < 0) { if (charset == NULL) { + if (cmd->search_save_result) + imap_search_saved_uidset_clear(cmd); client_send_tagline(cmd, t_strconcat( "NO [BADCHARSET] ", client_error, NULL)); } else { @@ -70,6 +80,11 @@ int imap_search_args_build(struct client_command_context *cmd, mail_search_args_init(sargs, cmd->client->mailbox, TRUE, &cmd->client->search_saved_uidset); + if (cmd->search_save_result) { + /* clear the SAVE resultset only after potentially using $ + in the search args themselves */ + imap_search_saved_uidset_clear(cmd); + } *search_args_r = sargs; return 1; } diff --git a/src/imap/imap-search.c b/src/imap/imap-search.c index 964a7160b0..65f6eae078 100644 --- a/src/imap/imap-search.c +++ b/src/imap/imap-search.c @@ -555,11 +555,6 @@ int cmd_search_parse_return_if_found(struct imap_search_context *ctx, return 0; } - /* make sure the search result gets cleared if SEARCH fails */ - if (array_is_created(&cmd->client->search_saved_uidset)) - array_clear(&cmd->client->search_saved_uidset); - else - i_array_init(&cmd->client->search_saved_uidset, 128); cmd->search_save_result = TRUE; }