summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2015-11-13 19:15:27 +0100
committerDavid Sterba <dsterba@suse.com>2015-11-16 14:23:46 +0100
commite7c0e3f343dd671e3cf737bac3d6dce154490b23 (patch)
treebc3231b24afdef3b27ef9848752279f6c906afaf
parenta343805d585facd2ea04a43ae070f76ef2a5cedb (diff)
btrfs-progs: fix fd leak in resolve_loop_device_with_loopdev
Resolves-coverity-id: 1339300 Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--utils.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/utils.c b/utils.c
index c9c6394f..60235d84 100644
--- a/utils.c
+++ b/utils.c
@@ -1180,20 +1180,25 @@ static int is_loop_device (const char* device) {
static int resolve_loop_device_with_loopdev(const char* loop_dev, char* loop_file)
{
int fd;
+ int ret;
struct loop_info64 lo64;
fd = open(loop_dev, O_RDONLY | O_NONBLOCK);
if (fd < 0)
return -errno;
- if (ioctl(fd, LOOP_GET_STATUS64, &lo64) < 0)
- return -errno;
+ ret = ioctl(fd, LOOP_GET_STATUS64, &lo64);
+ if (ret < 0) {
+ ret = -errno;
+ goto out;
+ }
memcpy(loop_file, lo64.lo_file_name, sizeof(lo64.lo_file_name));
loop_file[sizeof(lo64.lo_file_name)] = 0;
- if (close(fd) < 0)
- return -errno;
- return 0;
+out:
+ close(fd);
+
+ return ret;
}
/* Takes a loop device path (e.g. /dev/loop0) and returns