diff options
author | Chao Yu <yuchao0@huawei.com> | 2019-08-05 09:44:59 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2019-08-20 11:23:58 -0700 |
commit | 8b624c337a03117596d085929eb018ec0ffeb77b (patch) | |
tree | e4eddeae210a56b1b9236c670b8316a8c8715567 | |
parent | 3e9107dc0354091bd6f96ce06b5d0333fe2f5dc8 (diff) | |
download | f2fs-tools-8b624c337a03117596d085929eb018ec0ffeb77b.tar.gz |
sload.f2fs: fix error path of build_directory
The error handling of build_directory is a mess, fix it.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fsck/sload.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/fsck/sload.c b/fsck/sload.c index 940da5c..f601916 100644 --- a/fsck/sload.c +++ b/fsck/sload.c @@ -41,19 +41,25 @@ static int filter_dot(const struct dirent *d) return (strcmp(d->d_name, "..") && strcmp(d->d_name, ".")); } -static void f2fs_make_directory(struct f2fs_sb_info *sbi, +static int f2fs_make_directory(struct f2fs_sb_info *sbi, int entries, struct dentry *de) { + int ret = 0; int i = 0; for (i = 0; i < entries; i++) { if (de[i].file_type == F2FS_FT_DIR) - f2fs_mkdir(sbi, de + i); + ret = f2fs_mkdir(sbi, de + i); else if (de[i].file_type == F2FS_FT_REG_FILE) - f2fs_create(sbi, de + i); + ret = f2fs_create(sbi, de + i); else if (de[i].file_type == F2FS_FT_SYMLINK) - f2fs_symlink(sbi, de + i); + ret = f2fs_symlink(sbi, de + i); + + if (ret) + break; } + + return ret; } #ifdef HAVE_LIBSELINUX @@ -173,7 +179,7 @@ static int build_directory(struct f2fs_sb_info *sbi, const char *full_path, int entries = 0; struct dentry *dentries; struct dirent **namelist = NULL; - int i, ret = 0; + int i = 0, ret = 0; entries = scandir(full_path, &namelist, filter_dot, (void *)alphasort); if (entries < 0) { @@ -182,8 +188,7 @@ static int build_directory(struct f2fs_sb_info *sbi, const char *full_path, } dentries = calloc(entries, sizeof(struct dentry)); - if (dentries == NULL) - return -ENOMEM; + ASSERT(dentries); for (i = 0; i < entries; i++) { dentries[i].name = (unsigned char *)strdup(namelist[i]->d_name); @@ -208,7 +213,9 @@ static int build_directory(struct f2fs_sb_info *sbi, const char *full_path, free(namelist); - f2fs_make_directory(sbi, entries, dentries); + ret = f2fs_make_directory(sbi, entries, dentries); + if (ret) + goto out_free; for (i = 0; i < entries; i++) { if (dentries[i].file_type == F2FS_FT_REG_FILE) { @@ -224,10 +231,15 @@ static int build_directory(struct f2fs_sb_info *sbi, const char *full_path, dentries[i].path); ASSERT(ret > 0); - build_directory(sbi, subdir_full_path, subdir_dir_path, - target_out_dir, dentries[i].ino); + ret = build_directory(sbi, subdir_full_path, + subdir_dir_path, + target_out_dir, + dentries[i].ino); free(subdir_full_path); free(subdir_dir_path); + + if (ret) + goto out_free; } else if (dentries[i].file_type == F2FS_FT_SYMLINK) { /* * It is already done in f2fs_make_directory |