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