Skip to content

Commit

Permalink
lib-smtp: server: Fix infinite loop when client disconnects in initia…
Browse files Browse the repository at this point in the history
…l state
  • Loading branch information
sirainen authored and cmouse committed Dec 18, 2017
1 parent 60a8575 commit 4e4b3ae
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/lib-smtp/smtp-command-parser.c
Expand Up @@ -362,7 +362,7 @@ static int smtp_command_parse(struct smtp_command_parser *parser)
i_assert(parser->input->eof);
if (parser->input->stream_errno == 0) {
if (parser->state.state == SMTP_COMMAND_PARSE_STATE_INIT)
return 0;
ret = -2;
smtp_command_parser_error(parser,
SMTP_COMMAND_PARSE_ERROR_BROKEN_COMMAND,
"Premature end of input");
Expand Down
4 changes: 4 additions & 0 deletions src/lib-smtp/smtp-command-parser.h
Expand Up @@ -22,6 +22,9 @@ void smtp_command_parser_deinit(struct smtp_command_parser **_parser);
void smtp_command_parser_set_stream(struct smtp_command_parser *parser,
struct istream *input);

/* Returns 1 if a command was returned, 0 if more data is needed, -1 on error,
-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,
const char **cmd_name_r, const char **cmd_params_r,
enum smtp_command_parse_error *error_code_r, const char **error_r);
Expand All @@ -33,6 +36,7 @@ struct istream *
smtp_command_parse_data_with_dot(struct smtp_command_parser *parser);
bool smtp_command_parser_pending_data(struct smtp_command_parser *parser);

/* Returns the same as smtp_command_parse_next() */
int smtp_command_parse_auth_response(struct smtp_command_parser *parser,
const char **line_r, enum smtp_command_parse_error *error_code_r,
const char **error_r);
Expand Down
8 changes: 4 additions & 4 deletions src/lib-smtp/test-smtp-command-parser.c
Expand Up @@ -85,7 +85,7 @@ static void test_smtp_command_parse_valid(void)
while ((ret=smtp_command_parse_next(parser,
&cmd_name, &cmd_params, &error_code, &error)) > 0);

test_out_reason("parse success", ret == 0, error);
test_out_reason("parse success", ret == -2, error);

if (ret == 0) {
/* verify last response only */
Expand Down Expand Up @@ -167,7 +167,7 @@ static void test_smtp_command_parse_invalid(void)
while ((ret=smtp_command_parse_next(parser,
&cmd_name, &cmd_params, &error_code, &error)) > 0);
test_out_reason(t_strdup_printf("parse(\"%s\")",
str_sanitize(command_text, 28)), ret < 0, error);
str_sanitize(command_text, 28)), ret == -1, error);
test_out_quiet("error code",
error_code == test->error_code);

Expand Down Expand Up @@ -232,7 +232,7 @@ static void test_smtp_auth_response_parse_valid(void)
while ((ret=smtp_command_parse_auth_response(parser,
&line, &error_code, &error)) > 0);

test_out_reason("parse success", ret == 0, error);
test_out_reason("parse success", ret == -2, error);

if (ret == 0) {
/* verify last response only */
Expand Down Expand Up @@ -302,7 +302,7 @@ static void test_smtp_auth_response_parse_invalid(void)
while ((ret=smtp_command_parse_auth_response(parser,
&line, &error_code, &error)) > 0);
test_out_reason(t_strdup_printf("parse(\"%s\")",
str_sanitize(response_text, 28)), ret < 0, error);
str_sanitize(response_text, 28)), ret == -1, error);
test_out_quiet("error code",
error_code == test->error_code);

Expand Down

0 comments on commit 4e4b3ae

Please sign in to comment.