From 09f2ad8e853375930c63bca847f623bc722b9cc0 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Tue, 27 Dec 2022 13:08:47 -0400 Subject: [PATCH] lib: add better diagnostics for over long filenames. Previously we just crashed with an internal error. With this change, the caller can handle it better. Update notmuch-new so that it doesn't crash with "unknown error code" because of this change. --- lib/message.cc | 16 ++++++++++++---- lib/notmuch.h | 2 ++ notmuch-new.c | 4 ++++ test/T050-new.sh | 1 - 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/message.cc b/lib/message.cc index 5ccca95a..1b1a071a 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -941,6 +941,7 @@ _notmuch_message_add_filename (notmuch_message_t *message, { const char *relative, *directory; notmuch_status_t status; + notmuch_private_status_t private_status; void *local = talloc_new (message); char *direntry; @@ -964,10 +965,17 @@ _notmuch_message_add_filename (notmuch_message_t *message, /* New file-direntry allows navigating to this message with * notmuch_directory_get_child_files() . */ - status = COERCE_STATUS (_notmuch_message_add_term (message, "file-direntry", direntry), - "adding file-direntry term"); - if (status) - return status; + private_status = _notmuch_message_add_term (message, "file-direntry", direntry); + switch (private_status) { + case NOTMUCH_PRIVATE_STATUS_SUCCESS: + break; + case NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG: + _notmuch_database_log (message->notmuch, "filename too long for file-direntry term: %s\n", + filename); + return NOTMUCH_STATUS_PATH_ERROR; + default: + return COERCE_STATUS (private_status, "adding file-direntry term"); + } status = _notmuch_message_add_folder_terms (message, directory); if (status) diff --git a/lib/notmuch.h b/lib/notmuch.h index 0b0540b1..ce375c04 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -293,6 +293,8 @@ typedef struct _notmuch_indexopts notmuch_indexopts_t; * * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory. * + * NOTMUCH_STATUS_PATH_ERROR: filename is too long + * * NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to create the * database file (such as permission denied, or file not found, * etc.), or the database already exists. diff --git a/notmuch-new.c b/notmuch-new.c index 346e6469..4a53e3eb 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -413,6 +413,10 @@ add_file (notmuch_database_t *notmuch, const char *filename, case NOTMUCH_STATUS_FILE_NOT_EMAIL: fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename); break; + case NOTMUCH_STATUS_PATH_ERROR: + fprintf (stderr, "Note: Ignoring non-indexable path: %s\n", filename); + (void) print_status_database ("add_file", notmuch, status); + break; case NOTMUCH_STATUS_FILE_ERROR: /* Someone renamed/removed the file between scandir and now. */ state->vanished_files++; diff --git a/test/T050-new.sh b/test/T050-new.sh index c4a51a05..09c2bfc6 100755 --- a/test/T050-new.sh +++ b/test/T050-new.sh @@ -384,7 +384,6 @@ EOF test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "Long file names have reasonable diagnostics" -test_subtest_known_broken printf -v name 'f%.0s' {1..234} generate_message "[filename]=$name" notmuch new 2>&1 | notmuch_dir_sanitize >OUTPUT -- 2.43.0