# HG changeset patch # User Timo Sirainen # Date 1296439244 -7200 # Node ID 1e88287fc72179279cd6cdd78a9b6880765cb112 # Parent cecc6c28ce0e57f08ae15a52cda9bf0b87f78e1c 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 -r cecc6c28ce0e -r 1e88287fc721 src/lib-imap/imap-arg.h --- 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; diff -r cecc6c28ce0e -r 1e88287fc721 src/lib-imap/imap-parser.c --- 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();