btrfs-progs: Free resources when returning error from cmd_subvol_create()
authorEric Sandeen <sandeen@redhat.com>
Mon, 4 Mar 2013 22:40:00 +0000 (16:40 -0600)
committerDavid Sterba <dsterba@suse.cz>
Sun, 10 Mar 2013 15:03:48 +0000 (16:03 +0100)
cmd_subvol_create() currently returns without freeing resources
in almost every error case.  Switch to a goto arrangement
so all cleanup can be done in one place.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
cmds-subvolume.c

index a9999ac..74e2130 100644 (file)
@@ -70,7 +70,8 @@ static const char * const cmd_subvol_create_usage[] = {
 
 static int cmd_subvol_create(int argc, char **argv)
 {
-       int     res, fddst, len, e;
+       int     retval, res, len;
+       int     fddst = -1;
        char    *newname;
        char    *dstdir;
        char    *dst;
@@ -103,10 +104,11 @@ static int cmd_subvol_create(int argc, char **argv)
 
        dst = argv[optind];
 
+       retval = 1;     /* failure */
        res = test_isdir(dst);
        if (res >= 0) {
                fprintf(stderr, "ERROR: '%s' exists\n", dst);
-               return 1;
+               goto out;
        }
 
        newname = strdup(dst);
@@ -118,20 +120,20 @@ static int cmd_subvol_create(int argc, char **argv)
             strchr(newname, '/') ){
                fprintf(stderr, "ERROR: uncorrect subvolume name ('%s')\n",
                        newname);
-               return 1;
+               goto out;
        }
 
        len = strlen(newname);
        if (len == 0 || len >= BTRFS_VOL_NAME_MAX) {
                fprintf(stderr, "ERROR: subvolume name too long ('%s)\n",
                        newname);
-               return 1;
+               goto out;
        }
 
        fddst = open_file_or_dir(dstdir);
        if (fddst < 0) {
                fprintf(stderr, "ERROR: can't access to '%s'\n", dstdir);
-               return 1;
+               goto out;
        }
 
        printf("Create subvolume '%s/%s'\n", dstdir, newname);
@@ -154,18 +156,19 @@ static int cmd_subvol_create(int argc, char **argv)
                res = ioctl(fddst, BTRFS_IOC_SUBVOL_CREATE, &args);
        }
 
-       e = errno;
-
-       close(fddst);
-       free(inherit);
-
        if (res < 0) {
                fprintf(stderr, "ERROR: cannot create subvolume - %s\n",
-                       strerror(e));
-               return 1;
+                       strerror(errno));
+               goto out;
        }
 
-       return 0;
+       retval = 0;     /* success */
+out:
+       if (fddst != -1)
+               close(fddst);
+       free(inherit);
+
+       return retval;
 }
 
 /*