]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-lucene: Skip returned duplicate results.
authorTimo Sirainen <tss@iki.fi>
Tue, 11 Mar 2014 11:26:33 +0000 (13:26 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 11 Mar 2014 11:26:33 +0000 (13:26 +0200)
This caused assert-crash at least when searching from virtual mailbox
because the score array was larger than the actual number of results.

src/plugins/fts-lucene/lucene-wrapper.cc

index 39523597ec3bed44757d1426060c7a261b556e21..d62a0854c8a3940d8e0891b16862c8b0afd4f340 100644 (file)
@@ -1271,7 +1271,9 @@ lucene_index_search(struct lucene_index *index,
                                break;
                        }
 
-                       if (result != NULL) {
+                       if (seq_range_array_add(uids_r, uid)) {
+                               /* duplicate result */
+                       } else if (result != NULL) {
                                if (uid < last_uid)
                                        result->scores_sorted = false;
                                last_uid = uid;
@@ -1280,7 +1282,6 @@ lucene_index_search(struct lucene_index *index,
                                score->uid = uid;
                                score->score = hits->score(i);
                        }
-                       seq_range_array_add(uids_r, uid);
                }
                _CLDELETE(hits);
                return ret;
@@ -1390,10 +1391,13 @@ lucene_index_search_multi(struct lucene_index *index,
                                p_array_init(&br->definite_uids, result->pool, 32);
                                p_array_init(&br->scores, result->pool, 32);
                        }
-                       seq_range_array_add(&br->definite_uids, uid);
-                       score = array_append_space(&br->scores);
-                       score->uid = uid;
-                       score->score = hits->score(i);
+                       if (seq_range_array_add(&br->definite_uids, uid)) {
+                               /* duplicate result */
+                       } else {
+                               score = array_append_space(&br->scores);
+                               score->uid = uid;
+                               score->score = hits->score(i);
+                       }
                }
                _CLDELETE(hits);
                return ret;