diff options
-rw-r--r-- | bin/sqfs2tar/write_tree.c | 6 | ||||
-rw-r--r-- | lib/common/hardlink.c | 43 |
2 files changed, 18 insertions, 31 deletions
diff --git a/bin/sqfs2tar/write_tree.c b/bin/sqfs2tar/write_tree.c index 1c19a5a..354ec21 100644 --- a/bin/sqfs2tar/write_tree.c +++ b/bin/sqfs2tar/write_tree.c @@ -182,8 +182,12 @@ int write_tree(const sqfs_tree_node_t *n) int status = -1; if (!no_links) { - if (sqfs_tree_find_hard_links(n, &links)) + int ret = sqfs_tree_find_hard_links(n, &links); + if (ret) { + sqfs_perror(NULL, "detecting hard links in " + "file system tree", ret); return -1; + } for (lnk = links; lnk != NULL; lnk = lnk->next) { lnk->target = assemble_tar_path(lnk->target, false); diff --git a/lib/common/hardlink.c b/lib/common/hardlink.c index f28620f..4657bc3 100644 --- a/lib/common/hardlink.c +++ b/lib/common/hardlink.c @@ -24,8 +24,9 @@ static int map_nodes(rbtree_t *inumtree, sqfs_hard_link_t **out, /* XXX: refuse to generate hard links to directories */ if (n->children != NULL) { for (n = n->children; n != NULL; n = n->next) { - if (map_nodes(inumtree, out, n)) - return -1; + ret = map_nodes(inumtree, out, n); + if (ret != 0) + return ret; } return 0; } @@ -36,23 +37,21 @@ static int map_nodes(rbtree_t *inumtree, sqfs_hard_link_t **out, idx = n->inode->base.inode_number; tn = rbtree_lookup(inumtree, &idx); - if (tn == NULL) { - ret = rbtree_insert(inumtree, &idx, &n); - if (ret != 0) - goto fail_insert; - return 0; - } + if (tn == NULL) + return rbtree_insert(inumtree, &idx, &n); target = *((const sqfs_tree_node_t **)rbtree_node_value(tn)); lnk = calloc(1, sizeof(*lnk)); if (lnk == NULL) - goto fail_oom; + return SQFS_ERROR_ALLOC; lnk->inode_number = idx; ret = sqfs_tree_node_get_path(target, &lnk->target); - if (ret != 0) - goto fail_path; + if (ret != 0) { + free(lnk); + return ret; + } if (canonicalize_name(lnk->target) == 0) { lnk->next = (*out); @@ -62,18 +61,6 @@ static int map_nodes(rbtree_t *inumtree, sqfs_hard_link_t **out, free(lnk); } return 0; -fail_path: - sqfs_perror(NULL, "re-constructing hard link path", ret); - free(lnk); - return -1; -fail_oom: - fputs("detecting hard links in file system tree: out of memory\n", - stderr); - free(lnk); - return -1; -fail_insert: - sqfs_perror(NULL, "detecting hard links in file system tree", ret); - return -1; } static int compare_inum(const void *ctx, const void *lhs, const void *rhs) @@ -94,11 +81,8 @@ int sqfs_tree_find_hard_links(const sqfs_tree_node_t *root, ret = rbtree_init(&inumtree, sizeof(sqfs_u32), sizeof(sqfs_tree_node_t *), compare_inum); - if (ret != 0) { - sqfs_perror(NULL, - "detecting hard links in file system tree", ret); - return -1; - } + if (ret != 0) + return ret; ret = map_nodes(&inumtree, out, root); rbtree_cleanup(&inumtree); @@ -110,8 +94,7 @@ int sqfs_tree_find_hard_links(const sqfs_tree_node_t *root, free(lnk->target); free(lnk); } - return -1; } - return 0; + return ret; } |