diff options
author | Eric Sandeen <sandeen@redhat.com> | 2013-11-06 17:15:45 -0600 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-11-07 16:10:41 -0500 |
commit | 0650c12576d3e3f046d70b3568025afda7700804 (patch) | |
tree | 587f76f95ec44decc709feb239d3909cf1f14080 | |
parent | 9dc137918f3a3346bb2c6ef3de6033d5688c037b (diff) |
btrfs-progs: fix leak of "buf" in make_btrfs() error paths
If any pwrite failed we leaked the allocated "buf" on
return from the function. "goto out" takes care of
those paths.
Resolves-Coverity-CID: 1125938
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r-- | utils.c | 62 |
1 files changed, 32 insertions, 30 deletions
@@ -210,10 +210,10 @@ int make_btrfs(int fd, const char *device, const char *label, csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[1]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* create the items for the extent tree */ memset(buf->data+sizeof(struct btrfs_header), 0, @@ -269,10 +269,10 @@ int make_btrfs(int fd, const char *device, const char *label, btrfs_set_header_nritems(buf, nritems); csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[2]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* create the chunk tree */ memset(buf->data+sizeof(struct btrfs_header), 0, @@ -356,10 +356,10 @@ int make_btrfs(int fd, const char *device, const char *label, btrfs_set_header_nritems(buf, nritems); csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[3]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* create the device tree */ memset(buf->data+sizeof(struct btrfs_header), 0, @@ -395,10 +395,10 @@ int make_btrfs(int fd, const char *device, const char *label, btrfs_set_header_nritems(buf, nritems); csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[4]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* create the FS root */ memset(buf->data+sizeof(struct btrfs_header), 0, @@ -408,11 +408,10 @@ int make_btrfs(int fd, const char *device, const char *label, btrfs_set_header_nritems(buf, 0); csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[5]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; - + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* finally create the csum root */ memset(buf->data+sizeof(struct btrfs_header), 0, leafsize-sizeof(struct btrfs_header)); @@ -421,10 +420,10 @@ int make_btrfs(int fd, const char *device, const char *label, btrfs_set_header_nritems(buf, 0); csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, leafsize, blocks[6]); - if (ret < 0) - return -errno; - else if (ret != leafsize) - return -EIO; + if (ret != leafsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } /* and write out the super block */ BUG_ON(sizeof(super) > sectorsize); @@ -433,13 +432,16 @@ int make_btrfs(int fd, const char *device, const char *label, buf->len = sectorsize; csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); ret = pwrite(fd, buf->data, sectorsize, blocks[0]); - if (ret < 0) - return -errno; - else if (ret != sectorsize) - return -EIO; + if (ret != sectorsize) { + ret = (ret < 0 ? -errno : -EIO); + goto out; + } + + ret = 0; +out: free(buf); - return 0; + return ret; } u64 btrfs_device_size(int fd, struct stat *st) |