return arg;
}
-static void imap_parser_open_list(struct imap_parser *parser)
+static bool imap_parser_open_list(struct imap_parser *parser)
{
+ if (parser->list_count >= parser->list_count_limit) {
+ parser->error_msg = "Too many '('";
+ parser->error = IMAP_PARSE_ERROR_BAD_SYNTAX;
+ return FALSE;
+ }
+ parser->list_count++;
+
parser->list_arg = imap_arg_create(parser);
parser->list_arg->type = IMAP_ARG_LIST;
p_array_init(&parser->list_arg->_data.list, parser->pool,
parser->cur_list = &parser->list_arg->_data.list;
parser->cur_type = ARG_PARSE_NONE;
+ return TRUE;
}
static bool imap_parser_close_list(struct imap_parser *parser)
parser->error = IMAP_PARSE_ERROR_BAD_SYNTAX;
return FALSE;
}
- if (parser->list_count >= parser->list_count_limit) {
- parser->error_msg = "Too many '('";
- parser->error = IMAP_PARSE_ERROR_BAD_SYNTAX;
- return FALSE;
- }
- parser->list_count++;
arg = imap_arg_create(parser);
arg->type = IMAP_ARG_EOL;
parser->literal8 = FALSE;
break;
case '(':
- imap_parser_open_list(parser);
+ if (!imap_parser_open_list(parser))
+ return FALSE;
if ((parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) != 0) {
i_stream_skip(parser->input, 1);
return FALSE;
struct {
const char *input;
int ret;
+ const char *error;
} tests[] = {
- { "(())\r\n", 1 },
- { "((()))\r\n", -1 },
+ { "(())\r\n", 1, NULL },
+ { "((\r\n", -1, "Missing ')'" },
+ { "(()\r\n", -1, "Missing ')'" },
+ { "(()))\r\n", -1, "Unexpected ')'" },
+ { "((()))\r\n", -1, "Too many '('" },
+ { "(({10}\r\n", -2, NULL },
+ { "((({10}\r\n", -1, "Too many '('" },
};
struct istream_chain *chain;
struct istream *chain_input;
(void)i_stream_read(chain_input);
test_assert_cmp(imap_parser_read_args(parser, 0, 0, &args), ==, tests[i].ret);
+ if (tests[i].ret == -1) {
+ enum imap_parser_error err;
+ test_assert_strcmp_idx(imap_parser_get_error(parser, &err), tests[i].error, i);
+ }
/* skip over CRLF */
i_stream_skip(chain_input, i_stream_get_data_size(chain_input));