From 7ae167da42b6b2fb0701bcf6929b15cbceeede53 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 5 Oct 2021 09:19:26 -0700 Subject: [PATCH] dictionary: Allow dict_set_documents() argument to reference old documents. merge_dictionary() in combine-file.c includes the old documents in the new ones by just copying pointers. dict_set_documents() didn't handle this properly. This fixes the problem. Fixes bug #61258. Thanks to Irfan Ariq for reporting the problem. --- src/data/dictionary.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/data/dictionary.c b/src/data/dictionary.c index ab4642a4da..4fbcdf2a1e 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -1471,12 +1471,15 @@ dict_get_documents (const struct dictionary *d) void dict_set_documents (struct dictionary *d, const struct string_array *new_docs) { - size_t i; - - dict_clear_documents (d); + /* Swap out the old documents, instead of destroying them immediately, to + allow the new documents to include pointers into the old ones. */ + struct string_array old_docs = STRING_ARRAY_INITIALIZER; + string_array_swap (&d->documents, &old_docs); - for (i = 0; i < new_docs->n; i++) + for (size_t i = 0; i < new_docs->n; i++) dict_add_document_line (d, new_docs->strings[i], false); + + string_array_destroy (&old_docs); } /* Replaces the documents for D by UTF-8 encoded string NEW_DOCS, dividing it -- 2.30.2