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.
This commit is contained in:
David Bremner 2022-12-27 13:08:47 -04:00
parent 4e6c6c8aac
commit 09f2ad8e85
4 changed files with 18 additions and 5 deletions

View file

@ -941,6 +941,7 @@ _notmuch_message_add_filename (notmuch_message_t *message,
{ {
const char *relative, *directory; const char *relative, *directory;
notmuch_status_t status; notmuch_status_t status;
notmuch_private_status_t private_status;
void *local = talloc_new (message); void *local = talloc_new (message);
char *direntry; char *direntry;
@ -964,10 +965,17 @@ _notmuch_message_add_filename (notmuch_message_t *message,
/* New file-direntry allows navigating to this message with /* New file-direntry allows navigating to this message with
* notmuch_directory_get_child_files() . */ * notmuch_directory_get_child_files() . */
status = COERCE_STATUS (_notmuch_message_add_term (message, "file-direntry", direntry), private_status = _notmuch_message_add_term (message, "file-direntry", direntry);
"adding file-direntry term"); switch (private_status) {
if (status) case NOTMUCH_PRIVATE_STATUS_SUCCESS:
return status; 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); status = _notmuch_message_add_folder_terms (message, directory);
if (status) if (status)

View file

@ -293,6 +293,8 @@ typedef struct _notmuch_indexopts notmuch_indexopts_t;
* *
* NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory. * 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 * NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to create the
* database file (such as permission denied, or file not found, * database file (such as permission denied, or file not found,
* etc.), or the database already exists. * etc.), or the database already exists.

View file

@ -413,6 +413,10 @@ add_file (notmuch_database_t *notmuch, const char *filename,
case NOTMUCH_STATUS_FILE_NOT_EMAIL: case NOTMUCH_STATUS_FILE_NOT_EMAIL:
fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename); fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename);
break; 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: case NOTMUCH_STATUS_FILE_ERROR:
/* Someone renamed/removed the file between scandir and now. */ /* Someone renamed/removed the file between scandir and now. */
state->vanished_files++; state->vanished_files++;

View file

@ -384,7 +384,6 @@ EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "Long file names have reasonable diagnostics" test_begin_subtest "Long file names have reasonable diagnostics"
test_subtest_known_broken
printf -v name 'f%.0s' {1..234} printf -v name 'f%.0s' {1..234}
generate_message "[filename]=$name" generate_message "[filename]=$name"
notmuch new 2>&1 | notmuch_dir_sanitize >OUTPUT notmuch new 2>&1 | notmuch_dir_sanitize >OUTPUT