*list_r = array_get(&arg->_data.list, &count);
- /* drop IMAP_ARG_EOL from list size */
- i_assert(count > 0);
- *list_count_r = count - 1;
+ if (count > 0 && (*list_r)[count-1].type == IMAP_ARG_EOL)
+ count--;
+ else {
+ /* imap-parser stopped early (e.g. due to reading literal size).
+ The IMAP_ARG_EOL was added to the list only temporarily. */
+ i_assert((*list_r)[count].type == IMAP_ARG_EOL);
+ }
+ *list_count_r = count;
return TRUE;
}
parser->cur_pos = 0;
parser->cur_resp_text = FALSE;
- if (parser->list_arg != NULL && !parser->literal_size_return &&
- (parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0) {
+ if (parser->list_arg == NULL) {
+ /* no open list */
+ } else if (!parser->literal_size_return &&
+ (parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0) {
parser->error = IMAP_PARSE_ERROR_BAD_SYNTAX;
parser->error_msg = "Missing ')'";
*args_r = NULL;
return -1;
+ } else {
+ arg = array_append_space(&parser->list_arg->_data.list);
+ arg->type = IMAP_ARG_EOL;
+ array_pop_back(&parser->list_arg->_data.list);
}
arg = array_append_space(&parser->root_list);
return ret;
}
+static void imap_parser_delete_extra_eol(struct imap_parser *parser)
+{
+ array_pop_back(&parser->root_list);
+ parser->args_added_extra_eol = FALSE;
+}
+
int imap_parser_read_args(struct imap_parser *parser, unsigned int count,
enum imap_parser_flags flags,
const struct imap_arg **args_r)
if (parser->args_added_extra_eol) {
/* delete EOL */
- array_pop_back(&parser->root_list);
- parser->args_added_extra_eol = FALSE;
+ imap_parser_delete_extra_eol(parser);
parser->literal_size_return = FALSE;
}
struct imap_arg *last_arg;
i_assert(parser->literal_size_return);
+ i_assert(parser->args_added_extra_eol);
last_arg = imap_parser_get_last_literal_size(parser, &list);
i_assert(last_arg != NULL);
i_assert(parser->literal_size == last_arg->_data.literal_size);
/* delete EOL */
- array_pop_back(&parser->root_list);
- parser->args_added_extra_eol = FALSE;
+ imap_parser_delete_extra_eol(parser);
/* delete literal size */
array_pop_back(list);