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();