aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2018-04-13 22:08:05 -0300
committerDavid Bremner <david@tethera.net>2018-04-20 11:23:31 -0300
commit9293d6da27494d7b607c945c6678bc890749b94f (patch)
tree8909a7c1a43086075ce1c77b99fc13a26ce73920
parentab55ca8e0a84b8e00e42860fa0025c1ae86b4478 (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.cc8
-rwxr-xr-xtest/T050-new.sh1
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