[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
- [PATCH v2 0/8] fix gcc9 build with -Werror=address-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 7/8] chainloader: fix gcc9 error -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 3/8] hfs: fix gcc9 error -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 4/8] hfsplus: fix gcc9 error with -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 8/8] efi: fix gcc9 error -Waddress-of-packed-member,
Michael Chang <=
- [PATCH v2 2/8] jfs: disable gcc9 -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 5/8] acpi: fix gcc9 error -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 6/8] usbtest: disable gcc9 -Waddress-of-packed-member, Michael Chang, 2019/04/11
- [PATCH v2 1/8] cpio: disable gcc9 -Waddress-of-packed-member, Michael Chang, 2019/04/11
- Re: [PATCH v2 0/8] fix gcc9 build with -Werror=address-of-packed-member, Daniel Kiper, 2019/04/18