mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-24 15:12:47 +00:00
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>
This commit is contained in:
parent
323318fd35
commit
b1d5f20c3a
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user