diff options
Diffstat (limited to 'unpack/restore_fstree.c')
-rw-r--r-- | unpack/restore_fstree.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/unpack/restore_fstree.c b/unpack/restore_fstree.c index c1320ea..3e7f500 100644 --- a/unpack/restore_fstree.c +++ b/unpack/restore_fstree.c @@ -117,27 +117,32 @@ int restore_fstree(const char *rootdir, tree_node_t *root, unsqfs_info_t *info) if (mkdir_p(rootdir)) return -1; - dirfd = open(rootdir, O_RDONLY | O_DIRECTORY); - if (dirfd < 0) { - perror(rootdir); - return -1; + if (rootdir == NULL) { + dirfd = AT_FDCWD; + } else { + dirfd = open(rootdir, O_RDONLY | O_DIRECTORY); + if (dirfd < 0) { + perror(rootdir); + return -1; + } } if (S_ISDIR(root->mode)) { for (n = root->data.dir->children; n != NULL; n = n->next) { - if (create_node(dirfd, n, info)) { - close(dirfd); - return -1; - } + if (create_node(dirfd, n, info)) + goto fail; } return 0; } - if (create_node(dirfd, root, info)) { - close(dirfd); - return -1; - } + if (create_node(dirfd, root, info)) + goto fail; - close(dirfd); + if (dirfd != AT_FDCWD) + close(dirfd); return 0; +fail: + if (dirfd != AT_FDCWD) + close(dirfd); + return -1; } |