diff options
| author | David Bremner <david@tethera.net> | 2018-04-13 22:08:05 -0300 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2018-04-20 11:23:31 -0300 |
| commit | 9293d6da27494d7b607c945c6678bc890749b94f (patch) | |
| tree | 8909a7c1a43086075ce1c77b99fc13a26ce73920 | |
| parent | ab55ca8e0a84b8e00e42860fa0025c1ae86b4478 (diff) | |
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.
| -rw-r--r-- | lib/thread.cc | 8 | ||||
| -rwxr-xr-x | test/T050-new.sh | 1 |
2 files changed, 7 insertions, 2 deletions
diff --git a/lib/thread.cc b/lib/thread.cc index 3561b27f..dbac002f 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -397,7 +397,13 @@ _resolve_thread_relationships (notmuch_thread_t *thread) for (node = thread->message_list->head; node; node = node->next) { message = node->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, in_reply_to, NULL, (void **) &parent)) diff --git a/test/T050-new.sh b/test/T050-new.sh index b9854978..f3bfe7b1 100755 --- a/test/T050-new.sh +++ b/test/T050-new.sh @@ -356,7 +356,6 @@ test_expect_equal_file EXPECTED OUTPUT add_email_corpus broken 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_done |
