On 3/4/13 4:39 PM, Eric Sandeen wrote: > If we discover that a passed-in fd is not a mountpoint, > we determine whether it is a device, and issue another > open() against the device's mount point if it is mounted. > > If we do so, ensure this 2nd fd gets closed before we return > so that it does not leak, by consolidating error returns. > > Signed-off-by: Eric Sandeen <sand...@redhat.com>
Gah, self-nak on this for now, I started trying to make a regression test for scrub, and this makes it fail. Don't know why yet. -Eric > --- > utils.c | 21 ++++++++++++++------- > 1 files changed, 14 insertions(+), 7 deletions(-) > > diff --git a/utils.c b/utils.c > index 1813dda..54d577c 100644 > --- a/utils.c > +++ b/utils.c > @@ -1462,6 +1462,7 @@ int get_fs_info(int fd, char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > struct btrfs_ioctl_dev_info_args **di_ret) > { > int ret = 0; > + int fd2 = -1; > int ndevs = 0; > int i = 1; > struct btrfs_fs_devices *fs_devices_mnt = NULL; > @@ -1484,19 +1485,22 @@ int get_fs_info(int fd, char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > i = fs_devices_mnt->latest_devid; > memcpy(fi_args->fsid, fs_devices_mnt->fsid, BTRFS_FSID_SIZE); > close(fd); > - fd = open_file_or_dir(mp); > - if (fd < 0) > + fd2 = open_file_or_dir(mp); > + if (fd2 < 0) > return -errno; > + fd = fd2; > } else if (ret) { > return -errno; > } > > if (!fi_args->num_devices) > - return 0; > + goto out; > > di_args = *di_ret = malloc(fi_args->num_devices * sizeof(*di_args)); > - if (!di_args) > - return -errno; > + if (!di_args) { > + ret = -errno; > + goto out; > + } > > for (; i <= fi_args->max_id; ++i) { > BUG_ON(ndevs >= fi_args->num_devices); > @@ -1504,13 +1508,16 @@ int get_fs_info(int fd, char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > if (ret == -ENODEV) > continue; > if (ret) > - return ret; > + goto out; > ndevs++; > } > > BUG_ON(ndevs == 0); > > - return 0; > +out: > + if (fd2 != -1) > + close(fd2); > + return ret; > } > > #define isoctal(c) (((c) & ~7) == '0') > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html