aboutsummaryrefslogtreecommitdiff
path: root/bin/rdsquashfs/restore_fstree.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-05 12:16:36 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-08 19:17:35 +0200
commit75063b2e14dacc13fcbeeba24e580198a7c1c638 (patch)
treef58b8c85ed5472523a5596be3434f7488dbfe465 /bin/rdsquashfs/restore_fstree.c
parent3946cf086183f8dd4d5d115f52ba1b87560b7ce4 (diff)
Make sqfs_tree_node_get_path more robust
Test against various invariants: - Every non-root node must have a name - The root node muts not have a name - The name must not be ".." or "." - The name must not contain '/' - The loop that chases parent pointers must terminate, i.e. we must never reach the starting state again (link loop). Furthermore, make sure the sum of all path components plus separators does not overflow. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'bin/rdsquashfs/restore_fstree.c')
-rw-r--r--bin/rdsquashfs/restore_fstree.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/bin/rdsquashfs/restore_fstree.c b/bin/rdsquashfs/restore_fstree.c
index cf5bc2a..b9f92fe 100644
--- a/bin/rdsquashfs/restore_fstree.c
+++ b/bin/rdsquashfs/restore_fstree.c
@@ -127,10 +127,10 @@ static int create_node_dfs(const sqfs_tree_node_t *n, int flags)
return 0;
}
- name = sqfs_tree_node_get_path(n);
- if (name == NULL) {
- fprintf(stderr, "Constructing full path for '%s': %s\n",
- (const char *)n->name, strerror(errno));
+ ret = sqfs_tree_node_get_path(n, &name);
+ if (ret != 0) {
+ sqfs_perror((const char *)n->name,
+ "constructing full path", ret);
return -1;
}
@@ -226,10 +226,9 @@ static int set_attribs(sqfs_xattr_reader_t *xattr,
}
}
- path = sqfs_tree_node_get_path(n);
- if (path == NULL) {
- fprintf(stderr, "Reconstructing full path: %s\n",
- strerror(errno));
+ ret = sqfs_tree_node_get_path(n, &path);
+ if (ret != 0) {
+ sqfs_perror(NULL, "reconstructing full path", ret);
return -1;
}