Hello community,

here is the log from the commit of package grub2 for openSUSE:Factory checked 
in at 2019-05-09 10:01:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/grub2 (Old)
 and      /work/SRC/openSUSE:Factory/.grub2.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "grub2"

Thu May  9 10:01:05 2019 rev:203 rq:700269 version:2.02

Changes:
--------
--- /work/SRC/openSUSE:Factory/grub2/grub2.changes      2019-03-24 
14:55:51.631209293 +0100
+++ /work/SRC/openSUSE:Factory/.grub2.new.5148/grub2.changes    2019-05-09 
10:01:17.851634369 +0200
@@ -1,0 +2,13 @@
+Fri May  3 02:42:27 UTC 2019 - mchang <mch...@suse.com>
+
+- Fix GCC 9 build failure (bsc#1121208)
+  * 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch
+  * 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch
+  * 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch
+  * 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch
+  * 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch
+  * 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch
+  * 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch
+  * 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch
+
+-------------------------------------------------------------------

New:
----
  0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch
  0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch
  0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch
  0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch
  0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch
  0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch
  0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch
  0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ grub2.spec ++++++
--- /var/tmp/diff_new_pack.zhWVbx/_old  2019-05-09 10:01:19.779639890 +0200
+++ /var/tmp/diff_new_pack.zhWVbx/_new  2019-05-09 10:01:19.783639901 +0200
@@ -318,6 +318,15 @@
 Patch510:       grub2-video-limit-the-resolution-for-fixed-bimap-font.patch
 # Support long menuentries (FATE#325760)
 Patch511:       grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch
+# Fix GCC 9 build failure (bsc#1121208)
+Patch520:       0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch
+Patch521:       0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch
+Patch522:       0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch
+Patch523:       0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch
+Patch524:       0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch
+Patch525:       0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch
+Patch526:       0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch
+Patch527:       0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch
 
 Requires:       gettext-runtime
 %if 0%{?suse_version} >= 1140
@@ -618,6 +627,14 @@
 %patch501 -p1
 %patch510 -p1
 %patch511 -p1
+%patch520 -p1
+%patch521 -p1
+%patch522 -p1
+%patch523 -p1
+%patch524 -p1
+%patch525 -p1
+%patch526 -p1
+%patch527 -p1
 
 %build
 # collect evidence to debug spurious build failure on SLE15

++++++ 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch ++++++
>From 7ea474c68847757d4c67ffc67f7d714b77c41578 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:02 +0800
Subject: [PATCH 1/8] cpio: Disable gcc9 -Waddress-of-packed-member

Disable the -Wadress-of-packaed-member diagnostic for the
grub_cpio_find_file function since the result is found to be false
postive. Any pointers to member of the 'struct head hd' is aligned even
if the structure is packed without paddings.

[   59s] In file included from ../grub-core/fs/cpio.c:51:
[   59s] ../grub-core/fs/cpio_common.c: In function 'grub_cpio_find_file':
[   59s] ../grub-core/fs/cpio_common.c:58:31: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    58 |   data->size = read_number (hd.filesize, ARRAY_SIZE 
(hd.filesize));
[   59s]       |                             ~~^~~~~~~~~
[   59s] ../grub-core/fs/cpio_common.c:60:29: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    60 |     *mtime = read_number (hd.mtime, ARRAY_SIZE (hd.mtime));
[   59s]       |                           ~~^~~~~~
[   59s] ../grub-core/fs/cpio_common.c:61:28: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    61 |   modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode));
[   59s]       |                          ~~^~~~~
[   59s] ../grub-core/fs/cpio_common.c:62:29: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    62 |   namesize = read_number (hd.namesize, ARRAY_SIZE 
(hd.namesize));
[   59s]       |                           ~~^~~~~~~~~
[   59s] In file included from ../grub-core/fs/cpio_be.c:51:
[   59s] ../grub-core/fs/cpio_common.c: In function 'grub_cpio_find_file':
[   59s] ../grub-core/fs/cpio_common.c:58:31: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    58 |   data->size = read_number (hd.filesize, ARRAY_SIZE 
(hd.filesize));
[   59s]       |                             ~~^~~~~~~~~
[   59s] ../grub-core/fs/cpio_common.c:60:29: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    60 |     *mtime = read_number (hd.mtime, ARRAY_SIZE (hd.mtime));
[   59s]       |                           ~~^~~~~~
[   59s] ../grub-core/fs/cpio_common.c:61:28: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    61 |   modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode));
[   59s]       |                          ~~^~~~~
[   59s] ../grub-core/fs/cpio_common.c:62:29: error: taking address of packed 
member of 'struct head' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]    62 |   namesize = read_number (hd.namesize, ARRAY_SIZE 
(hd.namesize));
[   59s]       |                           ~~^~~~~~~~~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 grub-core/fs/cpio_common.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/grub-core/fs/cpio_common.c b/grub-core/fs/cpio_common.c
index ed134d931..4e885d623 100644
--- a/grub-core/fs/cpio_common.c
+++ b/grub-core/fs/cpio_common.c
@@ -36,6 +36,11 @@ struct grub_archelp_data
   grub_off_t size;
 };
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
+
 static grub_err_t
 grub_cpio_find_file (struct grub_archelp_data *data, char **name,
                     grub_int32_t *mtime, grub_uint32_t *mode)
