From 1d33a7015706d245ec9a860e11a1e6d79ca4af86 Mon Sep 17 00:00:00 2001 From: Enno Boland Date: Mon, 10 Jun 2024 10:21:42 +0200 Subject: [PATCH] file: remove unkown file type This should never be returned. Rather than returning an unknown type, libsqsh does a consistency check and returns an error if the type is unknown. --- include/sqsh_file.h | 4 +++- libsqsh/src/directory/directory_iterator.c | 19 ++++++++++++++++--- test/libsqsh/file/file.c | 8 ++++---- test/libsqsh/file/file_iterator.c | 18 +++++++++--------- test/libsqsh/file/file_reader.c | 8 ++++---- test/libsqsh/xattr/xattr_iterator.c | 4 ++-- tools/src/fs-common.c | 2 -- tools/src/ls.c | 3 --- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/include/sqsh_file.h b/include/sqsh_file.h index 292bd6cc..cbaca5cf 100644 --- a/include/sqsh_file.h +++ b/include/sqsh_file.h @@ -237,11 +237,13 @@ int sqsh_file_iterator_free(struct SqshFileIterator *iterator); */ #define SQSH_INODE_NO_XATTR 0xFFFFFFFF +__attribute__((deprecated( + "Since 1.5.0. libsqsh should never return this."))) static const int + SQSH_FILE_TYPE_UNKNOWN = -1; /** * @brief enum that represents the file type. */ enum SqshFileType { - SQSH_FILE_TYPE_UNKNOWN = -1, /* avoid overlapping with the types in inode_data.h */ SQSH_FILE_TYPE_DIRECTORY = 1 + (1 << 8), SQSH_FILE_TYPE_FILE, diff --git a/libsqsh/src/directory/directory_iterator.c b/libsqsh/src/directory/directory_iterator.c index 55e512ba..7690b36b 100644 --- a/libsqsh/src/directory/directory_iterator.c +++ b/libsqsh/src/directory/directory_iterator.c @@ -239,10 +239,23 @@ directory_iterator_next(struct SqshDirectoryIterator *iterator, int *err) { } static int -check_entry_name_consistency(const struct SqshDirectoryIterator *iterator) { +check_entry_consistency(const struct SqshDirectoryIterator *iterator) { size_t name_len; const char *name = sqsh_directory_iterator_name2(iterator, &name_len); + switch (sqsh__data_directory_entry_type(get_entry(iterator))) { + case SQSH_INODE_TYPE_BASIC_DIRECTORY: + case SQSH_INODE_TYPE_BASIC_FILE: + case SQSH_INODE_TYPE_BASIC_SYMLINK: + case SQSH_INODE_TYPE_BASIC_BLOCK: + case SQSH_INODE_TYPE_BASIC_CHAR: + case SQSH_INODE_TYPE_BASIC_FIFO: + case SQSH_INODE_TYPE_BASIC_SOCKET: + // Valid types + break; + default: + return -SQSH_ERROR_CORRUPTED_DIRECTORY_ENTRY; + } if (memchr(name, '\0', name_len) != NULL) { return -SQSH_ERROR_CORRUPTED_DIRECTORY_ENTRY; } else if (memchr(name, '/', name_len) != NULL) { @@ -273,7 +286,7 @@ static int directory_iterator_next_finalize(struct SqshDirectoryIterator *iterator) { int rv; - rv = check_entry_name_consistency(iterator); + rv = check_entry_consistency(iterator); if (rv < 0) { goto out; } @@ -397,7 +410,7 @@ sqsh_directory_iterator_file_type( case SQSH_INODE_TYPE_BASIC_SOCKET: return SQSH_FILE_TYPE_SOCKET; } - return SQSH_FILE_TYPE_UNKNOWN; + __builtin_unreachable(); } struct SqshFile * diff --git a/test/libsqsh/file/file.c b/test/libsqsh/file/file.c index 7a5ab71b..e2d6f7b4 100644 --- a/test/libsqsh/file/file.c +++ b/test/libsqsh/file/file.c @@ -62,7 +62,7 @@ UTEST(file, load_file) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(0666, sqsh_file_permission(&file)); ASSERT_EQ((uint32_t)4242, sqsh_file_modified_time(&file)); ASSERT_EQ((uint32_t)1024, sqsh_file_blocks_start(&file)); @@ -107,11 +107,11 @@ UTEST(file, resolve_file) { struct SqshFile *symlink = sqsh_lopen(&archive, "/src", &rv); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_SYMLINK, sqsh_file_type(symlink)); + ASSERT_EQ(SQSH_FILE_TYPE_SYMLINK, (int)sqsh_file_type(symlink)); rv = sqsh_file_symlink_resolve(symlink); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(symlink)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(symlink)); ASSERT_EQ((uint32_t)3, sqsh_file_inode(symlink)); sqsh_close(symlink); @@ -151,7 +151,7 @@ UTEST(file, resolve_unkown_dir_inode) { struct SqshFile *symlink = sqsh_lopen(&archive, "/src", &rv); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_SYMLINK, sqsh_file_type(symlink)); + ASSERT_EQ(SQSH_FILE_TYPE_SYMLINK, (int)sqsh_file_type(symlink)); symlink->parent_inode_ref = UINT64_MAX; rv = sqsh_file_symlink_resolve(symlink); diff --git a/test/libsqsh/file/file_iterator.c b/test/libsqsh/file/file_iterator.c index 07e37b24..4e1cfe35 100644 --- a/test/libsqsh/file/file_iterator.c +++ b/test/libsqsh/file/file_iterator.c @@ -65,7 +65,7 @@ UTEST(file_iterator, load_segment_from_compressed_data_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -122,7 +122,7 @@ UTEST(file_iterator, load_two_segments_from_uncompressed_data_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -207,7 +207,7 @@ UTEST(file_iterator, load_segment_from_uncompressed_data_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -262,7 +262,7 @@ UTEST(file_iterator, load_zero_padding) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -329,7 +329,7 @@ UTEST(file_iterator, load_zero_big_padding) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -395,7 +395,7 @@ UTEST(file_iterator, load_zero_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -441,7 +441,7 @@ UTEST(file_iterator, load_two_zero_blocks) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -496,7 +496,7 @@ UTEST(file_iterator, load_two_sparse_blocks) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileIterator iter = {0}; @@ -568,7 +568,7 @@ UTEST(file_iterator, open_directory_with_file_iterator) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, (int)sqsh_file_type(&file)); struct SqshFileIterator iter = {0}; rv = sqsh__file_iterator_init(&iter, &file); diff --git a/test/libsqsh/file/file_reader.c b/test/libsqsh/file/file_reader.c index 27939f14..29934ec3 100644 --- a/test/libsqsh/file/file_reader.c +++ b/test/libsqsh/file/file_reader.c @@ -62,7 +62,7 @@ UTEST(file_reader, load_file_from_compressed_data_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileReader reader = {0}; @@ -107,7 +107,7 @@ UTEST(file_reader, load_file_from_compressed_data_block_with_offset) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileReader reader = {0}; @@ -149,7 +149,7 @@ UTEST(file_reader, load_file_from_uncompressed_data_block) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileReader reader = {0}; @@ -196,7 +196,7 @@ UTEST(file_reader, skip_over_zero_page) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_FILE, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_FILE, (int)sqsh_file_type(&file)); ASSERT_EQ(false, sqsh_file_has_fragment(&file)); struct SqshFileReader reader = {0}; diff --git a/test/libsqsh/xattr/xattr_iterator.c b/test/libsqsh/xattr/xattr_iterator.c index 3f4e0b2f..61825d77 100644 --- a/test/libsqsh/xattr/xattr_iterator.c +++ b/test/libsqsh/xattr/xattr_iterator.c @@ -81,7 +81,7 @@ UTEST(xattr_iterator, load_xattr) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, (int)sqsh_file_type(&file)); ASSERT_EQ(true, sqsh_file_is_extended(&file)); struct SqshXattrIterator *iterator = sqsh_xattr_iterator_new(&file, &rv); @@ -175,7 +175,7 @@ UTEST(xattr_iterator, load_xattr_indirect) { rv = sqsh__file_init(&file, &archive, inode_ref); ASSERT_EQ(0, rv); - ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, sqsh_file_type(&file)); + ASSERT_EQ(SQSH_FILE_TYPE_DIRECTORY, (int)sqsh_file_type(&file)); ASSERT_EQ(true, sqsh_file_is_extended(&file)); struct SqshXattrIterator *iterator = sqsh_xattr_iterator_new(&file, &rv); diff --git a/tools/src/fs-common.c b/tools/src/fs-common.c index f0d5f889..e4f61031 100644 --- a/tools/src/fs-common.c +++ b/tools/src/fs-common.c @@ -87,8 +87,6 @@ fs_common_mode_type(enum SqshFileType type) { return S_IFIFO; case SQSH_FILE_TYPE_SOCKET: return S_IFSOCK; - case SQSH_FILE_TYPE_UNKNOWN: - return 0; } return 0; } diff --git a/tools/src/ls.c b/tools/src/ls.c index 493d182e..57dfe5c9 100644 --- a/tools/src/ls.c +++ b/tools/src/ls.c @@ -111,9 +111,6 @@ print_detail(const char *path, const struct SqshTreeTraversal *traversal) { } switch (sqsh_file_type(file)) { - case SQSH_FILE_TYPE_UNKNOWN: - buffer[0] = '?'; - break; case SQSH_FILE_TYPE_DIRECTORY: buffer[0] = 'd'; break;