Exacly, but I do not think skb_pull is very happy if you try to pull
more data than there is.. hmm.. after reading the source I realize that
this is not exacly the case but almost. skb_pull can be used with any
size, regardless of the amount actually received, BUT if a too large
length is used then it returns NULL and does nothing.
One other similar bug:
The added if statement might look outside the received packet if an
"empty" WCCP packet is received.
Also, I am a bit unsure if the use of skb->h and skb->nh is correct. I
think some of these are supposed to be skb->data. The skb_pull "magic"
(skb->h.raw - skb->data) does not make much sense given that skb_pull
increases skb->data with the given offset.. but potential problem is in
the original ip_wccp.c as well.. unless ofcourse skb->data does not
point to the GRE header when this is called..
I think it should read something like this:
if (skb->len < WCCP_GRE_LEN)
goto drop;
gre_hdr = (unsigned long *)skb->data;
if (*gre_hdr != htonl(WCCP_PROTOCOL_TYPE))
goto drop;
/* is MAC header assignment really correct at this layer? It
* feels quite malplaced... and looks odd... */
skb->mac.raw = skb->nh.raw;
/* Decapsulate the packet.
* WCCP2 puts an extra 4 octets into the header, but uses the
* same encapsulation type; if it looks as if the first octet
* of the packet isn't the beginning of an IPv4 header, assume
* it's WCCP2.
*/
if ((skb->len >= WCCP_GRE_LEN + WCCP2_GRE_EXTRA) &&
((*(skb->data+WCCP_GRE_LEN) & 0xF0 )!= 0x40)) {
/* WCCP2 */
skb->nh.raw = skb_pull(skb, WCCP_GRE_LEN + WCCP2_GRE_EXTRA);
} else {
/* WCCP1 */
skb->nh.raw = skb_pull(skb, WCCP_GRE_LEN);
}
if (!skb->nh.raw || skb->len <= 0)
goto drop;
memset(....
The important changes besides the ->nh/h/data changes is
1. Added length check to make sure there is a WCCP GRE header
2. Added a length check before looking for "WCCP2 magic"
3. Verify the result of skb_pull
Dropping packets you do not understand should not be a harm, but I am
not 100% sure the method used here is fully correct.
Hmm... need to read a bit about Linux kernel network programming I
think. Too many loose ends on skb processing here...
/Henrik
Joe Cooper wrote:
>
> Oh, yeah... As for the negative size possibility. Maybe I'm misreading
> it, but aren't they being dropped if there is a size problem (the two
> 'goto drop' bits)?
>
> Is there harm in dropping them (as has always been done in the module)?
> I certainly don't have the knowledge to argue one way or the other. I
> know just enough to figure out what the code is doing...not enough to
> know what it /should/ do.
>
> Thanks again for your input.
>
> Henrik Nordstrom wrote:
>
> > I am not yet familar with how Linux skb processing, but:
> >
> > One thing I notice is that you do not verify the size of the GRE packets
> > before trying to grab the encapsulated one, so if the router sends you a
> > bad WCCP packet (no encapsulated packet) then oops a negative packet
> > size... Bbad WCCP packets has been seen from certain IOS versions in
> > certain path configurations.
> >
> > and why is the module cleanup code removed?
> >
> > /Henrik
> >
> > Joe Cooper wrote:
> >
> >> Hi folks,
> >>
> >> We've got WCCP v2 working with Squid, thanks to some fast coding by
> >> Kevin Wormington.
> >>
> >> Would someone (hopefully with more Linux kernel hacking knowledge than
> >> I) take a look at this ip_wccp.c module:
> >>
> >> http://www.swelltech.com/pengies/joe/patches/ip_wccp.c
> >>
> >> It's only a couple of lines bigger than the original ip_wccp.c for v1 of
> >> WCCP, where it checks for the extra 4 octets of the v2 GRE header and
> >> then skips them for the decapsulation...but something is causing an oops
> >> on our test box. We're not real sure exactly what is going on, but this
> >> seems as likely a candidate as any, since the box doesn't crash until it
> >> starts seeing WCCP traffic. Unfortunately...because Kevin's router only
> >> has WCCP v2 and my router only has v1, we can't do any cross-testing.
> >> And the Squid in testing has not yet been made both v2 and v1 aware (it
> >> can currently do v2 just fine...but v1 is broken, I'll be fixing that
> >> over the next few days).
> >>
> >> I'd welcome some comments from you guys, if you see anything problematic
> >> in the module...
> >> --
> >> Joe Cooper <joe@swelltech.com>
> >> Affordable Web Caching Proxy Appliances
> >> http://www.swelltech.com
>
> --
>
> --
> Joe Cooper <joe@swelltech.com>
> Affordable Web Caching Proxy Appliances
> http://www.swelltech.com
Received on Sat Mar 17 2001 - 03:03:12 MST
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:13:38 MST