* [PATCH 1/18] netfilter: ipt_REJECT Target nonlinear fixes
@ 2005-01-05 3:05 Rusty Russell
2005-02-16 15:21 ` Missing "ip6t_REJECT.h" Sven Anders
0 siblings, 1 reply; 2+ messages in thread
From: Rusty Russell @ 2005-01-05 3:05 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Harald Welte, Netfilter development mailing list
[ Dave is away, but I want these to get a reasonable amount of testing
before 2.6.11, so sent straight to Linus ]
Name: ipt_REJECT Target nonlinear fixes
Status: Tested under valgrind
Signed-off-by: Rusty Russell
nfsim now generates non-linear packets: when run under valgrind it
finds linear assumptions very nicely. This is the second thing I
tried, and it found a real bug.
In this case, checking the UDP checksum is correct, but overkill, and
like the ICMP header handling, does not handle non-linear packets. Remove UDP
checksum, fix ICMP error.
Index: linux-2.6.10-bk1-Netfilter/net/ipv4/netfilter/ipt_REJECT.c
===================================================================
--- linux-2.6.10-bk1-Netfilter.orig/net/ipv4/netfilter/ipt_REJECT.c 2005-01-04 14:55:59.721943664 +1100
+++ linux-2.6.10-bk1-Netfilter/net/ipv4/netfilter/ipt_REJECT.c 2005-01-04 14:56:44.538130568 +1100
@@ -223,7 +223,6 @@
static void send_unreach(struct sk_buff *skb_in, int code)
{
struct iphdr *iph;
- struct udphdr *udph;
struct icmphdr *icmph;
struct sk_buff *nskb;
u32 saddr;
@@ -257,26 +256,13 @@
if (skb_in->len < skb_in->nh.iph->ihl*4 + 8)
return;
- /* if UDP checksum is set, verify it's correct */
- if (iph->protocol == IPPROTO_UDP
- && skb_in->tail-(u8*)iph >= sizeof(struct udphdr)) {
- int datalen = skb_in->len - (iph->ihl<<2);
- udph = (struct udphdr *)((char *)iph + (iph->ihl<<2));
- if (udph->check
- && csum_tcpudp_magic(iph->saddr, iph->daddr,
- datalen, IPPROTO_UDP,
- csum_partial((char *)udph, datalen,
- 0)) != 0)
- return;
- }
-
/* If we send an ICMP error to an ICMP error a mess would result.. */
- if (iph->protocol == IPPROTO_ICMP
- && skb_in->tail-(u8*)iph >= sizeof(struct icmphdr)) {
- icmph = (struct icmphdr *)((char *)iph + (iph->ihl<<2));
+ if (iph->protocol == IPPROTO_ICMP) {
+ struct icmphdr ihdr;
- if (skb_copy_bits(skb_in, skb_in->nh.iph->ihl*4,
- icmph, sizeof(*icmph)) < 0)
+ icmph = skb_header_pointer(skb_in, skb_in->nh.iph->ihl*4,
+ sizeof(ihdr), &ihdr);
+ if (!icmph)
return;
/* Between echo-reply (0) and timestamp (13),
--
A bad analogy is like a leaky screwdriver -- Richard Braakman
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2005-02-16 15:21 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-05 3:05 [PATCH 1/18] netfilter: ipt_REJECT Target nonlinear fixes Rusty Russell
2005-02-16 15:21 ` Missing "ip6t_REJECT.h" Sven Anders
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.