1*4882a593SmuzhiyunFrom b98ba8921010d03f46704a476c69861515deb1ca Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Peter Jones <pjones@redhat.com> 3*4882a593SmuzhiyunDate: Mon, 7 Jan 2019 10:30:59 -0500 4*4882a593SmuzhiyunSubject: [PATCH] dp.h: make format_guid() handle misaligned guid pointers 5*4882a593Smuzhiyun safely. 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunGCC 9 adds -Werror=address-of-packed-member, which causes us to see the 8*4882a593Smuzhiyunbuild error reported at 9*4882a593Smuzhiyun https://bugzilla.opensuse.org/show_bug.cgi?id=1120862 . 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunThat bug report shows us the following: 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunIn file included from dp.c:26: 14*4882a593Smuzhiyundp.h: In function 'format_vendor_helper': 15*4882a593Smuzhiyundp.h:120:37: error: taking address of packed member of 'struct <anonymous>' may result in an unaligned pointer value [-Werror=address-of-packed-member] 16*4882a593Smuzhiyun 120 | format_guid(buf, size, off, label, &dp->hw_vendor.vendor_guid); 17*4882a593Smuzhiyun | ^~~~~~~~~~~~~~~~~~~~~~~~~~ 18*4882a593Smuzhiyundp.h:74:25: note: in definition of macro 'format_guid' 19*4882a593Smuzhiyun 74 | _rc = efi_guid_to_str(guid, &_guidstr); \ 20*4882a593Smuzhiyun | ^~~~ 21*4882a593Smuzhiyuncc1: all warnings being treated as errors 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunThis patch makes format_guid() use a local variable as a bounce buffer 24*4882a593Smuzhiyunin the case that the guid we're passed is aligned as chaotic neutral. 25*4882a593Smuzhiyun 26*4882a593SmuzhiyunNote that this only fixes this instance and there may be others that bz 27*4882a593Smuzhiyundidn't show because it exited too soon, and I don't have a gcc 9 build 28*4882a593Smuzhiyunin front of me right now. 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunSigned-off-by: Peter Jones <pjones@redhat.com> 31*4882a593Smuzhiyun[james.hilliard1@gmail.com: backport from upstream commit 32*4882a593Smuzhiyunb98ba8921010d03f46704a476c69861515deb1ca] 33*4882a593SmuzhiyunSigned-off-by: James Hilliard <james.hilliard1@gmail.com> 34*4882a593Smuzhiyun--- 35*4882a593Smuzhiyun src/dp.h | 11 +++++++++-- 36*4882a593Smuzhiyun 1 file changed, 9 insertions(+), 2 deletions(-) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyundiff --git a/src/dp.h b/src/dp.h 39*4882a593Smuzhiyunindex aa4e390..20cb608 100644 40*4882a593Smuzhiyun--- a/src/dp.h 41*4882a593Smuzhiyun+++ b/src/dp.h 42*4882a593Smuzhiyun@@ -70,8 +70,15 @@ 43*4882a593Smuzhiyun #define format_guid(buf, size, off, dp_type, guid) ({ \ 44*4882a593Smuzhiyun int _rc; \ 45*4882a593Smuzhiyun char *_guidstr = NULL; \ 46*4882a593Smuzhiyun- \ 47*4882a593Smuzhiyun- _rc = efi_guid_to_str(guid, &_guidstr); \ 48*4882a593Smuzhiyun+ efi_guid_t _guid; \ 49*4882a593Smuzhiyun+ const efi_guid_t * const _guid_p = \ 50*4882a593Smuzhiyun+ likely(__alignof__(guid) == sizeof(guid)) \ 51*4882a593Smuzhiyun+ ? guid \ 52*4882a593Smuzhiyun+ : &_guid; \ 53*4882a593Smuzhiyun+ \ 54*4882a593Smuzhiyun+ if (unlikely(__alignof__(guid) == sizeof(guid))) \ 55*4882a593Smuzhiyun+ memmove(&_guid, guid, sizeof(_guid)); \ 56*4882a593Smuzhiyun+ _rc = efi_guid_to_str(_guid_p, &_guidstr); \ 57*4882a593Smuzhiyun if (_rc < 0) { \ 58*4882a593Smuzhiyun efi_error("could not build %s GUID DP string", \ 59*4882a593Smuzhiyun dp_type); \ 60*4882a593Smuzhiyun-- 61*4882a593Smuzhiyun2.20.1 62*4882a593Smuzhiyun 63