]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-command-parser - Allow skipping data from previous command without...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 27 Aug 2025 17:27:25 +0000 (19:27 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 26 Sep 2025 01:38:53 +0000 (03:38 +0200)
src/lib-smtp/smtp-command-parser.c
src/lib-smtp/smtp-command-parser.h
src/lib-smtp/test-smtp-command-parser.c

index abfdb4cc4bb9c1a4bf832400a7138ef076babcf1..0f5c74ae3d5bf65af64060431484081a0cdbdfc9 100644 (file)
@@ -506,6 +506,7 @@ static int smtp_command_parse_finish_data(struct smtp_command_parser *parser)
 }
 
 int smtp_command_parse_next(struct smtp_command_parser *parser,
+                           bool only_finish_previous,
                            const char **cmd_name_r, const char **cmd_params_r,
                            enum smtp_command_parse_error *error_code_r,
                            const char **error_r)
@@ -517,6 +518,8 @@ int smtp_command_parse_next(struct smtp_command_parser *parser,
                 parser->state.state == SMTP_COMMAND_PARSE_STATE_ERROR);
        parser->auth_response = FALSE;
 
+       *cmd_name_r = NULL;
+       *cmd_params_r = NULL;
        *error_code_r = parser->error_code = SMTP_COMMAND_PARSE_ERROR_NONE;
        *error_r = NULL;
 
@@ -533,6 +536,9 @@ int smtp_command_parse_next(struct smtp_command_parser *parser,
                return ret;
        }
 
+       if (only_finish_previous)
+               return 1;
+
        ret = smtp_command_parse(parser);
        if (ret <= 0) {
                if (ret < 0) {
index 9e378be67a86b3be30d170da12e4b602b839be0e..28636e94d8b668768b68143d9f363c054d9bd258 100644 (file)
@@ -38,6 +38,7 @@ void smtp_command_parser_set_stream(struct smtp_command_parser *parser,
    -2 if disconnected in SMTP_COMMAND_PARSE_STATE_INIT state. -2 is mainly for
    unit tests - it can normally be treated the same as -1. */
 int smtp_command_parse_next(struct smtp_command_parser *parser,
+                           bool only_finish_previous,
                            const char **cmd_name_r, const char **cmd_params_r,
                            enum smtp_command_parse_error *error_code_r,
                            const char **error_r);
index 329c1b8e57dd48d038296332c692677401ece026..60cdbb42ee164527cd071f96e48f06fd025222d7 100644 (file)
@@ -112,8 +112,8 @@ static void test_smtp_command_parse_valid(void)
                parser = smtp_command_parser_init(input, &test->limits);
 
                while ((ret = smtp_command_parse_next(
-                       parser, &cmd_name, &cmd_params,
-                       &error_code, &error)) > 0);
+                               parser, FALSE, &cmd_name, &cmd_params,
+                               &error_code, &error)) > 0);
 
                test_out_reason("parse success [buffer]", ret == -2,
                                (ret == -2 ? NULL : error));
@@ -138,14 +138,14 @@ static void test_smtp_command_parse_valid(void)
                for (pos = 0; pos <= command_text_len && ret == 0; pos++) {
                        test_istream_set_size(input, pos);
                        ret = smtp_command_parse_next(
-                               parser, &cmd_name, &cmd_params,
+                               parser, FALSE, &cmd_name, &cmd_params,
                                &error_code, &error);
                }
                test_istream_set_size(input, command_text_len);
                if (ret >= 0) {
                        while ((ret = smtp_command_parse_next(
-                               parser, &cmd_name, &cmd_params,
-                               &error_code, &error)) > 0);
+                                       parser, FALSE, &cmd_name, &cmd_params,
+                                       &error_code, &error)) > 0);
                }
 
                test_out_reason("parse success [stream]", ret == -2,
@@ -271,7 +271,8 @@ static void test_smtp_command_parse_invalid(void)
                                                  command_text_len);
                parser = smtp_command_parser_init(input, &test->limits);
 
-               ret = smtp_command_parse_next(parser, &cmd_name, &cmd_params,
+               ret = smtp_command_parse_next(parser, FALSE,
+                                             &cmd_name, &cmd_params,
                                              &error_code, &error);
                i_assert(ret != 0);
 
@@ -294,15 +295,15 @@ static void test_smtp_command_parse_invalid(void)
 
                for (pos = 0; pos <= command_text_len && ret == 0; pos++) {
                        test_istream_set_size(input, pos);
-                       ret = smtp_command_parse_next(
-                               parser, &cmd_name, &cmd_params,
-                               &error_code, &error);
+                       ret = smtp_command_parse_next(parser, FALSE,
+                                                     &cmd_name, &cmd_params,
+                                                     &error_code, &error);
                }
                test_istream_set_size(input, command_text_len);
                if (ret == 0) {
-                       ret = smtp_command_parse_next(
-                               parser, &cmd_name, &cmd_params,
-                               &error_code, &error);
+                       ret = smtp_command_parse_next(parser, FALSE,
+                                                     &cmd_name, &cmd_params,
+                                                     &error_code, &error);
                        i_assert(ret != 0);
                }