60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
From 945a87340240b70b3c579773c9481ca913d95a92 Mon Sep 17 00:00:00 2001
|
|
From: Peter Jones <pjones@redhat.com>
|
|
Date: Mon, 7 Jan 2019 10:30:59 -0500
|
|
Subject: [PATCH 02/63] dp.h: make format_guid() handle misaligned guid
|
|
pointers safely.
|
|
|
|
GCC 9 adds -Werror=address-of-packed-member, which causes us to see the
|
|
build error reported at
|
|
https://bugzilla.opensuse.org/show_bug.cgi?id=1120862 .
|
|
|
|
That bug report shows us the following:
|
|
|
|
In file included from dp.c:26:
|
|
dp.h: In function 'format_vendor_helper':
|
|
dp.h:120:37: error: taking address of packed member of 'struct <anonymous>' may result in an unaligned pointer value [-Werror=address-of-packed-member]
|
|
120 | format_guid(buf, size, off, label, &dp->hw_vendor.vendor_guid);
|
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
dp.h:74:25: note: in definition of macro 'format_guid'
|
|
74 | _rc = efi_guid_to_str(guid, &_guidstr); \
|
|
| ^~~~
|
|
cc1: all warnings being treated as errors
|
|
|
|
This patch makes format_guid() use a local variable as a bounce buffer
|
|
in the case that the guid we're passed is aligned as chaotic neutral.
|
|
|
|
Note that this only fixes this instance and there may be others that bz
|
|
didn't show because it exited too soon, and I don't have a gcc 9 build
|
|
in front of me right now.
|
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
---
|
|
src/dp.h | 11 +++++++++--
|
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/dp.h b/src/dp.h
|
|
index aa4e3902992..20cb608d05f 100644
|
|
--- a/src/dp.h
|
|
+++ b/src/dp.h
|
|
@@ -70,8 +70,15 @@
|
|
#define format_guid(buf, size, off, dp_type, guid) ({ \
|
|
int _rc; \
|
|
char *_guidstr = NULL; \
|
|
- \
|
|
- _rc = efi_guid_to_str(guid, &_guidstr); \
|
|
+ efi_guid_t _guid; \
|
|
+ const efi_guid_t * const _guid_p = \
|
|
+ likely(__alignof__(guid) == sizeof(guid)) \
|
|
+ ? guid \
|
|
+ : &_guid; \
|
|
+ \
|
|
+ if (unlikely(__alignof__(guid) == sizeof(guid))) \
|
|
+ memmove(&_guid, guid, sizeof(_guid)); \
|
|
+ _rc = efi_guid_to_str(_guid_p, &_guidstr); \
|
|
if (_rc < 0) { \
|
|
efi_error("could not build %s GUID DP string", \
|
|
dp_type); \
|
|
--
|
|
2.26.2
|
|
|