aboutsummaryrefslogtreecommitdiffstats
path: root/meta-networking/recipes-connectivity/dibbler/dibbler/0001-Define-alignof-using-_Alignof-when-using-C11-or-newe.patch
blob: d48d7265d401d2a573c9aa3f3080a72c6373b158 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 9e9d94566d39eef3e4606f806aa418bf5534fab9 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Sun, 15 Jan 2023 22:04:31 -0800
Subject: [PATCH 1/2] Define alignof using _Alignof when using C11 or newer

WG14 N2350 made very clear that it is an UB having type definitions
within "offsetof" [1]. This patch enhances the implementation of macro
alignof to use builtin "_Alignof" to avoid undefined behavior on
when using std=c11 or newer

clang 16+ has started to flag this [2]

Fixes build when using -std >= gnu11 and using clang16+

Older compilers gcc < 4.9 or clang < 8 has buggy _Alignof even though it
may support C11, exclude those compilers too

[1] https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2350.htm
[2] https://reviews.llvm.org/D133574

Upstream-Status: Pending

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 Misc/md5-coreutils.c | 12 +++++++++++-
 Misc/sha1.c          | 12 +++++++++++-
 Misc/sha256.c        | 12 +++++++++++-
 Misc/sha512.c        | 12 +++++++++++-
 4 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/Misc/md5-coreutils.c b/Misc/md5-coreutils.c
index d6503e02..2ffb6050 100644
--- a/Misc/md5-coreutils.c
+++ b/Misc/md5-coreutils.c
@@ -154,7 +154,17 @@ md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
   if (len >= 64)
     {
 #if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
+/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+   clang versions < 8.0.0 have the same bug.  */
+# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+        || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+     && !defined __clang__) \
+        || (defined __clang__ && __clang_major__ < 8))
+#    define alignof(type) offsetof (struct { char c; type x; }, x)
+# else
+#    define alignof(type) _Alignof(type)
+# endif
 # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
       if (UNALIGNED_P (buffer))
 	while (len > 64)
diff --git a/Misc/sha1.c b/Misc/sha1.c
index 18ceb845..a170efe3 100644
--- a/Misc/sha1.c
+++ b/Misc/sha1.c
@@ -149,7 +149,17 @@ sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx)
   if (len >= 64)
     {
 #if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
+/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+   clang versions < 8.0.0 have the same bug.  */
+# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+        || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+     && !defined __clang__) \
+        || (defined __clang__ && __clang_major__ < 8))
+#    define alignof(type) offsetof (struct { char c; type x; }, x)
+# else
+#    define alignof(type) _Alignof(type)
+# endif
 # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
       if (UNALIGNED_P (buffer))
 	while (len > 64)
diff --git a/Misc/sha256.c b/Misc/sha256.c
index 68292326..da59e81d 100644
--- a/Misc/sha256.c
+++ b/Misc/sha256.c
@@ -372,7 +372,17 @@ sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
   if (len >= 64)
     {
 #if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
+/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+   clang versions < 8.0.0 have the same bug.  */
+# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+        || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+     && !defined __clang__) \
+        || (defined __clang__ && __clang_major__ < 8))
+#    define alignof(type) offsetof (struct { char c; type x; }, x)
+# else
+#    define alignof(type) _Alignof(type)
+# endif
 # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
       if (UNALIGNED_P (buffer))
         while (len > 64)
diff --git a/Misc/sha512.c b/Misc/sha512.c
index db86c659..38e162fc 100644
--- a/Misc/sha512.c
+++ b/Misc/sha512.c
@@ -190,7 +190,17 @@ sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
   if (len >= 128)
     {
 #if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
+/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+   clang versions < 8.0.0 have the same bug.  */
+# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+        || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+     && !defined __clang__) \
+        || (defined __clang__ && __clang_major__ < 8))
+#    define alignof(type) offsetof (struct { char c; type x; }, x)
+# else
+#    define alignof(type) _Alignof(type)
+# endif
 # define UNALIGNED_P(p) (((size_t) p) % alignof (uint64_t) != 0)
       if (UNALIGNED_P (buffer))
 	while (len > 128)
-- 
2.39.0