Make parsing of References and In-Reply-To header less error prone
authorMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 26 May 2014 14:05:57 +0000 (16:05 +0200)
committerDavid Bremner <david@tethera.net>
Sun, 17 Aug 2014 00:45:16 +0000 (17:45 -0700)
According to RFC2822 References and In-Reply-To headers are supposed
to contain one or more Message-IDs, however older RFC822 allowed
almost any content. When both References and In-Reply-To headers ends
with something else that a Message-ID (see e.g. [1]), the thread
structure presented by notmuch is incorrect. The reason is that
notmuch treats this case as if the email contained no "replyto"
information (see _notmuch_database_link_message_to_parents).

This patch changes the parse_references() function to return the last
valid Message-ID encountered rather than NULL resulting from the last
hunk of text not being the Message-ID.

[1] https://lkml.org/lkml/headers/2014/5/19/864

lib/database.cc
test/T510-thread-replies.sh

index c76029067f4c28b32933e26e432713f39becd4b0..9c0952a495cf800bbb176e05013d098e1d72387a 100644 (file)
@@ -524,7 +524,7 @@ parse_references (void *ctx,
                  GHashTable *hash,
                  const char *refs)
 {
-    char *ref;
+    char *ref, *last_ref = NULL;
 
     if (refs == NULL || *refs == '\0')
        return NULL;
@@ -532,20 +532,17 @@ parse_references (void *ctx,
     while (*refs) {
        ref = _parse_message_id (ctx, refs, &refs);
 
-       if (ref && strcmp (ref, message_id))
+       if (ref && strcmp (ref, message_id)) {
            g_hash_table_insert (hash, ref, NULL);
+           last_ref = ref;
+       }
     }
 
     /* The return value of this function is used to add a parent
      * reference to the database.  We should avoid making a message
-     * its own parent, thus the following check.
+     * its own parent, thus the above check.
      */
-
-    if (ref && strcmp(ref, message_id)) {
-       return ref;
-    } else {
-       return NULL;
-    }
+    return last_ref;
 }
 
 notmuch_status_t
index d818b89feb91c3ffc6ff85a4c531f37295aab991..1392fbedd0527b58b861602314b0073515108732 100755 (executable)
@@ -138,7 +138,6 @@ expected=`echo "$expected" | notmuch_json_show_sanitize`
 test_expect_equal_json "$output" "$expected"
 
 test_begin_subtest "Ignore garbage at the end of References"
-test_subtest_known_broken
 add_message '[id]="foo@five.com"' \
     '[subject]="five"'
 add_message '[id]="bar@five.com"' \