From d6df1cd89b6007c4c507a22576895476f2540774 Mon Sep 17 00:00:00 2001 From: CismonX Date: Sat, 11 Jan 2025 18:32:50 +0800 Subject: [PATCH] fsck: add result code for "." and ".." entries BOOKMARKFS_FSCK_RESULT_NAME_INVALID should be used solely for names that are valid as filename, but not as bookmark name. --- src/backend_util.c | 4 ++-- src/fsck_handler_simple.c | 1 + src/fsck_handler_tcl.c | 1 + src/fsck_util.c | 18 ++++++++++++------ src/ioctl.h | 4 ++-- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/backend_util.c b/src/backend_util.c index 46d8bb0..f8b3712 100644 --- a/src/backend_util.c +++ b/src/backend_util.c @@ -145,8 +145,8 @@ validate_filename_fsck ( break; case FILENAME_DOTDOT: - extra = BOOKMARKFS_NAME_INVALID_REASON_DOTDOT; - result = BOOKMARKFS_FSCK_RESULT_NAME_INVALID; + extra = str[1] == '\0'; + result = BOOKMARKFS_FSCK_RESULT_NAME_DOTDOT; break; default: diff --git a/src/fsck_handler_simple.c b/src/fsck_handler_simple.c index a36a0a9..d1db4bd 100644 --- a/src/fsck_handler_simple.c +++ b/src/fsck_handler_simple.c @@ -250,6 +250,7 @@ fix_entry ( break; } // fallthrough + case BOOKMARKFS_FSCK_RESULT_NAME_DOTDOT: case BOOKMARKFS_FSCK_RESULT_NAME_INVALID: sprintf(data->name, "fsck-%" PRIu64, data->id); break; diff --git a/src/fsck_handler_tcl.c b/src/fsck_handler_tcl.c index ccc36e0..821f9cd 100644 --- a/src/fsck_handler_tcl.c +++ b/src/fsck_handler_tcl.c @@ -137,6 +137,7 @@ init_ctx ( DO_SET_RESULT_VAR(interp, "nameDuplicate", NAME_DUPLICATE); DO_SET_RESULT_VAR(interp, "nameBadChar", NAME_BADCHAR); DO_SET_RESULT_VAR(interp, "nameBadLen", NAME_BADLEN); + DO_SET_RESULT_VAR(interp, "nameDotDot", NAME_DOTDOT); DO_SET_RESULT_VAR(interp, "nameInvalid", NAME_INVALID); struct stat stat_buf; diff --git a/src/fsck_util.c b/src/fsck_util.c index b04108a..3cceee8 100644 --- a/src/fsck_util.c +++ b/src/fsck_util.c @@ -41,27 +41,33 @@ explain_fsck_result ( char name_buf[sizeof(data->name)]; escape_control_chars(name_buf, sizeof(name_buf), data->name, '?'); -#define PRINT_FSCK_RESULT(s) \ +#define PRINT_FSCK_RESULT(s, ...) \ printf("bookmark %" PRIu64 " name '%.*s' " s "\n", data->id, \ - (int)sizeof(name_buf), name_buf, data->extra); + (int)sizeof(name_buf), name_buf, __VA_ARGS__); switch (result) { case BOOKMARKFS_FSCK_RESULT_END: break; case BOOKMARKFS_FSCK_RESULT_NAME_DUPLICATE: - PRINT_FSCK_RESULT("duplicates with %" PRIu64); + PRINT_FSCK_RESULT("duplicates with %" PRIu64, data->extra); break; case BOOKMARKFS_FSCK_RESULT_NAME_BADCHAR: - PRINT_FSCK_RESULT("contains a bad character at offset %" PRIu64); + PRINT_FSCK_RESULT("contains a bad character at offset %" PRIu64, + data->extra); break; case BOOKMARKFS_FSCK_RESULT_NAME_BADLEN: - PRINT_FSCK_RESULT("has invalid length %" PRIu64); + PRINT_FSCK_RESULT("has invalid length %" PRIu64, data->extra); + break; + + case BOOKMARKFS_FSCK_RESULT_NAME_DOTDOT: + PRINT_FSCK_RESULT("%s", "is invalid (must not be '.' or '..')"); break; case BOOKMARKFS_FSCK_RESULT_NAME_INVALID: - PRINT_FSCK_RESULT("is invalid (reason number %" PRIu64 ")"); + PRINT_FSCK_RESULT("is invalid (reason number %" PRIu64 ")", + data->extra); break; default: diff --git a/src/ioctl.h b/src/ioctl.h index 2bbad01..e687ed3 100644 --- a/src/ioctl.h +++ b/src/ioctl.h @@ -43,6 +43,7 @@ enum bookmarkfs_fsck_result { BOOKMARKFS_FSCK_RESULT_NAME_DUPLICATE, BOOKMARKFS_FSCK_RESULT_NAME_BADCHAR, BOOKMARKFS_FSCK_RESULT_NAME_BADLEN, + BOOKMARKFS_FSCK_RESULT_NAME_DOTDOT, BOOKMARKFS_FSCK_RESULT_NAME_INVALID, }; @@ -50,8 +51,7 @@ enum bookmarkfs_fsck_result { * Predefined reason codes for BOOKMARKFS_FSCK_RESULT_NAME_INVALID. */ enum { - BOOKMARKFS_NAME_INVALID_REASON_DOTDOT = 256, - BOOKMARKFS_NAME_INVALID_REASON_NOTUTF8, + BOOKMARKFS_NAME_INVALID_REASON_NOTUTF8 = 256, }; enum bookmarkfs_permd_op {