Avoid access of a Xapian iterator's object when there's nothing there.
authorCarl Worth <cworth@cworth.org>
Fri, 20 Nov 2009 11:06:11 +0000 (12:06 +0100)
committerCarl Worth <cworth@cworth.org>
Fri, 20 Nov 2009 11:06:11 +0000 (12:06 +0100)
This eliminates a crash when a message (either corrupted or a non-mail
file that wasn't properly detected as not being mail) has no In-Reply-To
header, (and so few terms that trying to skip to the prefix of the
In-Reply-To terms actually brings us to the end of the termlist).

lib/message.cc

index 9488fb665ea18444bcc7670da991e0edcb91f5c1..41dddd077ea9939d703e95f0606dc1bfc023f053 100644 (file)
@@ -285,7 +285,8 @@ _notmuch_message_get_in_reply_to (notmuch_message_t *message)
     i = message->doc.termlist_begin ();
     i.skip_to (prefix);
 
-    in_reply_to = *i;
+    if (i != message->doc.termlist_end ())
+       in_reply_to = *i;
 
     /* It's perfectly valid for a message to have no In-Reply-To
      * header. For these cases, we return an empty string. */
@@ -332,10 +333,10 @@ notmuch_message_get_thread_id (notmuch_message_t *message)
        return message->thread_id;
 
     i = message->doc.termlist_begin ();
-
     i.skip_to (prefix);
 
-    id = *i;
+    if (i != message->doc.termlist_end ())
+       id = *i;
 
     if (i == message->doc.termlist_end () || id[0] != *prefix)
        INTERNAL_ERROR ("Message with document ID of %d has no thread ID.\n",
@@ -466,7 +467,7 @@ notmuch_message_get_tags (notmuch_message_t *message)
 
     i.skip_to (prefix);
 
-    while (1) {
+    while (i != end) {
        tag = *i;
 
        if (tag.empty () || tag[0] != *prefix)