]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
misc/create_inode: simplify logic in scandir()
authorEric Biggers <ebiggers@google.com>
Sat, 21 Jan 2023 20:32:20 +0000 (12:32 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 27 Jan 2023 17:38:31 +0000 (12:38 -0500)
The control flow in scandir() (only used on Windows) confuses gcc into
thinking that *name_list is not always set on success, which causes a
-Wmaybe-uninitialized warning in __populate_fs().  As far as I can tell
it's a false positive; however, avoid it by cleanly separating the
success and failure cases in scandir().

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/create_inode.c

index f4a3653bf921af7c7a610452f24f6b7483ddb8cb..a3a34cd9ae8f5c99b147e4d7695b62226272ee61 100644 (file)
@@ -765,39 +765,33 @@ static int scandir(const char *dir_name, struct dirent ***name_list,
                        size_t new_list_size = temp_list_size + 32;
                        struct dirent **new_list = (struct dirent**)realloc(
                                temp_list, new_list_size * sizeof(struct dirent*));
-                       if (new_list == NULL) {
-                               goto out;
-                       }
+                       if (new_list == NULL)
+                               goto out_err;
                        temp_list_size = new_list_size;
                        temp_list = new_list;
                }
                // add the copy of dirent to the list
                temp_list[num_dent] = (struct dirent*)malloc((dent->d_reclen + 3) & ~3);
                if (!temp_list[num_dent])
-                       goto out;
+                       goto out_err;
                memcpy(temp_list[num_dent], dent, dent->d_reclen);
                num_dent++;
        }
+       closedir(dir);
 
        if (compar != NULL) {
                qsort(temp_list, num_dent, sizeof(struct dirent*),
                      (int (*)(const void*, const void*))compar);
        }
-
-        // release the temp list
        *name_list = temp_list;
-       temp_list = NULL;
+       return num_dent;
 
-out:
-       if (temp_list != NULL) {
-               while (num_dent > 0) {
-                       free(temp_list[--num_dent]);
-               }
-               free(temp_list);
-               num_dent = -1;
-       }
+out_err:
        closedir(dir);
-       return num_dent;
+       while (num_dent > 0)
+               free(temp_list[--num_dent]);
+       free(temp_list);
+       return -1;
 }
 
 static int alphasort(const struct dirent **a, const struct dirent **b) {