]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fts: fts-tokenizer-address didn't reset state properly when input ended.
authorTimo Sirainen <tss@iki.fi>
Sat, 9 May 2015 10:46:37 +0000 (13:46 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 9 May 2015 10:46:37 +0000 (13:46 +0300)
src/lib-fts/fts-tokenizer-address.c
src/lib-fts/test-fts-tokenizer.c

index cfada46952de7cbbcfa99708e4a946c0fcf955a2..448939301973535c2b8e9513620c344b9c023072 100644 (file)
@@ -217,12 +217,19 @@ fts_tokenizer_email_address_next(struct fts_tokenizer *_tok,
        /* 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
index 1912335836df0656bf45dc2849f1cf73ab6d0bd1..2e6ed2150dcc1ddba169f4e582adb7c111ce4304 100644 (file)
@@ -554,6 +554,19 @@ static void test_fts_tokenizer_address_search(void)
                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@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();