sload.f2fs: fix error path of build_directory
authorChao Yu <yuchao0@huawei.com>
Mon, 5 Aug 2019 01:44:59 +0000 (09:44 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 20 Aug 2019 18:23:58 +0000 (11:23 -0700)
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>
fsck/sload.c

index 940da5c..f601916 100644 (file)
@@ -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