| From b98ba8921010d03f46704a476c69861515deb1ca Mon Sep 17 00:00:00 2001 |
| From: Peter Jones <pjones@redhat.com> |
| Date: Mon, 7 Jan 2019 10:30:59 -0500 |
| Subject: [PATCH] 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> |
| [james.hilliard1@gmail.com: backport from upstream commit |
| b98ba8921010d03f46704a476c69861515deb1ca] |
| Signed-off-by: James Hilliard <james.hilliard1@gmail.com> |
| --- |
| src/dp.h | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/src/dp.h b/src/dp.h |
| index aa4e390..20cb608 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.20.1 |
| |