From 568f6bc3c2fd2396c05d254e2649750fb82b00b6 Mon Sep 17 00:00:00 2001 From: Kevin Boulain Date: Wed, 29 Mar 2023 18:19:58 +0200 Subject: [PATCH] lib/message-property: catch xapian exceptions Since libnotmuch exposes a C interface there's no way for clients to catch this. Inspired by what's done for tags (see notmuch_message_remove_tag). --- lib/message-property.cc | 36 +++++++++++++++++++++++++++++------ test/T610-message-property.sh | 2 -- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/message-property.cc b/lib/message-property.cc index d5afa30c..0d444bb8 100644 --- a/lib/message-property.cc +++ b/lib/message-property.cc @@ -25,6 +25,20 @@ #include "database-private.h" #include "message-private.h" +#define LOG_XAPIAN_EXCEPTION(message, error) _log_xapian_exception (__location__, message, error) + +static void +_log_xapian_exception (const char *where, notmuch_message_t *message, const Xapian::Error error) +{ + notmuch_database_t *notmuch = notmuch_message_get_database (message); + + _notmuch_database_log (notmuch, + "A Xapian exception occurred at %s: %s\n", + where, + error.get_msg ().c_str ()); + notmuch->exception_reported = true; +} + notmuch_status_t notmuch_message_get_property (notmuch_message_t *message, const char *key, const char **value) { @@ -83,10 +97,15 @@ _notmuch_message_modify_property (notmuch_message_t *message, const char *key, c term = talloc_asprintf (message, "%s=%s", key, value); - if (delete_it) - private_status = _notmuch_message_remove_term (message, "property", term); - else - private_status = _notmuch_message_add_term (message, "property", term); + try { + if (delete_it) + private_status = _notmuch_message_remove_term (message, "property", term); + else + private_status = _notmuch_message_add_term (message, "property", term); + } catch (Xapian::Error &error) { + LOG_XAPIAN_EXCEPTION (message, error); + return NOTMUCH_STATUS_XAPIAN_EXCEPTION; + } if (private_status) return COERCE_STATUS (private_status, @@ -130,8 +149,13 @@ _notmuch_message_remove_all_properties (notmuch_message_t *message, const char * else term_prefix = _find_prefix ("property"); - /* XXX better error reporting ? */ - _notmuch_message_remove_terms (message, term_prefix); + try { + /* XXX better error reporting ? */ + _notmuch_message_remove_terms (message, term_prefix); + } catch (Xapian::Error &error) { + LOG_XAPIAN_EXCEPTION (message, error); + return NOTMUCH_STATUS_XAPIAN_EXCEPTION; + } return NOTMUCH_STATUS_SUCCESS; } diff --git a/test/T610-message-property.sh b/test/T610-message-property.sh index 402b4e9a..13f8a3f9 100755 --- a/test/T610-message-property.sh +++ b/test/T610-message-property.sh @@ -363,7 +363,6 @@ EOF test_expect_equal_file /dev/null OUTPUT test_begin_subtest "edit property on removed message without uncaught exception" -test_subtest_known_broken cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} EXPECT0(notmuch_database_remove_message (db, notmuch_message_get_filename (message))); stat = notmuch_message_remove_property (message, "example", "example"); @@ -380,7 +379,6 @@ test_expect_equal_file EXPECTED OUTPUT add_email_corpus test_begin_subtest "remove all properties on removed message without uncaught exception" -test_subtest_known_broken cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} EXPECT0(notmuch_database_remove_message (db, notmuch_message_get_filename (message))); stat = notmuch_message_remove_all_properties_with_prefix (message, ""); -- 2.43.0