grub-devel
[Top][All Lists]
Advanced

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

[PATCH v2 8/8] efi: fix gcc9 error -Waddress-of-packed-member


From: Michael Chang
Subject: [PATCH v2 8/8] efi: fix gcc9 error -Waddress-of-packed-member
Date: Thu, 11 Apr 2019 17:14:09 +0800

The address of fp->path_name could be unaligned since seeking into the
device path buffer for a given node could end in byte boundary.

The fix is allocating aligned buffer by grub_malloc for holding the
UTF16 string copied from fp->path_name, and after using that buffer as
argument for grub_utf16_to_utf8 to convert it to UTF8 string.

[  255s] ../../grub-core/kern/efi/efi.c: In function 'grub_efi_get_filename':
[  255s] ../../grub-core/kern/efi/efi.c:410:60: error: taking address of packed 
member of 'struct grub_efi_file_path_device_path' may result in an unaligned 
pointer value [-Werror=address-of-packed-member]
[  255s]   410 |    p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, 
fp->path_name, len);
[  255s]       |                                                          
~~^~~~~~~~~~~
[  255s] ../../grub-core/kern/efi/efi.c: In function 
'grub_efi_print_device_path':
[  255s] ../../grub-core/kern/efi/efi.c:900:33: error: taking address of packed 
member of 'struct grub_efi_file_path_device_path' may result in an unaligned 
pointer value [-Werror=address-of-packed-member]
[  255s]   900 |     *grub_utf16_to_utf8 (buf, fp->path_name,
[  255s]       |                               ~~^~~~~~~~~~~

Signed-off-by: Michael Chang <address@hidden>
---
 grub-core/kern/efi/efi.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
index 708581fcb..62cd9829e 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -369,6 +369,7 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
        {
          grub_efi_file_path_device_path_t *fp;
          grub_efi_uint16_t len;
+         grub_efi_char16_t *dup_name;
 
          *p++ = '/';
 
@@ -379,7 +380,16 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
          while (len > 0 && fp->path_name[len - 1] == 0)
            len--;
 
-         p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, 
len);
+         dup_name = grub_malloc (len * sizeof (*dup_name));
+         if (!dup_name)
+           {
+             grub_free (name);
+             return NULL;
+           }
+         p = (char *) grub_utf16_to_utf8 ((unsigned char *) p,
+                                           grub_memcpy (dup_name, 
fp->path_name, len * sizeof (*dup_name)),
+                                           len);
+         grub_free (dup_name);
        }
 
       dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
@@ -809,9 +819,20 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
                fp = (grub_efi_file_path_device_path_t *) dp;
                buf = grub_malloc ((len - 4) * 2 + 1);
                if (buf)
-                 *grub_utf16_to_utf8 (buf, fp->path_name,
+                 {
+                   grub_efi_char16_t *dup_name = grub_malloc (len - 4);
+                   if (!dup_name)
+                     {
+                       grub_errno = GRUB_ERR_NONE;
+                       grub_printf ("/File((null))");
+                       grub_free (buf);
+                       break;
+                     }
+                   *grub_utf16_to_utf8 (buf, grub_memcpy (dup_name, 
fp->path_name, len - 4),
                                       (len - 4) / sizeof (grub_efi_char16_t))
-                   = '\0';
+                     = '\0';
+                   grub_free (dup_name);
+                 }
                else
                  grub_errno = GRUB_ERR_NONE;
                grub_printf ("/File(%s)", buf);
-- 
2.16.4




reply via email to

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