You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
netfilter: reject: don't send icmp error if csum is invalid
tcp resets are never emitted if the packet that triggers the reject/reset has an invalid checksum. For icmp error responses there was no such check. It allows to distinguish icmp response generated via iptables -I INPUT -p udp --dport 42 -j REJECT and those emitted by network stack (won't respond if csum is invalid, REJECT does). Arguably its possible to avoid this by using conntrack and only using REJECT with -m conntrack NEW/RELATED. However, this doesn't work when connection tracking is not in use or when using nf_conntrack_checksum=0. Furthermore, sending errors in response to invalid csums doesn't make much sense so just add similar test as in nf_send_reset. Validate csum if needed and only send the response if it is ok. Reference: http://bugzilla.redhat.com/show_bug.cgi?id=1169829 Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
committed by
Pablo Neira Ayuso
parent
b898441f4e
commit
ee586bbc28
@@ -5,11 +5,7 @@
|
||||
#include <net/ip.h>
|
||||
#include <net/icmp.h>
|
||||
|
||||
static inline void nf_send_unreach(struct sk_buff *skb_in, int code)
|
||||
{
|
||||
icmp_send(skb_in, ICMP_DEST_UNREACH, code, 0);
|
||||
}
|
||||
|
||||
void nf_send_unreach(struct sk_buff *skb_in, int code, int hook);
|
||||
void nf_send_reset(struct sk_buff *oldskb, int hook);
|
||||
|
||||
const struct tcphdr *nf_reject_ip_tcphdr_get(struct sk_buff *oldskb,
|
||||
|
||||
@@ -3,15 +3,8 @@
|
||||
|
||||
#include <linux/icmpv6.h>
|
||||
|
||||
static inline void
|
||||
nf_send_unreach6(struct net *net, struct sk_buff *skb_in, unsigned char code,
|
||||
unsigned int hooknum)
|
||||
{
|
||||
if (hooknum == NF_INET_LOCAL_OUT && skb_in->dev == NULL)
|
||||
skb_in->dev = net->loopback_dev;
|
||||
|
||||
icmpv6_send(skb_in, ICMPV6_DEST_UNREACH, code, 0);
|
||||
}
|
||||
void nf_send_unreach6(struct net *net, struct sk_buff *skb_in, unsigned char code,
|
||||
unsigned int hooknum);
|
||||
|
||||
void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user