efi: Fix gcc9 error -Waddress-of-packed-member
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 <mchang@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
9093277187
commit
35e918e7c9
1 changed files with 24 additions and 3 deletions
|
@ -400,6 +400,7 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
|
||||||
{
|
{
|
||||||
grub_efi_file_path_device_path_t *fp;
|
grub_efi_file_path_device_path_t *fp;
|
||||||
grub_efi_uint16_t len;
|
grub_efi_uint16_t len;
|
||||||
|
grub_efi_char16_t *dup_name;
|
||||||
|
|
||||||
*p++ = '/';
|
*p++ = '/';
|
||||||
|
|
||||||
|
@ -410,7 +411,16 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
|
||||||
while (len > 0 && fp->path_name[len - 1] == 0)
|
while (len > 0 && fp->path_name[len - 1] == 0)
|
||||||
len--;
|
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);
|
dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
|
||||||
|
@ -840,9 +850,20 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
|
||||||
fp = (grub_efi_file_path_device_path_t *) dp;
|
fp = (grub_efi_file_path_device_path_t *) dp;
|
||||||
buf = grub_malloc ((len - 4) * 2 + 1);
|
buf = grub_malloc ((len - 4) * 2 + 1);
|
||||||
if (buf)
|
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))
|
(len - 4) / sizeof (grub_efi_char16_t))
|
||||||
= '\0';
|
= '\0';
|
||||||
|
grub_free (dup_name);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
grub_printf ("/File(%s)", buf);
|
grub_printf ("/File(%s)", buf);
|
||||||
|
|
Loading…
Reference in a new issue