@@ -96,6 +101,10 @@ grub_cpio_find_file (struct grub_archelp_data *data, char 
**name,
   return GRUB_ERR_NONE;
 }
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
+
 static char *
 grub_cpio_get_link_target (struct grub_archelp_data *data)
 {
-- 
2.16.4

++++++ 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch ++++++
>From 4f4128defdec0958f7a38736e2c9be2368a5a6da Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:03 +0800
Subject: [PATCH 2/8] jfs: Disable gcc9 -Waddress-of-packed-member

Disable the -Wadress-of-packaed-member diagnostic for the
grub_jfs_getent function since the result is found to be false postive.

The leaf is read into memory as continous chunks in size of 32 bytes and
the pointer to its base is aligned, which also guarentee its member
leaf->namepart is aligned.

[   60s] ../grub-core/fs/jfs.c: In function 'grub_jfs_getent':
[   60s] ../grub-core/fs/jfs.c:557:44: error: taking address of packed member 
of 'struct grub_jfs_leaf_dirent' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   60s]   557 |   le_to_cpu16_copy (filename + strpos, leaf->namepart, len < 
diro->data->namecomponentlen ? len
[   60s]       |                                        ~~~~^~~~~~~~~~
[   60s] ../grub-core/fs/jfs.c:570:48: error: taking address of packed member 
of 'struct grub_jfs_leaf_next_dirent' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   60s]   570 |  le_to_cpu16_copy (filename + strpos, next_leaf->namepart, len 
< 15 ? len : 15);
[   60s]       |                                       ~~~~~~~~~^~~~~~~~~~
[   60s] cc1: all warnings being treated as errors

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 grub-core/fs/jfs.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/grub-core/fs/jfs.c b/grub-core/fs/jfs.c
index 09bc5608d..d5a6d6527 100644
--- a/grub-core/fs/jfs.c
+++ b/grub-core/fs/jfs.c
@@ -505,6 +505,10 @@ le_to_cpu16_copy (grub_uint16_t *out, grub_uint16_t *in, 
grub_size_t len)
     *out++ = grub_le_to_cpu16 (*in++);
 }
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
 
 /* Read in the next dirent from the directory described by DIRO.  */
 static grub_err_t
@@ -582,6 +586,9 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
   return 0;
 }
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
 
 /* Read LEN bytes from the file described by DATA starting with byte
    POS.  Return the amount of read bytes in READ.  */
-- 
2.16.4

++++++ 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch ++++++
>From 0e49748fad8e036d9875785e57c577214e699941 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:04 +0800
Subject: [PATCH 3/8] hfs: Fix gcc9 error -Waddress-of-packed-member

Simply adds the missing packed attribute to 'struct grub_hfs_extent'.

[   83s] ../grub-core/fs/hfs.c: In function 'grub_hfs_iterate_records':
[   83s] ../grub-core/fs/hfs.c:699:9: error: taking address of packed member of 
'struct grub_hfs_sblock' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   83s]   699 |      ? (&data->sblock.catalog_recs)
[   83s]       |        ~^~~~~~~~~~~~~~~~~~~~~~~~~~~
[   83s] ../grub-core/fs/hfs.c:700:9: error: taking address of packed member of 
'struct grub_hfs_sblock' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   83s]   700 |      : (&data->sblock.extent_recs));
[   83s]       |        ~^~~~~~~~~~~~~~~~~~~~~~~~~~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 include/grub/hfs.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/grub/hfs.h b/include/grub/hfs.h
index d935f5005..e27993c42 100644
--- a/include/grub/hfs.h
+++ b/include/grub/hfs.h
@@ -29,7 +29,7 @@ struct grub_hfs_extent
   /* The first physical block.  */
   grub_uint16_t first_block;
   grub_uint16_t count;
