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.
This commit is contained in:
CismonX 2025-01-11 18:32:50 +08:00
parent 68281c2ecb
commit d6df1cd89b
No known key found for this signature in database
GPG key ID: 3094873E29A482FB
5 changed files with 18 additions and 10 deletions

View file

@ -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:

View file

@ -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;

View file

@ -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;

View file

@ -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:

View file

@ -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 {