Mercurial > dovecot > core-2.2
changeset 12614:1e88287fc721
lib-imap: struct imap_arg.str_size now contains the string value lengths.
This is especially useful for literals that might contain NUL bytes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 31 Jan 2011 04:00:44 +0200 |
parents | cecc6c28ce0e |
children | 3dde816d945d |
files | src/lib-imap/imap-arg.h src/lib-imap/imap-parser.c |
diffstat | 2 files changed, 21 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-imap/imap-arg.h Mon Jan 31 02:17:26 2011 +0200 +++ b/src/lib-imap/imap-arg.h Mon Jan 31 04:00:44 2011 +0200 @@ -36,6 +36,9 @@ enum imap_arg_type type; struct imap_arg *parent; /* always of type IMAP_ARG_LIST */ + /* Set when _data.str is set */ + size_t str_len; + union { const char *str; uoff_t literal_size;
--- a/src/lib-imap/imap-parser.c Mon Jan 31 02:17:26 2011 +0200 +++ b/src/lib-imap/imap-parser.c Mon Jan 31 04:00:44 2011 +0200 @@ -175,6 +175,17 @@ return TRUE; } +static char * +imap_parser_strdup(struct imap_parser *parser, + const void *data, size_t len) +{ + char *ret; + + ret = p_malloc(parser->pool, len + 1); + memcpy(ret, data, len); + return ret; +} + static void imap_parser_save_arg(struct imap_parser *parser, const unsigned char *data, size_t size) { @@ -191,7 +202,8 @@ } else { /* simply save the string */ arg->type = IMAP_ARG_ATOM; - arg->_data.str = p_strndup(parser->pool, data, size); + arg->_data.str = imap_parser_strdup(parser, data, size); + arg->str_len = size; } break; case ARG_PARSE_STRING: @@ -208,6 +220,7 @@ str_unescape(str + parser->str_first_escape-1); } arg->_data.str = str; + arg->str_len = strlen(str); break; case ARG_PARSE_LITERAL_DATA: if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) != 0) { @@ -220,14 +233,12 @@ } /* fall through */ case ARG_PARSE_LITERAL_DATA_FORCED: - if ((parser->flags & - IMAP_PARSE_FLAG_LITERAL_TYPE) != 0) { + if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_TYPE) != 0) arg->type = IMAP_ARG_LITERAL; - arg->_data.str = p_strndup(parser->pool, data, size); - } else { + else arg->type = IMAP_ARG_STRING; - arg->_data.str = p_strndup(parser->pool, data, size); - } + arg->_data.str = imap_parser_strdup(parser, data, size); + arg->str_len = size; break; default: i_unreached();