From 630d8e4b9b45a49771dec8321dcaf37513a8a6c1 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Tue, 22 Jul 2008 09:43:15 +0200
Subject: [PATCH] Testsuite: added lexer string scan comparison test and fixed
 lexer bug in the process.

---
 src/lib-sieve/sieve-lexer.c      | 20 ++++++++++++++++----
 src/testsuite/Makefile.am        |  1 +
 src/testsuite/tests/lexer.svtest | 29 +++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 4 deletions(-)
 create mode 100644 src/testsuite/tests/lexer.svtest

diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index 7fd4f6105..6116e4ccc 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -565,21 +565,33 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer)
   			
  				/* Parse literal lines */
 				while ( TRUE ) {
+					bool cr_shifted = FALSE;
+
 					/* Remove dot-stuffing or detect end of text */
 					if ( sieve_lexer_curchar(lexer) == '.' ) {
-						bool cr_shifted = FALSE;
 						sieve_lexer_shift(lexer);
   					
 						/* Check for CRLF */
-						if ( sieve_lexer_curchar(lexer) == '\r' ) 
+						if ( sieve_lexer_curchar(lexer) == '\r' ) {
 							sieve_lexer_shift(lexer);
+							cr_shifted = TRUE;
+						}
   				
 						if ( sieve_lexer_curchar(lexer) == '\n' ) {
 							sieve_lexer_shift(lexer);
 							lexer->token_type = STT_STRING;
 							return TRUE;
-						} else if ( cr_shifted ) 
-							str_append_c(str, '\r');  	
+						} else if ( cr_shifted ) {
+							sieve_lexer_error(lexer,
+                                "found CR without subsequent LF in multi-line string literal");
+                            lexer->token_type = STT_ERROR;
+                            return FALSE;
+						}
+
+						/* Handle dot-stuffing */
+						str_append_c(str, '.');
+						if ( sieve_lexer_curchar(lexer) == '.' ) 
+	                        sieve_lexer_shift(lexer);
 					}
   				
 					/* Scan the rest of the line */
diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am
index a92be128e..945b9b7b5 100644
--- a/src/testsuite/Makefile.am
+++ b/src/testsuite/Makefile.am
@@ -65,6 +65,7 @@ test_cases = \
     tests/testsuite.svtest\
     tests/control-structures.svtest \
 	tests/exists.svtest \
+	tests/lexer.svtest \
 	tests/comparators/core.svtest \
 	tests/match-types/contains.svtest \
 	tests/match-types/matches.svtest \
diff --git a/src/testsuite/tests/lexer.svtest b/src/testsuite/tests/lexer.svtest
new file mode 100644
index 000000000..95e668b6d
--- /dev/null
+++ b/src/testsuite/tests/lexer.svtest
@@ -0,0 +1,29 @@
+require "vnd.dovecot.testsuite";
+require "variables";
+
+/* Test conformance to RFC 5228 - 2.4.2. Strings */
+
+set "text" text:
+Line 1
+.Line 2
+..Line 3
+.Line 4
+Line 5
+.
+;
+
+set "quoted"
+"Line 1
+.Line 2
+.Line 3
+.Line 4
+Line 5
+";
+
+test "LEXER-string-literal" {
+	if not string :is "${text}" "${quoted}" {
+		test_fail "lexer messed-up dot stuffing";
+	}
+}
+
+
-- 
GitLab