aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <yuchao0@huawei.com>2019-08-05 09:44:59 +0800
committerJaegeuk Kim <jaegeuk@kernel.org>2019-08-20 11:23:58 -0700
commit8b624c337a03117596d085929eb018ec0ffeb77b (patch)
treee4eddeae210a56b1b9236c670b8316a8c8715567
parent3e9107dc0354091bd6f96ce06b5d0333fe2f5dc8 (diff)
downloadf2fs-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.c32
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