From a531c295e8fa16edf4c5e5b191eb09ea82322810a6828d5d403a35503b02bb37 Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Wed, 8 Apr 2020 11:06:35 +0000 Subject: [PATCH] Accepting request 792408 from home:michael-chang:gcc10 - Fix GCC 10 build fail (bsc#1158189) * 0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch * 0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch OBS-URL: https://build.opensuse.org/request/show/792408 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=353 --- ...-Fix-gcc10-error-Werror-array-bounds.patch | 52 +++++++++++ ...cc10-error-Werror-zero-length-bounds.patch | 87 +++++++++++++++++++ grub2.changes | 7 ++ grub2.spec | 5 ++ 4 files changed, 151 insertions(+) create mode 100644 0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch create mode 100644 0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch diff --git a/0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch b/0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch new file mode 100644 index 0000000..8932ed3 --- /dev/null +++ b/0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch @@ -0,0 +1,52 @@ +From fe8a83722bf1af7ea3949e6d96e7906407f78d5c Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 25 Mar 2020 13:52:51 +0800 +Subject: [PATCH 1/2] mdraid1x_linux: Fix gcc10 error -Werror=array-bounds + +We bumped into the build error while testing gcc-10 pre-release. + +../../grub-core/disk/mdraid1x_linux.c: In function 'grub_mdraid_detect': +../../grub-core/disk/mdraid1x_linux.c:181:15: error: array subscript is outside array bounds of 'grub_uint16_t[0]' {aka 'short unsigned int[0]'} [-Werror=array-bounds] + 181 | (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)] + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../grub-core/disk/mdraid1x_linux.c:98:17: note: while referencing 'dev_roles' + 98 | grub_uint16_t dev_roles[0]; /* Role in array, or 0xffff for a spare, or 0xfffe for faulty. */ + | ^~~~~~~~~ +../../grub-core/disk/mdraid1x_linux.c:127:33: note: defined here 'sb' + 127 | struct grub_raid_super_1x sb; + | ^~ +cc1: all warnings being treated as errors + +Apparently gcc issues the warning when trying to access sb.dev_roles +array's member, since it is a zero length array as the last element of +struct grub_raid_super_1x that is allocated sparsely without extra +chunks for the trailing bits, so the warning looks legitimate in this +regard. + +As the whole thing here is doing offset computation, it is undue to use +syntax that would imply array member access then take address from it +later. Instead we could accomplish the same thing through basic array +pointer arithmetic to pacify the warning. + +Signed-off-by: Michael Chang +Reviewed-by: Daniel Kiper +--- + grub-core/disk/mdraid1x_linux.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/disk/mdraid1x_linux.c b/grub-core/disk/mdraid1x_linux.c +index 7cc80d3df..c980feba4 100644 +--- a/grub-core/disk/mdraid1x_linux.c ++++ b/grub-core/disk/mdraid1x_linux.c +@@ -178,7 +178,7 @@ grub_mdraid_detect (grub_disk_t disk, + return NULL; + + if (grub_disk_read (disk, sector, +- (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)] ++ (char *) (sb.dev_roles + grub_le_to_cpu32 (sb.dev_number)) + - (char *) &sb, + sizeof (role), &role)) + return NULL; +-- +2.16.4 + diff --git a/0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch b/0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch new file mode 100644 index 0000000..144cc29 --- /dev/null +++ b/0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch @@ -0,0 +1,87 @@ +From 30379c2280c5b4514abafc2492e081209a330cb0 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 25 Mar 2020 14:28:15 +0800 +Subject: [PATCH 2/2] zfs: Fix gcc10 error -Werror=zero-length-bounds + +We bumped into the build error while testing gcc-10 pre-release. + +In file included from ../../include/grub/file.h:22, + from ../../grub-core/fs/zfs/zfs.c:34: +../../grub-core/fs/zfs/zfs.c: In function 'zap_leaf_lookup': +../../grub-core/fs/zfs/zfs.c:2263:44: error: array subscript '' is outside the bounds of an interior zero-length array 'grub_uint16_t[0]' {aka 'short unsigned int[0]'} [-Werror=zero-length-bounds] +2263 | for (chunk = grub_zfs_to_cpu16 (l->l_hash[LEAF_HASH (blksft, h, l)], endian); +../../include/grub/types.h:241:48: note: in definition of macro 'grub_le_to_cpu16' + 241 | # define grub_le_to_cpu16(x) ((grub_uint16_t) (x)) + | ^ +../../grub-core/fs/zfs/zfs.c:2263:16: note: in expansion of macro 'grub_zfs_to_cpu16' +2263 | for (chunk = grub_zfs_to_cpu16 (l->l_hash[LEAF_HASH (blksft, h, l)], endian); + | ^~~~~~~~~~~~~~~~~ +In file included from ../../grub-core/fs/zfs/zfs.c:48: +../../include/grub/zfs/zap_leaf.h:72:16: note: while referencing 'l_hash' + 72 | grub_uint16_t l_hash[0]; + | ^~~~~~ + +Here I'd like to quote from the gcc document [1] which seems best to +explain what is going on here. + +"Although the size of a zero-length array is zero, an array member of +this kind may increase the size of the enclosing type as a result of +tail padding. The offset of a zero-length array member from the +beginning of the enclosing structure is the same as the offset of an +array with one or more elements of the same type. The alignment of a +zero-length array is the same as the alignment of its elements. + +Declaring zero-length arrays in other contexts, including as interior +members of structure objects or as non-member objects, is discouraged. +Accessing elements of zero-length arrays declared in such contexts is +undefined and may be diagnosed." + +The l_hash[0] is apparnetly an interior member to the enclosed structure +while l_entries[0] is the trailing member. And the offending code tries +to access members in l_hash[0] array that triggers the diagnose. + +Given that the l_entries[0] is used to get proper alignment to access +leaf chunks, we can accomplish the same thing through the ALIGN_UP macro +thus eliminating l_entries[0] from the structure. In this way we can +pacify the warning as l_hash[0] now becomes the last member to the +enclosed structure. + +[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html + +Signed-off-by: Michael Chang +--- + grub-core/fs/zfs/zfs.c | 5 ++++- + include/grub/zfs/zap_leaf.h | 1 - + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c +index 2f72e42bf..b5e10fd0b 100644 +--- a/grub-core/fs/zfs/zfs.c ++++ b/grub-core/fs/zfs/zfs.c +@@ -141,7 +141,10 @@ ZAP_LEAF_NUMCHUNKS (int bs) + static inline zap_leaf_chunk_t * + ZAP_LEAF_CHUNK (zap_leaf_phys_t *l, int bs, int idx) + { +- return &((zap_leaf_chunk_t *) (l->l_entries ++ grub_properly_aligned_t *l_entries; ++ ++ l_entries = (grub_properly_aligned_t *) ALIGN_UP((grub_addr_t)l->l_hash, sizeof (grub_properly_aligned_t)); ++ return &((zap_leaf_chunk_t *) (l_entries + + (ZAP_LEAF_HASH_NUMENTRIES(bs) * 2) + / sizeof (grub_properly_aligned_t)))[idx]; + } +diff --git a/include/grub/zfs/zap_leaf.h b/include/grub/zfs/zap_leaf.h +index 95c67dcba..11447c166 100644 +--- a/include/grub/zfs/zap_leaf.h ++++ b/include/grub/zfs/zap_leaf.h +@@ -70,7 +70,6 @@ typedef struct zap_leaf_phys { + */ + + grub_uint16_t l_hash[0]; +- grub_properly_aligned_t l_entries[0]; + } zap_leaf_phys_t; + + typedef union zap_leaf_chunk { +-- +2.16.4 + diff --git a/grub2.changes b/grub2.changes index 73861e6..4305fc8 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Tue Mar 24 08:17:33 UTC 2020 - Michael Chang + +- Fix GCC 10 build fail (bsc#1158189) + * 0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch + * 0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch + ------------------------------------------------------------------- Fri Mar 20 10:36:54 UTC 2020 - Michael Chang diff --git a/grub2.spec b/grub2.spec index 48d30c3..c273e01 100644 --- a/grub2.spec +++ b/grub2.spec @@ -291,6 +291,9 @@ Patch511: grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch Patch601: risc-v-fix-computation-of-pc-relative-relocation-offset.patch Patch602: risc-v-add-clzdi2-symbol.patch Patch603: grub-install-define-default-platform-for-risc-v.patch +# Fix gcc-10 build fail +Patch610: 0001-mdraid1x_linux-Fix-gcc10-error-Werror-array-bounds.patch +Patch611: 0002-zfs-Fix-gcc10-error-Werror-zero-length-bounds.patch # bsc#1166409 - Grub netbooting does not search for grub.cfg files with mac # address or ip address in filename Patch700: 0001-normal-Move-common-datetime-functions-out-of-the-nor.patch @@ -594,6 +597,8 @@ swap partition while in resuming %patch601 -p1 %patch602 -p1 %patch603 -p1 +%patch610 -p1 +%patch611 -p1 %patch700 -p1 %patch701 -p1 %patch702 -p1