changeset 10313:037299bb2199 HEAD

rfc2231 parser: Fixed parsing "key*".
author Timo Sirainen <tss@iki.fi>
date Thu, 12 Nov 2009 12:42:31 -0500
parents 3baf1cb9fdda
children 49f6fc5b60a8
files src/lib-mail/rfc2231-parser.c src/lib-mail/test-rfc2231-parser.c
diffstat 2 files changed, 17 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/rfc2231-parser.c	Wed Nov 11 15:40:18 2009 -0500
+++ b/src/lib-mail/rfc2231-parser.c	Thu Nov 12 12:42:31 2009 -0500
@@ -67,11 +67,14 @@
 		}
 		p = strchr(key, '*');
 		if (p != NULL) {
-			p2 = p++;
-			rfc2231_param.idx = 0;
-			for (; *p >= '0' && *p <= '9'; p++) {
-				rfc2231_param.idx =
-					rfc2231_param.idx*10 + *p - '0';
+			p2 = p;
+			if (p[1] != '\0') {
+				p++;
+				rfc2231_param.idx = 0;
+				for (; *p >= '0' && *p <= '9'; p++) {
+					rfc2231_param.idx =
+						rfc2231_param.idx*10 + *p - '0';
+				}
 			}
 			if (*p != '*')
 				rfc2231_param.extended = FALSE;
--- a/src/lib-mail/test-rfc2231-parser.c	Wed Nov 11 15:40:18 2009 -0500
+++ b/src/lib-mail/test-rfc2231-parser.c	Thu Nov 12 12:42:31 2009 -0500
@@ -8,6 +8,7 @@
 static void test_rfc2231_parser(void)
 {
 	const char *input =
+		"; key4*=us-ascii''foo"
 		"; key*2=ba%"
 		"; key2*0=a"
 		"; key3*0*=us-ascii'en'xyz"
@@ -22,26 +23,21 @@
 		"''ab%25",
 		"key3*",
 		"us-ascii'en'xyzplop%25",
+		"key4*",
+		"us-ascii''foo",
 		NULL
 	};
 	struct rfc822_parser_context parser;
 	const char *const *result;
 	unsigned int i;
-	bool success;
 
+	test_begin("rfc2231 parser");
 	rfc822_parser_init(&parser, (const void *)input, strlen(input), NULL);
-	if (rfc2231_parse(&parser, &result) < 0)
-		success = FALSE;
-	else {
-		success = TRUE;
-		for (i = 0; output[i] != NULL && result[i] != NULL; i++) {
-			if (strcmp(output[i], result[i]) != 0)
-				break;
-		}
-		if (output[i] != NULL || result[i] != NULL)
-			success = FALSE;
-	}
-	test_out("rfc2231_parse()", success);
+	test_assert(rfc2231_parse(&parser, &result) == 0);
+	for (i = 0; output[i] != NULL && result[i] != NULL; i++)
+		test_assert(strcmp(output[i], result[i]) == 0);
+	test_assert(output[i] == NULL && result[i] == NULL);
+	test_end();
 }
 
 int main(void)