btrfs-progs: add memory allocation fail check in btrfs_add_to_fsid()

In btrfs_add_to_fsid(), strdup() allocates memory to device->name, but
the return value is not checked.
So add the return value check and error handling code.
And clean-up error handling code for ENOMEM case.

Signed-off-by: Byongho Lee <bhlee.kernel@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Byongho Lee 2015-08-28 00:38:18 +09:00 committed by David Sterba
parent 6e38141890
commit 657e520a11
1 changed files with 12 additions and 8 deletions

20
utils.c
View File

@ -731,21 +731,18 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
struct btrfs_super_block *super = root->fs_info->super_copy;
struct btrfs_device *device;
struct btrfs_dev_item *dev_item;
char *buf;
char *buf = NULL;
u64 total_bytes;
u64 num_devs;
int ret;
device = kzalloc(sizeof(*device), GFP_NOFS);
if (!device)
return -ENOMEM;
buf = kmalloc(sectorsize, GFP_NOFS);
if (!buf) {
kfree(device);
return -ENOMEM;
}
goto err_nomem;
buf = kzalloc(sectorsize, GFP_NOFS);
if (!buf)
goto err_nomem;
BUG_ON(sizeof(*disk_super) > sectorsize);
memset(buf, 0, sectorsize);
disk_super = (struct btrfs_super_block *)buf;
dev_item = &disk_super->dev_item;
@ -763,6 +760,8 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
device->total_ios = 0;
device->dev_root = root->fs_info->dev_root;
device->name = strdup(path);
if (!device->name)
goto err_nomem;
ret = btrfs_add_device(trans, root, device);
BUG_ON(ret);
@ -792,6 +791,11 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
list_add(&device->dev_list, &root->fs_info->fs_devices->devices);
device->fs_devices = root->fs_info->fs_devices;
return 0;
err_nomem:
kfree(device);
kfree(buf);
return -ENOMEM;
}
static void btrfs_wipe_existing_sb(int fd)