Skip to content

Commit 2486138

Browse files
Eric Biggersanakryiko
authored andcommitted
libbpf: Fix undefined behavior in {get,put}_unaligned_be32()
These violate aliasing rules and may be miscompiled unless -fno-strict-aliasing is used. Replace them with the standard memcpy() solution. Note that compilers know how to optimize this properly. Fixes: 4a1c9e5 ("libbpf: remove linux/unaligned.h dependency for libbpf_sha256()") Signed-off-by: Eric Biggers <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent de73422 commit 2486138

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

tools/lib/bpf/libbpf_utils.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,16 +148,20 @@ const char *libbpf_errstr(int err)
148148
}
149149
}
150150

151-
#pragma GCC diagnostic push
152-
#pragma GCC diagnostic ignored "-Wpacked"
153-
#pragma GCC diagnostic ignored "-Wattributes"
154-
struct __packed_u32 { __u32 __val; } __attribute__((packed));
155-
#pragma GCC diagnostic pop
156-
157-
#define get_unaligned_be32(p) be32_to_cpu((((struct __packed_u32 *)(p))->__val))
158-
#define put_unaligned_be32(v, p) do { \
159-
((struct __packed_u32 *)(p))->__val = cpu_to_be32(v); \
160-
} while (0)
151+
static inline __u32 get_unaligned_be32(const void *p)
152+
{
153+
__be32 val;
154+
155+
memcpy(&val, p, sizeof(val));
156+
return be32_to_cpu(val);
157+
}
158+
159+
static inline void put_unaligned_be32(__u32 val, void *p)
160+
{
161+
__be32 be_val = cpu_to_be32(val);
162+
163+
memcpy(p, &be_val, sizeof(be_val));
164+
}
161165

162166
#define SHA256_BLOCK_LENGTH 64
163167
#define Ch(x, y, z) (((x) & (y)) ^ (~(x) & (z)))

0 commit comments

Comments
 (0)