-};
+} GRUB_PACKED;
 
 /* HFS stores extents in groups of 3.  */
 typedef struct grub_hfs_extent grub_hfs_datarecord_t[3];
-- 
2.16.4

++++++ 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch ++++++
>From 621024090b7729c8c698c8ab916d792846d20818 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:05 +0800
Subject: [PATCH 4/8] hfsplus: Fix gcc9 error with -Waddress-of-packed-member

The catkey->name could be unaligned since the address of 'void* record'
is calculated as offset in bytes to a malloc buffer.

The fix is using aligned buffer allocated by grub_malloc for holding
the UTF16 string copied from catkey->name. And use that buffer as
argument for grub_utf16_to_utf8 to convert to UTF8 strings.

In addition, using a new copy of buffer rather than catkey->name itself
for processing the endianess conversion, we can also get rid of the hunk
restoring byte order of catkey->name to what it was previously.

[   59s] ../grub-core/fs/hfsplus.c: In function 'list_nodes':
[   59s] ../grub-core/fs/hfsplus.c:738:57: error: taking address of packed 
member of 'struct grub_hfsplus_catkey' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]   738 |   *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
[   59s]       |                                                   ~~~~~~^~~~~~
[   59s] ../grub-core/fs/hfsplus.c: In function 'grub_hfsplus_label':
[   59s] ../grub-core/fs/hfsplus.c:1019:57: error: taking address of packed 
member of 'struct grub_hfsplus_catkey' may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[   59s]  1019 |   *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), catkey->name,
[   59s]       |                                                   ~~~~~~^~~~~~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 grub-core/fs/hfsplus.c | 57 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 17 deletions(-)

diff --git a/grub-core/fs/hfsplus.c b/grub-core/fs/hfsplus.c
index 73ae95fbc..54786bb1c 100644
--- a/grub-core/fs/hfsplus.c
+++ b/grub-core/fs/hfsplus.c
@@ -661,6 +661,7 @@ list_nodes (void *record, void *hook_arg)
   char *filename;
   int i;
   struct grub_fshelp_node *node;
+  grub_uint16_t *keyname;
   struct grub_hfsplus_catfile *fileinfo;
   enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
   struct list_nodes_ctx *ctx = hook_arg;
@@ -719,32 +720,34 @@ list_nodes (void *record, void *hook_arg)
   if (! filename)
     return 0;
 
+  keyname = grub_malloc (grub_be_to_cpu16 (catkey->namelen) * sizeof 
(*keyname));
+  if (!keyname)
+    {
+      grub_free (filename);
+      return 0;
+    }
+
   /* Make sure the byte order of the UTF16 string is correct.  */
   for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
     {
-      catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+      keyname[i] = grub_be_to_cpu16 (catkey->name[i]);
 
-      if (catkey->name[i] == '/')
-       catkey->name[i] = ':';
+      if (keyname[i] == '/')
+       keyname[i] = ':';
 
       /* If the name is obviously invalid, skip this node.  */
-      if (catkey->name[i] == 0)
+      if (keyname[i] == 0)
        {
+         grub_free (keyname);
          grub_free (filename);
          return 0;
        }
     }
 
-  *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
+  *grub_utf16_to_utf8 ((grub_uint8_t *) filename, keyname,
                       grub_be_to_cpu16 (catkey->namelen)) = '\0';
 
-  /* Restore the byte order to what it was previously.  */
-  for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
-    {
-      if (catkey->name[i] == ':')
-       catkey->name[i] = '/';
-      catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
-    }
+  grub_free (keyname);
 
   /* hfs+ is case insensitive.  */
   if (! ctx->dir->data->case_sensitive)
@@ -975,6 +978,7 @@ grub_hfsplus_label (grub_device_t device, char **label)
   grub_disk_t disk = device->disk;
   struct grub_hfsplus_catkey *catkey;
   int i, label_len;
+  grub_uint16_t *label_name;
   struct grub_hfsplus_key_internal intern;
   struct grub_hfsplus_btnode *node = NULL;
   grub_disk_addr_t ptr = 0;
