[dovecot-cvs] dovecot/src/lib-imap imap-parser.c,1.17,1.18
cras at procontrol.fi
cras at procontrol.fi
Sat Nov 30 17:40:20 EET 2002
Update of /home/cvs/dovecot/src/lib-imap
In directory danu:/tmp/cvs-serv8836/lib-imap
Modified Files:
imap-parser.c
Log Message:
Input parsing was a bit broken in some conditions. Mostly visible with
APPEND (_finally_, that should be the last weird bug I've noticed).
Index: imap-parser.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-imap/imap-parser.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- imap-parser.c 28 Oct 2002 09:46:03 -0000 1.17
+++ imap-parser.c 30 Nov 2002 15:40:18 -0000 1.18
@@ -257,7 +257,7 @@
}
parser->cur_pos = i;
- return TRUE;
+ return parser->cur_type == ARG_PARSE_NONE;
}
static int imap_parser_read_string(ImapParser *parser, const char *data,
@@ -299,7 +299,7 @@
}
parser->cur_pos = i;
- return TRUE;
+ return parser->cur_type == ARG_PARSE_NONE;
}
static int imap_parser_literal_end(ImapParser *parser)
@@ -333,13 +333,13 @@
for (i = parser->cur_pos; i < data_size; i++) {
if (data[i] == '}') {
i_buffer_skip(parser->inbuf, i+1);
- if (!imap_parser_literal_end(parser))
- return FALSE;
- break;
+ return imap_parser_literal_end(parser);
}
- if (data[i] < '0' || data[i] > '9')
+ if (data[i] < '0' || data[i] > '9') {
+ parser->error = TRUE;
return FALSE;
+ }
prev_size = parser->literal_size;
parser->literal_size = parser->literal_size*10 + (data[i]-'0');
@@ -351,7 +351,8 @@
}
}
- return TRUE;
+ parser->cur_pos = i;
+ return FALSE;
}
static int imap_parser_read_literal_data(ImapParser *parser, const char *data,
@@ -359,16 +360,21 @@
{
if (parser->literal_skip_crlf) {
/* skip \r\n or \n, anything else gives an error */
+ if (data_size == 0)
+ return FALSE;
+
if (*data == '\r') {
if (data_size == 1)
- return TRUE;
+ return FALSE;
data++; data_size--;
i_buffer_skip(parser->inbuf, 1);
}
- if (*data != '\n')
+ if (*data != '\n') {
+ parser->error = TRUE;
return FALSE;
+ }
data++; data_size--;
i_buffer_skip(parser->inbuf, 1);
@@ -379,17 +385,19 @@
if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0) {
/* now we just wait until we've read enough data */
- if (data_size >= parser->literal_size) {
+ if (data_size < parser->literal_size)
+ return FALSE;
+ else {
imap_parser_save_arg(parser, data,
(size_t)parser->literal_size);
parser->cur_pos = (size_t)parser->literal_size;
+ return TRUE;
}
} else {
/* we want to save only literal size, not the literal itself. */
imap_parser_save_arg(parser, NULL, 0);
+ return TRUE;
}
-
- return TRUE;
}
/* Returns TRUE if argument was fully processed. Also returns TRUE if
@@ -467,13 +475,15 @@
/* fall through */
case ARG_PARSE_LITERAL_DATA:
- imap_parser_read_literal_data(parser, data, data_size);
+ if (!imap_parser_read_literal_data(parser, data, data_size))
+ return FALSE;
break;
default:
i_unreached();
}
- return parser->cur_type == ARG_PARSE_NONE;
+ i_assert(parser->cur_type == ARG_PARSE_NONE);
+ return TRUE;
}
int imap_parser_read_args(ImapParser *parser, unsigned int count,
More information about the dovecot-cvs
mailing list