btrfs-progs: fix resource leak during device scanning

The dev info is leaked each time we find a known filesystem.

Resolves-coverity-id: 1127098
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2016-03-15 10:25:00 +01:00
parent 3bb71d27ac
commit 3299da86fe

View File

@ -457,14 +457,14 @@ static int btrfs_scan_kernel(void *search, unsigned unit_mode)
memset(label, 0, sizeof(label)); memset(label, 0, sizeof(label));
while ((mnt = getmntent(f)) != NULL) { while ((mnt = getmntent(f)) != NULL) {
free(dev_info_arg);
dev_info_arg = NULL;
if (strcmp(mnt->mnt_type, "btrfs")) if (strcmp(mnt->mnt_type, "btrfs"))
continue; continue;
ret = get_fs_info(mnt->mnt_dir, &fs_info_arg, ret = get_fs_info(mnt->mnt_dir, &fs_info_arg,
&dev_info_arg); &dev_info_arg);
if (ret) { if (ret)
kfree(dev_info_arg);
goto out; goto out;
}
/* skip all fs already shown as mounted fs */ /* skip all fs already shown as mounted fs */
if (is_seen_fsid(fs_info_arg.fsid)) if (is_seen_fsid(fs_info_arg.fsid))
@ -476,14 +476,11 @@ static int btrfs_scan_kernel(void *search, unsigned unit_mode)
ret = get_label_unmounted( ret = get_label_unmounted(
(const char *)dev_info_arg->path, label); (const char *)dev_info_arg->path, label);
if (ret) { if (ret)
kfree(dev_info_arg);
goto out; goto out;
}
if (search && !match_search_item_kernel(fs_info_arg.fsid, if (search && !match_search_item_kernel(fs_info_arg.fsid,
mnt->mnt_dir, label, search)) { mnt->mnt_dir, label, search)) {
kfree(dev_info_arg);
dev_info_arg = NULL;
continue; continue;
} }
@ -497,11 +494,10 @@ static int btrfs_scan_kernel(void *search, unsigned unit_mode)
} }
if (fd != -1) if (fd != -1)
close(fd); close(fd);
kfree(dev_info_arg);
dev_info_arg = NULL;
} }
out: out:
free(dev_info_arg);
endmntent(f); endmntent(f);
return !found; return !found;
} }