ZIO_SET_CHECKSUM(&emptycksum, diskdesc->vdev_phys_sector << 9, 0, 0, 0);
err = zio_checksum_verify (emptycksum, ZIO_CHECKSUM_LABEL, endian,
nvlist, VDEV_PHYS_SIZE);
- if (err)
+ if (err) {
+ grub_free (nvlist);
return err;
+ }
grub_dprintf ("zfs", "check 2 passed\n");
if (original)
data->guid = poolguid;
- if (data->guid != poolguid)
+ if (data->guid != poolguid) {
+ grub_free (nvlist);
return grub_error (GRUB_ERR_BAD_FS, "another zpool");
+ }
{
char *nv;
{
grub_dprintf("zfs","feature missing in check_pool_label:%s\n",name);
err= grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET," check_pool_label missing feature '%s' for read",name);
+ grub_free(features);
+ grub_free(nvlist);
return err;
}
}
+ grub_free(features);
}
grub_dprintf ("zfs", "check 12 passed (feature flags)\n");
grub_free (nvlist);
return err;
}
+ grub_free (zapbuf);
return grub_error (GRUB_ERR_BAD_FS, "unknown ZAP type");
}
grub_free (zapbuf);
return ret;
}
+ grub_free (zapbuf);
grub_error (GRUB_ERR_BAD_FS, "unknown ZAP type");
return 0;
}
if (block_type == ZBT_MICRO)
{
grub_error (GRUB_ERR_BAD_FS, "micro ZAP where FAT ZAP expected");
+ grub_free (zapbuf);
return 0;
}
if (block_type == ZBT_HEADER)
grub_free (zapbuf);
return ret;
}
+ grub_free (zapbuf);
grub_error (GRUB_ERR_BAD_FS, "unknown ZAP type");
return 0;
}
}
grub_memmove (&(buf->dn), (dnode_phys_t *) dnbuf + idx, DNODE_SIZE);
+ if (data->dnode_buf == 0)
+ /* dnbuf not used anymore if data->dnode_mdn malloc failed */
+ grub_free (dnbuf);
buf->endian = endian;
if (type && buf->dn.dn_type != type)
return grub_error(GRUB_ERR_BAD_FS, "incorrect dnode type");
if (err)
{
grub_dprintf ("zfs", "failed here\n");
+ grub_free (fsname);
+ grub_free (snapname);
return err;
}
if (!err)
err = dnode_get (&(data->mos), headobj, 0,
&subvol->mdn, data);
- if (!err && subvol->mdn.dn.dn_type != DMU_OT_DSL_DATASET && subvol->mdn.dn.dn_bonustype != DMU_OT_DSL_DATASET)
+ if (!err && subvol->mdn.dn.dn_type != DMU_OT_DSL_DATASET && subvol->mdn.dn.dn_bonustype != DMU_OT_DSL_DATASET) {
+ grub_free (fsname);
+ grub_free (snapname);
return grub_error(GRUB_ERR_BAD_FS, "incorrect dataset dnode type");
+ }
if (err)
{
{
void *sahdrp;
int hdrsize;
+ bool free_sahdrp = false;
if (data->dnode.dn.dn_bonuslen != 0)
{
err = zio_read (bp, data->dnode.endian, &sahdrp, NULL, data);
if (err)
return err;
+ free_sahdrp = true;
}
else
{
hdrsize = SA_HDR_SIZE (((sa_hdr_phys_t *) sahdrp));
file->size = grub_zfs_to_cpu64 (grub_get_unaligned64 ((char *) sahdrp + hdrsize + SA_SIZE_OFFSET), data->dnode.endian);
+ if (free_sahdrp)
+ grub_free(sahdrp);
}
else if (data->dnode.dn.dn_bonustype == DMU_OT_ZNODE)
{
{
void *sahdrp;
int hdrsize;
+ bool free_sahdrp = false;
if (dn.dn.dn_bonuslen != 0)
{
err = zio_read (bp, dn.endian, &sahdrp, NULL, data);
if (err)
return err;
+ free_sahdrp = true;
}
else
{
hdrsize = SA_HDR_SIZE (((sa_hdr_phys_t *) sahdrp));
info->mtimeset = 1;
info->mtime = grub_zfs_to_cpu64 (grub_get_unaligned64 ((char *) sahdrp + hdrsize + SA_MTIME_OFFSET), dn.endian);
+ if (free_sahdrp)
+ grub_free (sahdrp);
}
if (dn.dn.dn_bonustype == DMU_OT_ZNODE)
{
void *sahdrp;
int hdrsize;
+ bool free_sahdrp = false;
if (dn.dn.dn_bonuslen != 0)
{
grub_print_error ();
return 0;
}
+ free_sahdrp = true;
}
else
{
info.mtimeset = 1;
info.mtime = grub_zfs_to_cpu64 (grub_get_unaligned64 ((char *) sahdrp + hdrsize + SA_MTIME_OFFSET), dn.endian);
info.case_insensitive = ctx->data->subvol.case_insensitive;
+ if (free_sahdrp)
+ grub_free (sahdrp);
}
if (dn.dn.dn_bonustype == DMU_OT_ZNODE)
dnode_end_t dn,mosmdn;
mzap_phys_t* mzp;
grub_zfs_endian_t endianzap;
- int size;
+ int size, ret;
grub_memmove(&(mosmdn.dn),mosmdn_phys,sizeof(dnode_phys_t));
mosmdn.endian=endian;
errnum = dnode_get(&mosmdn, DMU_POOL_DIRECTORY_OBJECT,
return errnum;
size = grub_zfs_to_cpu16 (dn.dn.dn_datablkszsec, dn.endian) << SPA_MINBLOCKSHIFT;
- return mzap_iterate (mzp,endianzap, size, check_feature,NULL);
+ ret = mzap_iterate (mzp,endianzap, size, check_feature,NULL);
+ grub_free(mzp);
+ return ret;
}