From f6a8cd6eab1ca716ce480962b36a58f9f7379af3 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 31 Jan 2011 04:00:44 +0200 Subject: [PATCH] lib-imap: struct imap_arg.str_size now contains the string value lengths. This is especially useful for literals that might contain NUL bytes. --- src/lib-imap/imap-arg.h | 3 +++ src/lib-imap/imap-parser.c | 25 ++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) 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(); -- 2.47.3