diff options
author | Eric Sandeen <sandeen@redhat.com> | 2013-03-04 16:40:00 -0600 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2013-03-10 16:03:48 +0100 |
commit | b1d5f20c3a744c2994c32dd616ba2605c4e4f395 (patch) | |
tree | 5068a6f12f28e3da36ccf2c737af7fae6e07ca5e /cmds-subvolume.c | |
parent | 323318fd3500a447987d355f6189230ecc0d4256 (diff) |
btrfs-progs: Free resources when returning error from cmd_subvol_create()
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>
Diffstat (limited to 'cmds-subvolume.c')
-rw-r--r-- | cmds-subvolume.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/cmds-subvolume.c b/cmds-subvolume.c index a9999ac9..74e21307 100644 --- a/cmds-subvolume.c +++ b/cmds-subvolume.c @@ -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; } /* |