Change the read_number function to use void* type as its first argument to silence the warning. The pointer is later type casted to grub_uint16_t* and use grub_get_unaligned16 for safely deferencing it for the value.
The solved gcc9 error like this. [ 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> --- grub-core/fs/cpio.c | 5 +++-- grub-core/fs/cpio_be.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/grub-core/fs/cpio.c b/grub-core/fs/cpio.c index dab5f9898..a1aa66689 100644 --- a/grub-core/fs/cpio.c +++ b/grub-core/fs/cpio.c @@ -38,11 +38,12 @@ struct head } GRUB_PACKED; static inline unsigned long long -read_number (const grub_uint16_t *arr, grub_size_t size) +read_number (const void *arr, grub_size_t size) { long long ret = 0; + const grub_uint16_t *p = (const grub_uint16_t *)arr; while (size--) - ret = (ret << 16) | grub_le_to_cpu16 (*arr++); + ret = (ret << 16) | grub_le_to_cpu16 (grub_get_unaligned16 (p++)); return ret; } diff --git a/grub-core/fs/cpio_be.c b/grub-core/fs/cpio_be.c index 846548892..9460d0ec1 100644 --- a/grub-core/fs/cpio_be.c +++ b/grub-core/fs/cpio_be.c @@ -38,11 +38,12 @@ struct head } GRUB_PACKED; static inline unsigned long long -read_number (const grub_uint16_t *arr, grub_size_t size) +read_number (const void *arr, grub_size_t size) { long long ret = 0; + const grub_uint16_t *p = (const grub_uint16_t *)arr; while (size--) - ret = (ret << 16) | grub_be_to_cpu16 (*arr++); + ret = (ret << 16) | grub_be_to_cpu16 (grub_get_unaligned16 (p++)); return ret; } -- 2.16.4 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel