dovecot-2.2: lib-fts: fts-tokenizer-address didn't reset state p...

dovecot at dovecot.org dovecot at dovecot.org
Sat May 9 10:54:31 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/363397c3701e
changeset: 18579:363397c3701e
user:      Timo Sirainen <tss at iki.fi>
date:      Sat May 09 13:46:37 2015 +0300
description:
lib-fts: fts-tokenizer-address didn't reset state properly when input ended.

diffstat:

 src/lib-fts/fts-tokenizer-address.c |  11 +++++++++--
 src/lib-fts/test-fts-tokenizer.c    |  13 +++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diffs (48 lines):

diff -r eff53aa9cb58 -r 363397c3701e src/lib-fts/fts-tokenizer-address.c
--- a/src/lib-fts/fts-tokenizer-address.c	Sat May 09 13:31:14 2015 +0300
+++ b/src/lib-fts/fts-tokenizer-address.c	Sat May 09 13:46:37 2015 +0300
@@ -217,12 +217,19 @@
 	/* end of data, output lingering tokens. first the parents data, then
 	   possibly our token, if complete enough */
 	if (size == 0) {
+		if (tok->state == EMAIL_ADDRESS_PARSER_STATE_DOMAIN &&
+		    domain_is_empty(tok)) {
+			/* user@ without domain - reset state */
+			str_truncate(tok->last_word, 0);
+			tok->state = EMAIL_ADDRESS_PARSER_STATE_NONE;
+		}
+
 		if (fts_tokenizer_address_parent_data(tok, token_r))
 			return 1;
 
-		if (tok->state == EMAIL_ADDRESS_PARSER_STATE_DOMAIN &&
-		    !domain_is_empty(tok))
+		if (tok->state == EMAIL_ADDRESS_PARSER_STATE_DOMAIN)
 			return fts_tokenizer_address_current_token(tok, token_r);
+		tok->state = EMAIL_ADDRESS_PARSER_STATE_NONE;
 	}
 
 	/* 1) regular input data OR
diff -r eff53aa9cb58 -r 363397c3701e src/lib-fts/test-fts-tokenizer.c
--- a/src/lib-fts/test-fts-tokenizer.c	Sat May 09 13:31:14 2015 +0300
+++ b/src/lib-fts/test-fts-tokenizer.c	Sat May 09 13:46:37 2015 +0300
@@ -554,6 +554,19 @@
 		eopp++;
 	}
 	test_assert(*eopp == NULL);
+
+	test_assert(fts_tokenizer_next(tok, (const void *)"foo", 3, &token) == 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) > 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) == 0);
+
+	test_assert(fts_tokenizer_next(tok, (const void *)"bar at baz", 7, &token) == 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) > 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) == 0);
+
+	test_assert(fts_tokenizer_next(tok, (const void *)"foo@", 4, &token) == 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) > 0);
+	test_assert(fts_tokenizer_next(tok, NULL, 0, &token) == 0);
+
 	fts_tokenizer_unref(&tok);
 	fts_tokenizer_unref(&gen_tok);
 	fts_tokenizers_deinit();


More information about the dovecot-cvs mailing list