@@ -1003,22 +1007,41 @@ grub_hfsplus_label (grub_device_t device, char **label)
     grub_hfsplus_btree_recptr (&data->catalog_tree, node, ptr);
 
   label_len = grub_be_to_cpu16 (catkey->namelen);
+  label_name = grub_malloc (label_len * sizeof (*label_name));
+  if (!label_name)
+    {
+      grub_free (node);
+      grub_free (data);
+      return grub_errno;
+    }
+
   for (i = 0; i < label_len; i++)
     {
-      catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+      label_name[i] = grub_be_to_cpu16 (catkey->name[i]);
 
       /* If the name is obviously invalid, skip this node.  */
-      if (catkey->name[i] == 0)
-       return 0;
+      if (label_name[i] == 0)
+       {
+         grub_free (label_name);
+         grub_free (node);
+         grub_free (data);
+         return 0;
+       }
     }
 
   *label = grub_malloc (label_len * GRUB_MAX_UTF8_PER_UTF16 + 1);
   if (! *label)
-    return grub_errno;
+    {
+      grub_free (label_name);
+      grub_free (node);
+      grub_free (data);
+      return grub_errno;
+    }
 
-  *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), catkey->name,
+  *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), label_name,
                       label_len) = '\0';
 
+  grub_free (label_name);
   grub_free (node);
   grub_free (data);
 
-- 
2.16.4

++++++ 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch ++++++
>From 0b1bf3932f1b1700d3c8a997e4850fb9a013569d Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:06 +0800
Subject: [PATCH 5/8] acpi: Fix gcc9 error -Waddress-of-packed-member

Simply adds the missing packed attribute to 'struct grub_acpi_madt'.

[  233s] ../../grub-core/commands/lsacpi.c: In function 'disp_acpi_xsdt_table':
[  233s] ../../grub-core/commands/lsacpi.c:201:27: error: converting a packed 
'struct grub_acpi_table_header' pointer (alignment 1) to a 'struct 
grub_acpi_madt' pointer (alignment 4) may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[  233s]   201 |  disp_madt_table ((struct grub_acpi_madt *) t);
[  233s]       |                           ^~~~~~~~~~~~~~
[  233s] In file included from ../../grub-core/commands/lsacpi.c:23:
[  233s] ../../include/grub/acpi.h:50:8: note: defined here
[  233s]    50 | struct grub_acpi_table_header
[  233s]       |        ^~~~~~~~~~~~~~~~~~~~~~
[  233s] ../../include/grub/acpi.h:90:8: note: defined here
[  233s]    90 | struct grub_acpi_madt
[  233s]       |        ^~~~~~~~~~~~~~
[  233s] ../../grub-core/commands/lsacpi.c: In function 'disp_acpi_rsdt_table':
[  233s] ../../grub-core/commands/lsacpi.c:225:27: error: converting a packed 
'struct grub_acpi_table_header' pointer (alignment 1) to a 'struct 
grub_acpi_madt' pointer (alignment 4) may result in an unaligned pointer value 
[-Werror=address-of-packed-member]
[  233s]   225 |  disp_madt_table ((struct grub_acpi_madt *) t);
[  233s]       |                           ^~~~~~~~~~~~~~
[  233s] In file included from ../../grub-core/commands/lsacpi.c:23:
[  233s] ../../include/grub/acpi.h:50:8: note: defined here
[  233s]    50 | struct grub_acpi_table_header
[  233s]       |        ^~~~~~~~~~~~~~~~~~~~~~
[  233s] ../../include/grub/acpi.h:90:8: note: defined here
[  233s]    90 | struct grub_acpi_madt
[  233s]       |        ^~~~~~~~~~~~~~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 include/grub/acpi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/grub/acpi.h b/include/grub/acpi.h
index 66148f684..84f49487d 100644
--- a/include/grub/acpi.h
+++ b/include/grub/acpi.h
@@ -93,7 +93,7 @@ struct grub_acpi_madt
   grub_uint32_t lapic_addr;
   grub_uint32_t flags;
   struct grub_acpi_madt_entry_header entries[0];
