Skip to content

Commit

Permalink
xattr_iterator: return bool instead of int for _next()
Browse files Browse the repository at this point in the history
This commit changes the return type of sqsh_xattr_iterator_next() from
int to bool. The return value is now used to indicate whether there is
more data to read from the xattr iterator. The error code is now stored
in a pointer to an int instead of being returned directly.
  • Loading branch information
Gottox committed Aug 21, 2023
1 parent 601643e commit 1cdf8a0
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 24 deletions.
2 changes: 1 addition & 1 deletion fuzzer/simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ read_file(struct SqshDirectoryIterator *iter) {
if (rv < 0) {
goto out;
}
while ((rv = sqsh_xattr_iterator_next(&xattr_iter)) > 0) {
while (sqsh_xattr_iterator_next(&xattr_iter, &rv)) {
char *fullname = sqsh_xattr_iterator_fullname_dup(&xattr_iter);
free(fullname);
sqsh_xattr_iterator_value(&xattr_iter);
Expand Down
8 changes: 6 additions & 2 deletions include/sqsh_xattr.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,14 @@ sqsh_xattr_iterator_new(const struct SqshFile *file, int *err);
* @brief Advances the iterator to the next xattr.
*
* @param[in,out] iterator The iterator to advance.
* @param[out] err Pointer to an int where the error code will be
* stored.
*
* @return 0 on success, a negative value on error.
* @retval true When the iterator was advanced.
* @retval false When the end of the xattrs list was reached or an error occured.
*/
SQSH_NO_UNUSED int sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator);
SQSH_NO_UNUSED bool
sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator, int *err);

/**
* @memberof SqshXattrIterator
Expand Down
18 changes: 10 additions & 8 deletions lib/xattr/xattr_iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,19 +191,19 @@ xattr_value_indirect_load(struct SqshXattrIterator *iterator) {
return rv;
}

int
sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator) {
bool
sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator, int *err) {
int rv = 0;
size_t size = SQSH_SIZEOF_XATTR_KEY + SQSH_SIZEOF_XATTR_VALUE;
bool has_next = false;

sqsh__metablock_reader_cleanup(&iterator->out_of_line_value);

if (iterator->remaining_entries == 0) {
if (iterator->remaining_size != 0) {
rv = -SQSH_ERROR_XATTR_SIZE_MISMATCH;
goto out;
}
return 0;
goto out;
}

/* Load Key Header */
Expand Down Expand Up @@ -250,11 +250,13 @@ sqsh_xattr_iterator_next(struct SqshXattrIterator *iterator) {
goto out;
}

rv = iterator->remaining_entries;

iterator->remaining_entries--;
has_next = true;
out:
return rv;
if (err != NULL) {
*err = rv;
}
return has_next;
}

uint16_t
Expand Down Expand Up @@ -303,7 +305,7 @@ sqsh_xattr_iterator_lookup(
struct SqshXattrIterator *iterator, const char *name) {
int rv = 0, rv_cmp = 0;

while ((rv = sqsh_xattr_iterator_next(iterator)) > 0) {
while (sqsh_xattr_iterator_next(iterator, &rv)) {
rv_cmp = sqsh_xattr_iterator_fullname_cmp(iterator, name);
if (rv_cmp == 0) {
return 0;
Expand Down
26 changes: 16 additions & 10 deletions test/xattr/xattr_iterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ load_xattr(void) {
assert(rv == 0);
assert(iterator != NULL);

rv = sqsh_xattr_iterator_next(iterator);
assert(rv > 0);
bool has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == true);
size_t size = sqsh_xattr_iterator_name_size(iterator);
assert(size == 3);
const char *name = sqsh_xattr_iterator_name(iterator);
Expand All @@ -102,8 +103,9 @@ load_xattr(void) {
const char *prefix = sqsh_xattr_iterator_prefix(iterator);
assert(strcmp(prefix, "user.") == 0);

rv = sqsh_xattr_iterator_next(iterator);
assert(rv > 0);
has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == true);
size = sqsh_xattr_iterator_name_size(iterator);
assert(size == 3);
name = sqsh_xattr_iterator_name(iterator);
Expand All @@ -115,8 +117,9 @@ load_xattr(void) {
prefix = sqsh_xattr_iterator_prefix(iterator);
assert(strcmp(prefix, "trusted.") == 0);

rv = sqsh_xattr_iterator_next(iterator);
assert(rv > 0);
has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == true);
size = sqsh_xattr_iterator_name_size(iterator);
assert(size == 3);
name = sqsh_xattr_iterator_name(iterator);
Expand All @@ -128,8 +131,9 @@ load_xattr(void) {
prefix = sqsh_xattr_iterator_prefix(iterator);
assert(strcmp(prefix, "security.") == 0);

rv = sqsh_xattr_iterator_next(iterator);
has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == false);

sqsh_xattr_iterator_free(iterator);
sqsh__file_cleanup(&file);
Expand Down Expand Up @@ -180,8 +184,9 @@ load_xattr_indirect(void) {
assert(rv == 0);
assert(iterator != NULL);

rv = sqsh_xattr_iterator_next(iterator);
assert(rv > 0);
bool has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == true);
size_t size = sqsh_xattr_iterator_name_size(iterator);
assert(size == 3);
const char *name = sqsh_xattr_iterator_name(iterator);
Expand All @@ -191,8 +196,9 @@ load_xattr_indirect(void) {
const char *value = sqsh_xattr_iterator_value(iterator);
assert(memcmp(value, "123", size) == 0);

rv = sqsh_xattr_iterator_next(iterator);
has_next = sqsh_xattr_iterator_next(iterator, &rv);
assert(rv == 0);
assert(has_next == false);

sqsh_xattr_iterator_free(iterator);
sqsh__file_cleanup(&file);
Expand Down
5 changes: 4 additions & 1 deletion tools/fs2.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ fs_listxattr(const char *path, char *buf, size_t size) {
}

iterator = sqsh_xattr_iterator_new(file, &rv);
while ((rv = sqsh_xattr_iterator_next(iterator)) > 0) {
while (sqsh_xattr_iterator_next(iterator, &rv) > 0) {
const char *prefix = sqsh_xattr_iterator_prefix(iterator);
size_t prefix_len = sqsh_xattr_iterator_prefix_size(iterator);
const char *name = sqsh_xattr_iterator_name(iterator);
Expand All @@ -264,6 +264,9 @@ fs_listxattr(const char *path, char *buf, size_t size) {
buf[pos] = '\0';
pos++;
}
if (rv < 0) {
goto out;
}

rv = pos;
out:
Expand Down
2 changes: 1 addition & 1 deletion tools/fs3.c
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ fs_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size) {
}

p = buf;
while ((rv = sqsh_xattr_iterator_next(iterator)) > 0) {
while (sqsh_xattr_iterator_next(iterator, &rv)) {
prefix = sqsh_xattr_iterator_prefix(iterator);
if (prefix == NULL) {
fuse_reply_err(req, EIO);
Expand Down
2 changes: 1 addition & 1 deletion tools/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ fattr_path(struct SqshArchive *archive, char *path) {
goto out;
}

while ((rv = sqsh_xattr_iterator_next(iter)) > 0) {
while (sqsh_xattr_iterator_next(iter, &rv)) {
const char *prefix = sqsh_xattr_iterator_prefix(iter);
uint16_t prefix_len = sqsh_xattr_iterator_prefix_size(iter);
const char *name = sqsh_xattr_iterator_name(iter);
Expand Down

0 comments on commit 1cdf8a0

Please sign in to comment.