From: Stephan Bosch Date: Wed, 27 Aug 2025 17:27:25 +0000 (+0200) Subject: lib-smtp: smtp-command-parser - Allow skipping data from previous command without... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aeab257976f3d44e47fda82146ac7ea4c7949942;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-command-parser - Allow skipping data from previous command without reading the next --- diff --git a/src/lib-smtp/smtp-command-parser.c b/src/lib-smtp/smtp-command-parser.c index abfdb4cc4b..0f5c74ae3d 100644 --- a/src/lib-smtp/smtp-command-parser.c +++ b/src/lib-smtp/smtp-command-parser.c @@ -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) { diff --git a/src/lib-smtp/smtp-command-parser.h b/src/lib-smtp/smtp-command-parser.h index 9e378be67a..28636e94d8 100644 --- a/src/lib-smtp/smtp-command-parser.h +++ b/src/lib-smtp/smtp-command-parser.h @@ -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); diff --git a/src/lib-smtp/test-smtp-command-parser.c b/src/lib-smtp/test-smtp-command-parser.c index 329c1b8e57..60cdbb42ee 100644 --- a/src/lib-smtp/test-smtp-command-parser.c +++ b/src/lib-smtp/test-smtp-command-parser.c @@ -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); }