Skip to content

Commit 27fe4f6

Browse files
committed
Merge: netfilter: stable backport for 10.1 phase 2
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1096 JIRA: https://issues.redhat.com/browse/RHEL-96603 * 932b32f netfilter: socket: Lookup orig tuple for IPv6 SNAT * aa04c6f netfilter: bridge: Move specific fragmented packet to slow_path instead of dropping it Signed-off-by: CKI Backport Bot <cki-ci-bot+cki-gitlab-backport-bot@redhat.com> --- <small>Created 2025-06-24 09:36 UTC by backporter - [KWF FAQ](https://red.ht/kernel_workflow_doc) - [Slack #team-kernel-workflow](https://redhat-internal.slack.com/archives/C04LRUPMJQ5) - [Source](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/webhook/utils/backporter.py) - [Documentation](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/docs/README.backporter.md) - [Report an issue](https://issues.redhat.com/secure/CreateIssueDetails!init.jspa?pid=12334433&issuetype=1&priority=4&summary=backporter+webhook+issue&components=kernel-workflow+/+backporter)</small> Approved-by: Xin Long <lxin@redhat.com> Approved-by: Phil Sutter <psutter@redhat.com> Merged-by: Julio Faracco <jfaracco@redhat.com>
2 parents 44a83b0 + 8ea66d1 commit 27fe4f6

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

net/bridge/netfilter/nf_conntrack_bridge.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@ static int nf_br_ip_fragment(struct net *net, struct sock *sk,
6060
struct ip_fraglist_iter iter;
6161
struct sk_buff *frag;
6262

63-
if (first_len - hlen > mtu ||
64-
skb_headroom(skb) < ll_rs)
63+
if (first_len - hlen > mtu)
6564
goto blackhole;
6665

67-
if (skb_cloned(skb))
66+
if (skb_cloned(skb) ||
67+
skb_headroom(skb) < ll_rs)
6868
goto slow_path;
6969

7070
skb_walk_frags(skb, frag) {
71-
if (frag->len > mtu ||
72-
skb_headroom(frag) < hlen + ll_rs)
71+
if (frag->len > mtu)
7372
goto blackhole;
7473

75-
if (skb_shared(frag))
74+
if (skb_shared(frag) ||
75+
skb_headroom(frag) < hlen + ll_rs)
7676
goto slow_path;
7777
}
7878

net/ipv6/netfilter.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,20 +164,20 @@ int br_ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
164164
struct ip6_fraglist_iter iter;
165165
struct sk_buff *frag2;
166166

167-
if (first_len - hlen > mtu ||
168-
skb_headroom(skb) < (hroom + sizeof(struct frag_hdr)))
167+
if (first_len - hlen > mtu)
169168
goto blackhole;
170169

171-
if (skb_cloned(skb))
170+
if (skb_cloned(skb) ||
171+
skb_headroom(skb) < (hroom + sizeof(struct frag_hdr)))
172172
goto slow_path;
173173

174174
skb_walk_frags(skb, frag2) {
175-
if (frag2->len > mtu ||
176-
skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr)))
175+
if (frag2->len > mtu)
177176
goto blackhole;
178177

179178
/* Partially cloned skb? */
180-
if (skb_shared(frag2))
179+
if (skb_shared(frag2) ||
180+
skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr)))
181181
goto slow_path;
182182
}
183183

net/ipv6/netfilter/nf_socket_ipv6.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ struct sock *nf_sk_lookup_slow_v6(struct net *net, const struct sk_buff *skb,
103103
struct sk_buff *data_skb = NULL;
104104
int doff = 0;
105105
int thoff = 0, tproto;
106+
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
107+
enum ip_conntrack_info ctinfo;
108+
struct nf_conn const *ct;
109+
#endif
106110

107111
tproto = ipv6_find_hdr(skb, &thoff, -1, NULL, NULL);
108112
if (tproto < 0) {
@@ -136,6 +140,25 @@ struct sock *nf_sk_lookup_slow_v6(struct net *net, const struct sk_buff *skb,
136140
return NULL;
137141
}
138142

143+
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
144+
/* Do the lookup with the original socket address in
145+
* case this is a reply packet of an established
146+
* SNAT-ted connection.
147+
*/
148+
ct = nf_ct_get(skb, &ctinfo);
149+
if (ct &&
150+
((tproto != IPPROTO_ICMPV6 &&
151+
ctinfo == IP_CT_ESTABLISHED_REPLY) ||
152+
(tproto == IPPROTO_ICMPV6 &&
153+
ctinfo == IP_CT_RELATED_REPLY)) &&
154+
(ct->status & IPS_SRC_NAT_DONE)) {
155+
daddr = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.in6;
156+
dport = (tproto == IPPROTO_TCP) ?
157+
ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.tcp.port :
158+
ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port;
159+
}
160+
#endif
161+
139162
return nf_socket_get_sock_v6(net, data_skb, doff, tproto, saddr, daddr,
140163
sport, dport, indev);
141164
}

0 commit comments

Comments
 (0)