lib: break reference loop by choosing arbitrary top level msg

Other parts of notmuch (e.g. notmuch show) expect each thread to
contain at least one top level message, and crash if this expectation
is not met.
This commit is contained in:
David Bremner 2018-04-13 22:08:05 -03:00
parent ab55ca8e0a
commit 9293d6da27
2 changed files with 7 additions and 2 deletions

View file

@ -397,7 +397,13 @@ _resolve_thread_relationships (notmuch_thread_t *thread)
for (node = thread->message_list->head; node; node = node->next) { for (node = thread->message_list->head; node; node = node->next) {
message = node->message; message = node->message;
in_reply_to = _notmuch_message_get_in_reply_to (message); in_reply_to = _notmuch_message_get_in_reply_to (message);
if (in_reply_to && strlen (in_reply_to) && /*
* if we reach the end of the list without finding a top-level
* message, that means the thread is a cycle (or set of
* cycles) and any message can be considered top-level
*/
if ((thread->toplevel_list->head || node->next) &&
in_reply_to && strlen (in_reply_to) &&
g_hash_table_lookup_extended (thread->message_hash, g_hash_table_lookup_extended (thread->message_hash,
in_reply_to, NULL, in_reply_to, NULL,
(void **) &parent)) (void **) &parent))

View file

@ -356,7 +356,6 @@ test_expect_equal_file EXPECTED OUTPUT
add_email_corpus broken add_email_corpus broken
test_begin_subtest "reference loop does not crash" test_begin_subtest "reference loop does not crash"
test_subtest_known_broken
test_expect_code 0 "notmuch show --format=json id:mid-loop-12@example.org id:mid-loop-21@example.org > OUTPUT" test_expect_code 0 "notmuch show --format=json id:mid-loop-12@example.org id:mid-loop-21@example.org > OUTPUT"
test_done test_done