Mercurial > dovecot > core-2.2
changeset 14589:c54dd35e1c0e
imap-parser: Added IMAP_PARSE_FLAG_INSIDE_LIST flag.
Adds mode flag to IMAP parser which makes it assume it is inside a (...) list,
making ')' equal to EOL and '\n' an error.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Sat, 02 Jun 2012 17:15:18 +0300 |
parents | 2d9b13930a6a |
children | 9eef4f7b0187 |
files | src/lib-imap/imap-parser.c src/lib-imap/imap-parser.h |
diffstat | 2 files changed, 14 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-imap/imap-parser.c Sat Jun 02 17:12:06 2012 +0300 +++ b/src/lib-imap/imap-parser.c Sat Jun 02 17:15:18 2012 +0300 @@ -171,6 +171,11 @@ if (parser->list_arg == NULL) { /* we're not inside list */ + if ((parser->flags & IMAP_PARSE_FLAG_INSIDE_LIST) != 0) { + parser->eol = TRUE; + parser->cur_type = ARG_PARSE_NONE; + return TRUE; + } parser->error = "Unexpected ')'"; return FALSE; } @@ -289,7 +294,8 @@ imap_parser_save_arg(parser, data, i); break; } else if (data[i] == ')') { - if (parser->list_arg != NULL) { + if (parser->list_arg != NULL || + (parser->flags & IMAP_PARSE_FLAG_INSIDE_LIST) != 0) { imap_parser_save_arg(parser, data, i); break; } else if ((parser->flags & @@ -498,6 +504,10 @@ /* fall through */ case '\n': /* unexpected end of line */ + if ((parser->flags & IMAP_PARSE_FLAG_INSIDE_LIST) != 0) { + parser->error = "Missing ')'"; + return FALSE; + } parser->eol = TRUE; return FALSE; case '"':
--- a/src/lib-imap/imap-parser.h Sat Jun 02 17:12:06 2012 +0300 +++ b/src/lib-imap/imap-parser.h Sat Jun 02 17:15:18 2012 +0300 @@ -16,7 +16,9 @@ /* Don't check if atom contains invalid characters */ IMAP_PARSE_FLAG_ATOM_ALLCHARS = 0x08, /* Allow strings to contain CRLFs */ - IMAP_PARSE_FLAG_MULTILINE_STR = 0x10 + IMAP_PARSE_FLAG_MULTILINE_STR = 0x10, + /* Parse in list context; ')' parses as EOL */ + IMAP_PARSE_FLAG_INSIDE_LIST = 0x20 }; struct imap_parser;