-};
+} GRUB_PACKED;
 
 enum
   {
-- 
2.16.4

++++++ 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch ++++++
>From 85e08e174e15c497c4387c16e92243e6ed05feb6 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:07 +0800
Subject: [PATCH 6/8] usbtest: Disable gcc9 -Waddress-of-packed-member

Disable the -Wadress-of-packaed-member diagnostic for the
grub_usb_get_string function since the result is false postive. The
descstrp->str is found to be aligned in the buffer allocated for 'struct
grub_usb_desc_str'.

[  229s] ../../grub-core/commands/usbtest.c: In function 'grub_usb_get_string':
[  229s] ../../grub-core/commands/usbtest.c:104:58: error: taking address of 
packed member of 'struct grub_usb_desc_str' may result in an unaligned pointer 
value [-Werror=address-of-packed-member]
[  229s]   104 |   *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str,
[  229s]       |                                                  ~~~~~~~~^~~~~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 grub-core/commands/usbtest.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/grub-core/commands/usbtest.c b/grub-core/commands/usbtest.c
index 01cdca934..2c6d93fe6 100644
--- a/grub-core/commands/usbtest.c
+++ b/grub-core/commands/usbtest.c
@@ -63,6 +63,11 @@ static const char *usb_devspeed[] =
     "High"
   };
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
+
 static grub_usb_err_t
 grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
                     char **string)
@@ -108,6 +113,10 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t 
index, int langid,
   return GRUB_USB_ERR_NONE;
 }
 
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
+
 static void
 usb_print_str (const char *description, grub_usb_device_t dev, int idx)
 {
-- 
2.16.4

++++++ 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch ++++++
>From 4868e17507dfebf2894079ad6b4876e612706f30 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:08 +0800
Subject: [PATCH 7/8] chainloader: 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 using aligned buffer allocated by grub_malloc for receiving
the converted UTF16 string by grub_utf8_to_utf16 and also the processing
after. The resulting string then gets copied to fp->path_name.

[  243s] ../../grub-core/loader/efi/chainloader.c: In function 'copy_file_path':
[  243s] ../../grub-core/loader/efi/chainloader.c:136:32: 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]
[  243s]   136 |   size = grub_utf8_to_utf16 (fp->path_name, len * 
GRUB_MAX_UTF16_PER_UTF8,
[  243s]       |                              ~~^~~~~~~~~~~
[  243s] ../../grub-core/loader/efi/chainloader.c:138:12: 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]
[  243s]   138 |   for (p = fp->path_name; p < fp->path_name + size; p++)
[  243s]       |            ^~

Signed-off-by: Michael Chang <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 grub-core/loader/efi/chainloader.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/grub-core/loader/efi/chainloader.c 
b/grub-core/loader/efi/chainloader.c
index f706b1ac3..cd92ea3f2 100644
--- a/grub-core/loader/efi/chainloader.c
+++ b/grub-core/loader/efi/chainloader.c
@@ -110,21 +110,27 @@ static void
 copy_file_path (grub_efi_file_path_device_path_t *fp,
                const char *str, grub_efi_uint16_t len)
 {
-  grub_efi_char16_t *p;
+  grub_efi_char16_t *p, *path_name;
   grub_efi_uint16_t size;
 
   fp->header.type = GRUB_EFI_MEDIA_DEVICE_PATH_TYPE;
   fp->header.subtype = GRUB_EFI_FILE_PATH_DEVICE_PATH_SUBTYPE;
 
-  size = grub_utf8_to_utf16 (fp->path_name, len * GRUB_MAX_UTF16_PER_UTF8,
+  path_name = grub_malloc (len * GRUB_MAX_UTF16_PER_UTF8 * sizeof 
(*path_name));
+  if (!path_name)
+    return;
+
+  size = grub_utf8_to_utf16 (path_name, len * GRUB_MAX_UTF16_PER_UTF8,
                             (const grub_uint8_t *) str, len, 0);
-  for (p = fp->path_name; p < fp->path_name + size; p++)
+  for (p = path_name; p < path_name + size; p++)
     if (*p == '/')
       *p = '\\';
 
+  grub_memcpy (fp->path_name, path_name, size * sizeof (*fp->path_name));
   /* File Path is NULL terminated */
   fp->path_name[size++] = '\0';
   fp->header.length = size * sizeof (grub_efi_char16_t) + sizeof (*fp);
+  grub_free (path_name);
 }
 
 static grub_efi_device_path_t *
-- 
2.16.4

++++++ 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch ++++++
>From 4dd4ceec023111a4ccf69f8de6fa0885c6847a35 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 11 Apr 2019 17:14:09 +0800
Subject: [PATCH 8/8] 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 <mch...@suse.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 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 84e68cf31..6e1ceb905 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -372,6 +372,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++ = '/';
 
@@ -382,7 +383,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);
@@ -812,9 +822,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