Cast pointer to uintptr_t to avoid alignment warnings.

Both struct ip and struct udphdr both have an aligment of 2, but the
cast from struct ip to a uint32_t pointer confused GCC 9 into raising
the required alignment to 4 and then raising a
-Waddress-of-packed-member error when casting to struct udphdr.

Reviewed by:	imp
Differential Revision:	https://reviews.freebsd.org/D31941
This commit is contained in:
John Baldwin 2022-02-11 16:04:52 -08:00
parent cd0525f615
commit dba02df30d

View File

@ -109,9 +109,9 @@ ip_packet(u_char protocol, size_t len)
struct udphdr *
set_udp(struct ip *p, u_short sport, u_short dport) {
uint32_t *up = (void *)p;
struct udphdr *u = (void *)&(up[p->ip_hl]);
int payload = ntohs(p->ip_len) - 4*p->ip_hl;
int hlen = p->ip_hl << 2;
struct udphdr *u = (struct udphdr *)((uintptr_t)p + hlen);
int payload = ntohs(p->ip_len) - hlen;
REQUIRE(payload >= (int)sizeof(*u));
p->ip_p = IPPROTO_UDP;