aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Austin Clements <amdragon@MIT.EDU>2013-01-06 15:22:40 -0500
committerGravatar David Bremner <bremner@debian.org>2013-01-06 22:40:01 -0400
commitd08c714b6a172cf0018bee4f60aff069d5508d4e (patch)
treed296a50e3fd67a2645d2462fdb9814fc540cafcc
parent7c3a995d6b6e066aa68b0adf0433f45cb3812c2a (diff)
dump: Disallow \n in message IDs
When we switch to using regular Xapian queries in the dump format, \n will cause problems, so we disallow it. Specially, while Xapian can quote and parse queries containing \n without difficultly, quoted queries containing \n still span multiple lines, which breaks the line-orientedness of the dump format. Strictly speaking, we could still round-trip these, but it would significantly complicate restore as well as scripts that deal with tag dumps. This complexity would come at absolutely no benefit: because of the RFC 2822 unfolding rules, no amount of standards negligence can produce a message with a message ID containing a line break (not even Outlook can do it!). Hence, we simply disallow it.
-rw-r--r--notmuch-dump.c12
-rw-r--r--test/random-corpus.c4
2 files changed, 15 insertions, 1 deletions
diff --git a/notmuch-dump.c b/notmuch-dump.c
index d2dad40d..5bbda360 100644
--- a/notmuch-dump.c
+++ b/notmuch-dump.c
@@ -102,6 +102,18 @@ notmuch_dump_command (unused (void *ctx), int argc, char *argv[])
message = notmuch_messages_get (messages);
message_id = notmuch_message_get_message_id (message);
+ if (output_format == DUMP_FORMAT_BATCH_TAG &&
+ strchr (message_id, '\n')) {
+ /* This will produce a line break in the output, which
+ * would be difficult to handle in tools. However, it's
+ * also impossible to produce an email containing a line
+ * break in a message ID because of unfolding, so we can
+ * safely disallow it. */
+ fprintf (stderr, "Warning: skipping message id containing line break: \"%s\"\n", message_id);
+ notmuch_message_destroy (message);
+ continue;
+ }
+
if (output_format == DUMP_FORMAT_SUP) {
fprintf (output, "%s (", message_id);
}
diff --git a/test/random-corpus.c b/test/random-corpus.c
index f354d4b9..8b7748ef 100644
--- a/test/random-corpus.c
+++ b/test/random-corpus.c
@@ -96,7 +96,9 @@ random_utf8_string (void *ctx, size_t char_count)
buf = talloc_realloc (ctx, buf, gchar, buf_size);
}
- randomchar = random_unichar ();
+ do {
+ randomchar = random_unichar ();
+ } while (randomchar == '\n');
written = g_unichar_to_utf8 (randomchar, buf + offset);