lib: fix error handling
authorTomi Valkeinen <tomi.valkeinen@iki.fi>
Tue, 19 Nov 2013 05:10:31 +0000 (07:10 +0200)
committerDavid Bremner <david@tethera.net>
Sat, 18 Jan 2014 18:47:35 +0000 (14:47 -0400)
Currently if a Xapian exception happens in notmuch_message_get_header,
the exception is not caught leading to crash. In
notmuch_message_get_date the exception is caught, but an internal error
is raised, again leading to crash.

This patch fixes the error handling by making both functions catch the
Xapian exceptions, print an error and return NULL or 0.

The 'notmuch->exception_reported' is also set, as is done elsewhere,
even if I don't really get the idea of that field.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@iki.fi>
lib/message.cc

index 1b4637950f8e1a4475a4385db20fd6f4ccf7dd54..c91f3a59836f65ceb9b92a8e337603ea2d2a69ea 100644 (file)
@@ -412,19 +412,27 @@ _notmuch_message_ensure_message_file (notmuch_message_t *message)
 const char *
 notmuch_message_get_header (notmuch_message_t *message, const char *header)
 {
-    std::string value;
+    try {
+           std::string value;
 
-    /* Fetch header from the appropriate xapian value field if
-     * available */
-    if (strcasecmp (header, "from") == 0)
-       value = message->doc.get_value (NOTMUCH_VALUE_FROM);
-    else if (strcasecmp (header, "subject") == 0)
-       value = message->doc.get_value (NOTMUCH_VALUE_SUBJECT);
-    else if (strcasecmp (header, "message-id") == 0)
-       value = message->doc.get_value (NOTMUCH_VALUE_MESSAGE_ID);
+           /* Fetch header from the appropriate xapian value field if
+            * available */
+           if (strcasecmp (header, "from") == 0)
+               value = message->doc.get_value (NOTMUCH_VALUE_FROM);
+           else if (strcasecmp (header, "subject") == 0)
+               value = message->doc.get_value (NOTMUCH_VALUE_SUBJECT);
+           else if (strcasecmp (header, "message-id") == 0)
+               value = message->doc.get_value (NOTMUCH_VALUE_MESSAGE_ID);
 
-    if (!value.empty())
-       return talloc_strdup (message, value.c_str ());
+           if (!value.empty())
+               return talloc_strdup (message, value.c_str ());
+
+    } catch (Xapian::Error &error) {
+       fprintf (stderr, "A Xapian exception occurred when reading header: %s\n",
+                error.get_msg().c_str());
+       message->notmuch->exception_reported = TRUE;
+       return NULL;
+    }
 
     /* Otherwise fall back to parsing the file */
     _notmuch_message_ensure_message_file (message);
@@ -766,7 +774,9 @@ notmuch_message_get_date (notmuch_message_t *message)
     try {
        value = message->doc.get_value (NOTMUCH_VALUE_TIMESTAMP);
     } catch (Xapian::Error &error) {
-       INTERNAL_ERROR ("Failed to read timestamp value from document.");
+       fprintf (stderr, "A Xapian exception occurred when reading date: %s\n",
+                error.get_msg().c_str());
+       message->notmuch->exception_reported = TRUE;
        return 0;
     }