fs/ntfs: Fix memory leaks in grub_ntfs_read_symlink()
Fixes: 5773fb641 (Support NTFS reparse points) Signed-off-by: t.feng <fengtao40@huawei.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
f3fab3ea60
commit
a2f7914c3c
@ -654,7 +654,7 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
|
|||||||
struct grub_ntfs_file *mft;
|
struct grub_ntfs_file *mft;
|
||||||
struct symlink_descriptor symdesc;
|
struct symlink_descriptor symdesc;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_uint8_t *buf16;
|
grub_uint8_t *buf16 = NULL;
|
||||||
char *buf, *end;
|
char *buf, *end;
|
||||||
grub_size_t len;
|
grub_size_t len;
|
||||||
grub_uint8_t *pa;
|
grub_uint8_t *pa;
|
||||||
@ -667,20 +667,20 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (read_mft (mft->data, mft->buf, mft->ino))
|
if (read_mft (mft->data, mft->buf, mft->ino))
|
||||||
return NULL;
|
goto fail;
|
||||||
|
|
||||||
pa = locate_attr (&mft->attr, mft, GRUB_NTFS_AT_SYMLINK);
|
pa = locate_attr (&mft->attr, mft, GRUB_NTFS_AT_SYMLINK);
|
||||||
if (pa == NULL)
|
if (pa == NULL)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FS, "no $SYMLINK in MFT 0x%llx",
|
grub_error (GRUB_ERR_BAD_FS, "no $SYMLINK in MFT 0x%llx",
|
||||||
(unsigned long long) mft->ino);
|
(unsigned long long) mft->ino);
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = read_attr (&mft->attr, (grub_uint8_t *) &symdesc, 0,
|
err = read_attr (&mft->attr, (grub_uint8_t *) &symdesc, 0,
|
||||||
sizeof (struct symlink_descriptor), 1, 0, 0);
|
sizeof (struct symlink_descriptor), 1, 0, 0);
|
||||||
if (err)
|
if (err)
|
||||||
return NULL;
|
goto fail;
|
||||||
|
|
||||||
switch (grub_cpu_to_le32 (symdesc.type))
|
switch (grub_cpu_to_le32 (symdesc.type))
|
||||||
{
|
{
|
||||||
@ -697,23 +697,22 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
|
|||||||
default:
|
default:
|
||||||
grub_error (GRUB_ERR_BAD_FS, "symlink type invalid (%x)",
|
grub_error (GRUB_ERR_BAD_FS, "symlink type invalid (%x)",
|
||||||
grub_cpu_to_le32 (symdesc.type));
|
grub_cpu_to_le32 (symdesc.type));
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf16 = grub_malloc (len);
|
buf16 = grub_malloc (len);
|
||||||
if (!buf16)
|
if (!buf16)
|
||||||
return NULL;
|
goto fail;
|
||||||
|
|
||||||
err = read_attr (&mft->attr, buf16, off, len, 1, 0, 0);
|
err = read_attr (&mft->attr, buf16, off, len, 1, 0, 0);
|
||||||
if (err)
|
if (err)
|
||||||
return NULL;
|
goto fail;
|
||||||
|
|
||||||
buf = get_utf8 (buf16, len / 2);
|
buf = get_utf8 (buf16, len / 2);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
goto fail;
|
||||||
grub_free (buf16);
|
|
||||||
return NULL;
|
grub_free (mft->buf);
|
||||||
}
|
|
||||||
grub_free (buf16);
|
grub_free (buf16);
|
||||||
|
|
||||||
for (end = buf; *end; end++)
|
for (end = buf; *end; end++)
|
||||||
@ -728,6 +727,11 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
|
|||||||
end -= 6;
|
end -= 6;
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
grub_free (mft->buf);
|
||||||
|
grub_free (buf16);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user