Skip to content

Commit

Permalink
file: remove unkown file type
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Gottox committed Jun 10, 2024
1 parent a41dec9 commit 1d33a70
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 28 deletions.
4 changes: 3 additions & 1 deletion include/sqsh_file.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
19 changes: 16 additions & 3 deletions libsqsh/src/directory/directory_iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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();

Check warning on line 413 in libsqsh/src/directory/directory_iterator.c

View check run for this annotation

Codecov / codecov/patch

libsqsh/src/directory/directory_iterator.c#L413

Added line #L413 was not covered by tests
}

struct SqshFile *
Expand Down
8 changes: 4 additions & 4 deletions test/libsqsh/file/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
18 changes: 9 additions & 9 deletions test/libsqsh/file/file_iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions test/libsqsh/file/file_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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};
Expand Down
4 changes: 2 additions & 2 deletions test/libsqsh/xattr/xattr_iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions tools/src/fs-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
3 changes: 0 additions & 3 deletions tools/src/ls.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 1d33a70

Please sign in to comment.