aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-11-22 04:03:49 +0100
committerGravatar Carl Worth <cworth@cworth.org>2009-11-22 04:03:49 +0100
commit5d56e931b99d575dbb0b936d24aae5e9903861ad (patch)
tree037cf7d61cb0a7dffef719fea88eabf44b11da98 /lib
parentf336ee034be3c9518883dfb34db27529f4a4b83b (diff)
add_message: Use sha-1 in place of overly long message ID.
Since Xapian has a limit on the maximum length of a term, we have to check for that before trying to add the message ID as a term. This fixes the bug reported by Mike Hommey here: <20091120132625.GA19246@glandium.org> I've also constructed 20 files with a range of message ID lengths centered around the Xapian term-length limit which I'll use to seed a new test suite soon.
Diffstat (limited to 'lib')
-rw-r--r--lib/database.cc13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/database.cc b/lib/database.cc
index 169dc5e2..f4a445aa 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -892,7 +892,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
const char *date, *header;
const char *from, *to, *subject;
- char *message_id;
+ char *message_id = NULL;
if (message_ret)
*message_ret = NULL;
@@ -937,11 +937,20 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
header = notmuch_message_file_get_header (message_file, "message-id");
if (header && *header != '\0') {
message_id = _parse_message_id (message_file, header, NULL);
+
/* So the header value isn't RFC-compliant, but it's
* better than no message-id at all. */
if (message_id == NULL)
message_id = talloc_strdup (message_file, header);
- } else {
+
+ /* Reject a Message ID that's too long. */
+ if (message_id && strlen (message_id) + 1 > NOTMUCH_TERM_MAX) {
+ talloc_free (message_id);
+ message_id = NULL;
+ }
+ }
+
+ if (message_id == NULL ) {
/* No message-id at all, let's generate one by taking a
* hash over the file's contents. */
char *sha1 = notmuch_sha1_of_file (filename);