dovecot-2.2-pigeonhole: lib-sieve: message body: Forgot to trim ...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sat Jan 2 18:36:06 UTC 2016


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/123020846e51
changeset: 2191:123020846e51
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sat Jan 02 19:35:24 2016 +0100
description:
lib-sieve: message body: Forgot to trim header values.

diffstat:

 src/lib-sieve/sieve-message.c |  41 +++++++++++++++++++++++++----------------
 1 files changed, 25 insertions(+), 16 deletions(-)

diffs (86 lines):

diff -r c5c60d8f2936 -r 123020846e51 src/lib-sieve/sieve-message.c
--- a/src/lib-sieve/sieve-message.c	Sat Jan 02 19:34:58 2016 +0100
+++ b/src/lib-sieve/sieve-message.c	Sat Jan 02 19:35:24 2016 +0100
@@ -547,6 +547,7 @@
 	return &hdrlist->hdrlist;
 }
 
+// NOTE: get rid of this once we have a proper Sieve string type
 static inline string_t *_header_right_trim(const char *raw)
 {
 	string_t *result;
@@ -1078,7 +1079,8 @@
 	struct mail *mail = sieve_message_get_mail(renv->msgctx);
 	enum message_parser_flags mparser_flags =
 		MESSAGE_PARSER_FLAG_INCLUDE_MULTIPART_BLOCKS;
-	enum message_header_parser_flags hparser_flags = 0;
+	enum message_header_parser_flags hparser_flags =
+		MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP;
 	ARRAY(struct sieve_message_header) headers;
 	struct sieve_message_part *body_part, *header_part, *last_part;
 	struct message_parser_ctx *parser;
@@ -1296,29 +1298,37 @@
 			}
 
 			if ( iter_all && !array_is_created(&body_part->headers) ) {
+				const unsigned char *value, *vp;
+				size_t vlen;
+
 				/* Add header */
 				header = array_append_space(&headers);
 				header->name = p_strdup(pool, hdr->name);
 
-				// FIXME: trim header values
+				/* Trim end of field value (not done by parser) */
+				value = hdr->full_value;
+				vp = value + hdr->full_value_len;
+				while ( vp > value &&
+					(vp[-1] == '\t' || vp[-1] == ' ') )
+					vp--;
+				vlen = (size_t)(vp - value);
 	
 				/* Decode MIME encoded-words. */
 				str_truncate(hdr_content, 0);
 				message_header_decode_utf8
-					(hdr->full_value, hdr->full_value_len, hdr_content, NULL);
-				if ( hdr->full_value_len != str_len(hdr_content) ||
-					strncmp(str_c(hdr_content), (const char *)hdr->full_value,
-						hdr->full_value_len) != 0 ) {
+					(value, vlen, hdr_content, NULL);
+				if ( vlen != str_len(hdr_content) ||
+					strncmp(str_c(hdr_content), (const char *)value,
+						vlen) != 0 ) {
 					if ( strlen(str_c(hdr_content)) != str_len(hdr_content) ) {
 						/* replace NULs with spaces */
 						str_replace_nuls(hdr_content);
 					}
 					/* store raw */
-					data = p_malloc(pool, hdr->full_value_len + 1);
-					data[hdr->full_value_len] = '\0';
-					header->value = memcpy(data,
-						hdr->full_value, hdr->full_value_len);
-					header->value_len = hdr->full_value_len;
+					data = p_malloc(pool, vlen + 1);
+					data[vlen] = '\0';
+					header->value = memcpy(data, value, vlen);
+					header->value_len = vlen;
 					/* store decoded */
 					data = p_malloc(pool, str_len(hdr_content) + 1);
 					data[str_len(hdr_content)] = '\0';
@@ -1327,12 +1337,11 @@
 					header->utf8_value_len = str_len(hdr_content);
 				} else {
 					/* raw == decoded */
-					data = p_malloc(pool, hdr->full_value_len + 1);
-					data[hdr->full_value_len] = '\0';
+					data = p_malloc(pool, vlen + 1);
+					data[vlen] = '\0';
 					header->value = header->utf8_value =
-						memcpy(data, hdr->full_value, hdr->full_value_len);
-					header->value_len = header->utf8_value_len =
-						hdr->full_value_len;
+						memcpy(data, value, vlen);
+					header->value_len = header->utf8_value_len = vlen;
 				}
 
 				if ( hdr_field == _HDR_OTHER )


More information about the dovecot-cvs mailing list