From: Timo Sirainen Date: Mon, 31 Jan 2011 02:00:44 +0000 (+0200) Subject: lib-imap: struct imap_arg.str_size now contains the string value lengths. X-Git-Tag: 2.1.alpha1~391 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6a8cd6eab1ca716ce480962b36a58f9f7379af3;p=thirdparty%2Fdovecot%2Fcore.git lib-imap: struct imap_arg.str_size now contains the string value lengths. This is especially useful for literals that might contain NUL bytes. --- diff --git a/src/lib-imap/imap-arg.h b/src/lib-imap/imap-arg.h index a74014978d..6d4deae1ef 100644 --- a/src/lib-imap/imap-arg.h +++ b/src/lib-imap/imap-arg.h @@ -36,6 +36,9 @@ struct imap_arg { 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; diff --git a/src/lib-imap/imap-parser.c b/src/lib-imap/imap-parser.c index f7146cca27..280fb31c82 100644 --- a/src/lib-imap/imap-parser.c +++ b/src/lib-imap/imap-parser.c @@ -175,6 +175,17 @@ static int imap_parser_close_list(struct imap_parser *parser) 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 @@ static void imap_parser_save_arg(struct imap_parser *parser, } 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 @@ static void imap_parser_save_arg(struct imap_parser *parser, 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 @@ static void imap_parser_save_arg(struct imap_parser *parser, } /* 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();