grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/9] fs/ntfs: Fix memory leak in grub_ntfs_read_symlink


From: t . feng
Subject: [PATCH 4/9] fs/ntfs: Fix memory leak in grub_ntfs_read_symlink
Date: Sat, 19 Nov 2022 18:39:41 +0800

Fix memory leaks in grub_ntfs_read_symlink.

Fixes: 5773fb641(Support NTFS reparse points.)

Signed-off-by: "t.feng" <fengtao40@huawei.com>
---
 grub-core/fs/ntfs.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c
index 3511e4e2c..eb5170ab7 100644
--- a/grub-core/fs/ntfs.c
+++ b/grub-core/fs/ntfs.c
@@ -667,20 +667,27 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
     return NULL;
 
   if (read_mft (mft->data, mft->buf, mft->ino))
-    return NULL;
+    {
+      grub_free (mft->buf);
+      return NULL;
+    }
 
   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);
+      grub_free (mft->buf);
       return NULL;
     }
 
   err = read_attr (&mft->attr, (grub_uint8_t *) &symdesc, 0,
                   sizeof (struct symlink_descriptor), 1, 0, 0);
   if (err)
-    return NULL;
+    {
+      grub_free (mft->buf);
+      return NULL;
+    }
 
   switch (grub_cpu_to_le32 (symdesc.type))
     {
@@ -697,23 +704,34 @@ grub_ntfs_read_symlink (grub_fshelp_node_t node)
     default:
       grub_error (GRUB_ERR_BAD_FS, "symlink type invalid (%x)",
                  grub_cpu_to_le32 (symdesc.type));
+      grub_free (mft->buf);
       return NULL;
     }
 
   buf16 = grub_malloc (len);
   if (!buf16)
-    return NULL;
+    {
+      grub_free (mft->buf);
+      return NULL;
+    }
 
   err = read_attr (&mft->attr, buf16, off, len, 1, 0, 0);
   if (err)
-    return NULL;
+    {
+      grub_free (mft->buf);
+      grub_free (buf16);
+      return NULL;
+    }
 
   buf = get_utf8 (buf16, len / 2);
   if (!buf)
     {
+      grub_free (mft->buf);
       grub_free (buf16);
       return NULL;
     }
+
+  grub_free (mft->buf);
   grub_free (buf16);
 
   for (end = buf; *end; end++)
-- 
2.27.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]