From b1d5f20c3a744c2994c32dd616ba2605c4e4f395 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Mon, 4 Mar 2013 16:40:00 -0600 Subject: 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 --- cmds-subvolume.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'cmds-subvolume.c') 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; } /* -- cgit v1.2.3