From: Carl Worth Date: Tue, 17 Nov 2009 19:07:38 +0000 (-0800) Subject: message_get_thread_id: Generate internal error if message has no thread ID. X-Git-Tag: 0.1~468 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=f7eaeff242dd08c4020401c3b2e2e1ad2f769fe0 message_get_thread_id: Generate internal error if message has no thread ID. This case was happening when a message had its own message ID in its In-Reply-To header. The thread-resolution code would find the partially constructed message, (with no thread ID yet), get garbage from this function, and then march right along with that garbage. With this commit, a self-cyclic message like this will now trigger an internal error rather than marching along silienty. (And a subsequent commit will remove the call to this function in this case.) --- diff --git a/lib/message.cc b/lib/message.cc index c3eb2e6e..cb902643 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -320,31 +320,39 @@ _notmuch_message_get_in_reply_to (notmuch_message_t *message) const char * notmuch_message_get_thread_id (notmuch_message_t *message) { + const char *prefix = _find_prefix ("thread"); Xapian::TermIterator i; + std::string id; + + /* This code is written with the assumption that "thread" has a + * single-character prefix. */ + assert (strlen (prefix) == 1); if (message->thread_id) return message->thread_id; i = message->doc.termlist_begin (); - i.skip_to (_find_prefix ("thread")); - if (i == message->doc.termlist_end ()) + i.skip_to (prefix); + + id = *i; + + if (i == message->doc.termlist_end () || id[0] != *prefix) INTERNAL_ERROR ("Message with document ID of %d has no thread ID.\n", message->doc_id); - message->thread_id = talloc_strdup (message, (*i).c_str () + 1); + message->thread_id = talloc_strdup (message, id.c_str () + 1); #if DEBUG_DATABASE_SANITY i++; + id = *i; - if (i != message->doc.termlist_end () && - strncmp ((*i).c_str (), _find_prefix ("thread"), - strlen (_find_prefix ("thread"))) == 0) + if (i != message->doc.termlist_end () && id[0] == *prefix) { INTERNAL_ERROR ("Message %s has duplicate thread IDs: %s and %s\n", notmuch_message_get_message_id (message), message->thread_id, - (*i).c_str () + 1); + id.c_str () + 1); } #endif