char **ret;
fd = open (dir, 0);
- if (!fd)
+ if (fd < 0)
return NULL;
if (ioctl (fd, BTRFS_IOC_FS_INFO, &fsi) < 0)
args.objectid = GRUB_BTRFS_TREE_ROOT_OBJECTID;
if (ioctl (fd, BTRFS_IOC_INO_LOOKUP, &args) < 0)
- return NULL;
+ goto fail;
tree_id = args.treeid;
if (fstat (fd, &st) < 0)
- return NULL;
+ goto fail;
inode_id = st.st_ino;
while (tree_id != GRUB_BTRFS_ROOT_VOL_OBJECTID
sargs.key.nr_items = 1;
if (ioctl (fd, BTRFS_IOC_TREE_SEARCH, &sargs) < 0)
- return NULL;
+ goto fail;
if (sargs.key.nr_items == 0)
- return NULL;
-
+ goto fail;
+
tree_id = sargs.buf[2];
br = (struct grub_btrfs_root_backref *) (sargs.buf + 4);
inode_id = br->inode_id;
sargs.key.max_type = GRUB_BTRFS_ITEM_TYPE_INODE_REF;
if (ioctl (fd, BTRFS_IOC_TREE_SEARCH, &sargs) < 0)
- return NULL;
+ goto fail;
if (sargs.key.nr_items == 0)
- return NULL;
+ goto fail;
inode_id = sargs.buf[2];
if (!ret)
return xstrdup ("/");
return ret;
+ fail:
+ free (ret);
+ close (fd);
+ return NULL;
}
grub_util_part_to_disk (const char *os_dev, struct stat *st,
int *is_part)
{
- char *path = xmalloc (PATH_MAX);
+ char *path;
if (! S_ISBLK (st->st_mode))
{
return xstrdup (os_dev);
}
+ path = xmalloc (PATH_MAX);
+
if (! realpath (os_dev, path))
return NULL;