struct grub_ntfs_file *mft;
struct symlink_descriptor symdesc;
grub_err_t err;
- grub_uint8_t *buf16;
+ grub_uint8_t *buf16 = NULL;
char *buf, *end;
grub_size_t len;
grub_uint8_t *pa;
return NULL;
if (read_mft (mft->data, mft->buf, mft->ino))
- return NULL;
+ goto fail;
pa = locate_attr (&mft->attr, mft, GRUB_NTFS_AT_SYMLINK);
if (pa == NULL)
{
grub_error (GRUB_ERR_BAD_FS, "no $SYMLINK in MFT 0x%llx",
(unsigned long long) mft->ino);
- return NULL;
+ goto fail;
}
err = read_attr (&mft->attr, (grub_uint8_t *) &symdesc, 0,
sizeof (struct symlink_descriptor), 1, 0, 0);
if (err)
- return NULL;
+ goto fail;
switch (grub_cpu_to_le32 (symdesc.type))
{
default:
grub_error (GRUB_ERR_BAD_FS, "symlink type invalid (%x)",
grub_cpu_to_le32 (symdesc.type));
- return NULL;
+ goto fail;
}
buf16 = grub_malloc (len);
if (!buf16)
- return NULL;
+ goto fail;
err = read_attr (&mft->attr, buf16, off, len, 1, 0, 0);
if (err)
- return NULL;
+ goto fail;
buf = get_utf8 (buf16, len / 2);
if (!buf)
- {
- grub_free (buf16);
- return NULL;
- }
+ goto fail;
+
+ grub_free (mft->buf);
grub_free (buf16);
for (end = buf; *end; end++)
end -= 6;
}
return buf;
+
+ fail:
+ grub_free (mft->buf);
+ grub_free (buf16);
+ return NULL;
}
static int