summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@redhat.com>2013-03-04 16:40:00 -0600
committerDavid Sterba <dsterba@suse.cz>2013-03-10 16:03:48 +0100
commitb1d5f20c3a744c2994c32dd616ba2605c4e4f395 (patch)
tree5068a6f12f28e3da36ccf2c737af7fae6e07ca5e
parent323318fd3500a447987d355f6189230ecc0d4256 (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>
-rw-r--r--cmds-subvolume.c29
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;
}
/*