aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2026-08-26 05:27:28 +0000
committerCy Schubert <cy@FreeBSD.org>2026-11-09 22:20:49 +0000
commit72cc9e3766f4222fa7fc462bc669dcf668e8b334 (patch)
tree94731675b4263063dc5579e2cfbc2ed01a03e577
parent425e4c102f8aedfc7c439bb01d648aabac798888 (diff)
ipfilter: Only recalculate the UDP header when we have one
When ipf_nat_out processes NAT_DIVERTOUT (ipnat rdr statements) it also fixes the checksum in the UDP header. Test for a UDP header before adjusting its length. While we are here, the length in the UDP header must be converted from network byte order to host byte order. Add the missing ntohs(). PR: 296944 MFC after: 3 days
-rw-r--r--sys/netpfil/ipfilter/netinet/ip_nat.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/netpfil/ipfilter/netinet/ip_nat.c b/sys/netpfil/ipfilter/netinet/ip_nat.c
index b7f5eb94b1dd..c8125c10e3f0 100644
--- a/sys/netpfil/ipfilter/netinet/ip_nat.c
+++ b/sys/netpfil/ipfilter/netinet/ip_nat.c
@@ -5154,9 +5154,12 @@ ipf_nat_out(fr_info_t *fin, nat_t *nat, int natadd, u_32_t nflags)
s2 += ntohs(ip->ip_len);
CALC_SUMD(s1, s2, sumd);
- uh = (udphdr_t *)(ip + 1);
- uh->uh_ulen += fin->fin_plen;
- uh->uh_ulen = htons(uh->uh_ulen);
+ if (ip->ip_p == IPPROTO_UDP) {
+ uh = (udphdr_t *)(ip + 1);
+ uh->uh_ulen = ntohs(uh->uh_ulen);
+ uh->uh_ulen += fin->fin_plen;
+ uh->uh_ulen = htons(uh->uh_ulen);
+ }
#if !defined(_KERNEL) || SOLARIS || \
defined(BRIDGE_IPF) || defined(__FreeBSD__)
ipf_fix_outcksum(0, &ip->ip_sum, sumd, 0);