* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet [not found] <bug-42809-100@https.bugzilla.kernel.org/> @ 2012-02-22 17:20 ` Stephen Hemminger 2012-02-22 17:41 ` Niccolò Belli 0 siblings, 1 reply; 21+ messages in thread From: Stephen Hemminger @ 2012-02-22 17:20 UTC (permalink / raw) To: darkbasic; +Cc: bugzilla-daemon, netdev On Wed, 22 Feb 2012 10:24:19 GMT bugzilla-daemon@bugzilla.kernel.org wrote: > https://bugzilla.kernel.org/show_bug.cgi?id=42809 > > Summary: kernel panic when receiving an ipsec packet > Product: Networking > Version: 2.5 > Kernel Version: 2.6.32.54 > Platform: All > OS/Version: Linux > Tree: Mainline > Status: NEW > Severity: high > Priority: P1 > Component: IPV4 > AssignedTo: shemminger@linux-foundation.org > ReportedBy: darkbasic@linuxsystems.it > Regression: No > > > As soon as I receive an ipsec packet (NETKEY of course) I get a kernel panic. > Even magicsysrq keys do not work anymore. > > O.S. Debian Squeeze amd64. I tried both Strongswan and Openswan. > That is a really old kernel now. Could you try with later kernel? ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-22 17:20 ` [Bug 42809] New: kernel panic when receiving an ipsec packet Stephen Hemminger @ 2012-02-22 17:41 ` Niccolò Belli 2012-02-23 0:59 ` Niccolò Belli 0 siblings, 1 reply; 21+ messages in thread From: Niccolò Belli @ 2012-02-22 17:41 UTC (permalink / raw) To: Stephen Hemminger; +Cc: Linux Networking Developer Mailing List Thanks for CCing netdev, I was thinking about doing the same. Il 22/02/2012 18:20, Stephen Hemminger ha scritto: > That is a really old kernel now. Could you try with later kernel? I can (a few minutes during night) but I really need a fix for 2.6.32. This is a production server with dozens of Xen virtual machines and a heavily patched kernel (xen dom0, layer 7, imq, esfq, advanced routing etc). I did test a "vanilla" kernel last night (not really vanilla, but a clean official debian kernel) and I had the same problem. Thanks, Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-22 17:41 ` Niccolò Belli @ 2012-02-23 0:59 ` Niccolò Belli 2012-02-23 1:38 ` Eric Dumazet 0 siblings, 1 reply; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 0:59 UTC (permalink / raw) To: Stephen Hemminger Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, support, support, 660804 Hi, The bug is still present in latest 3.2.7 vanilla kernel. I wasted the whole day debugging that damn thing and I finally discovered the root cause. The problem is with my Traverse Solos multi-port ADSL2+ PCI card[1] (which has open source drivers included in the kernel) when using RFC 2684 routed. I have two adsl lines, the first one connected using RFC 2684 routed, the second one using PPPoA. If I create a vpn toward the PPPoA line it works flawlessly, while if I create a vpn toward the RFC 2684 routed line the whole system hangs in a kernel panic (with both 2.6.32.54 and 3.2.7). I really don't know how to fix it and I need to setup that damn ipsec vpn :( This is the bug on bugzilla.kernel.org: https://bugzilla.kernel.org/show_bug.cgi?id=42809 Niccolò [1]http://www.traverse.com.au/productview.php?product_id=116 ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 0:59 ` Niccolò Belli @ 2012-02-23 1:38 ` Eric Dumazet 2012-02-23 1:46 ` [openadsl-users] " Jason White ` (3 more replies) 0 siblings, 4 replies; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 1:38 UTC (permalink / raw) To: Niccolò Belli Cc: Stephen Hemminger, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, support, support, 660804 Le jeudi 23 février 2012 à 01:59 +0100, Niccolò Belli a écrit : > Hi, > The bug is still present in latest 3.2.7 vanilla kernel. I wasted the > whole day debugging that damn thing and I finally discovered the root cause. > The problem is with my Traverse Solos multi-port ADSL2+ PCI card[1] > (which has open source drivers included in the kernel) when using RFC > 2684 routed. > I have two adsl lines, the first one connected using RFC 2684 routed, > the second one using PPPoA. > If I create a vpn toward the PPPoA line it works flawlessly, while if I > create a vpn toward the RFC 2684 routed line the whole system hangs in a > kernel panic (with both 2.6.32.54 and 3.2.7). > I really don't know how to fix it and I need to setup that damn ipsec vpn :( > > This is the bug on bugzilla.kernel.org: > https://bugzilla.kernel.org/show_bug.cgi?id=42809 > > Niccolò > > > [1]http://www.traverse.com.au/productview.php?product_id=116 Which driver handles this Traverse Solos card ? ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [openadsl-users] [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 1:38 ` Eric Dumazet @ 2012-02-23 1:46 ` Jason White 2012-02-23 1:54 ` Eric Dumazet ` (2 subsequent siblings) 3 siblings, 0 replies; 21+ messages in thread From: Jason White @ 2012-02-23 1:46 UTC (permalink / raw) To: openadsl users list Cc: Niccolò Belli, 660804, openadsl-devel, Mailing List, support, Stephen Hemminger, support Eric Dumazet <eric.dumazet@gmail.com> wrote: > Which driver handles this Traverse Solos card ? solos_pci, which also requires the atm module. (I'm just trying to help here; I'm not affected by the bug.) ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 1:38 ` Eric Dumazet 2012-02-23 1:46 ` [openadsl-users] " Jason White @ 2012-02-23 1:54 ` Eric Dumazet 2012-02-23 13:48 ` Bug#660804: " chas williams - CONTRACTOR 2012-02-23 1:55 ` Niccolò Belli 2012-02-23 2:02 ` Niccolò Belli 3 siblings, 1 reply; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 1:54 UTC (permalink / raw) To: Niccolò Belli Cc: Stephen Hemminger, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, support, support, 660804 Le jeudi 23 février 2012 à 02:38 +0100, Eric Dumazet a écrit : > Which driver handles this Traverse Solos card ? If br2684_push() is used, it seems it lacks proper call to skb_reset_mac_header(skb) in paths where eth_type_trans() is not called. Later in xfrm4_mode_tunnel_input() we crash because we assume skb_mac_header() is valid. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Bug#660804: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 1:54 ` Eric Dumazet @ 2012-02-23 13:48 ` chas williams - CONTRACTOR 0 siblings, 0 replies; 21+ messages in thread From: chas williams - CONTRACTOR @ 2012-02-23 13:48 UTC (permalink / raw) To: Eric Dumazet Cc: Niccolò Belli, Stephen Hemminger, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, support, support, 660804 On Thu, 23 Feb 2012 02:54:39 +0100 Eric Dumazet <eric.dumazet@gmail.com> wrote: > Le jeudi 23 février 2012 à 02:38 +0100, Eric Dumazet a écrit : > > > Which driver handles this Traverse Solos card ? > > If br2684_push() is used, it seems it lacks proper call to > skb_reset_mac_header(skb) in paths where eth_type_trans() is not called. > > Later in xfrm4_mode_tunnel_input() we crash because we assume > skb_mac_header() is valid. when br2684_push() doesnt call eth_type_trans() the underlying packet doesnt have a mac address header -- just an llc header that says 'ip packet is next'. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 1:38 ` Eric Dumazet 2012-02-23 1:46 ` [openadsl-users] " Jason White 2012-02-23 1:54 ` Eric Dumazet @ 2012-02-23 1:55 ` Niccolò Belli 2012-02-23 2:02 ` Niccolò Belli 3 siblings, 0 replies; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 1:55 UTC (permalink / raw) To: Eric Dumazet Cc: Niccolò Belli, Stephen Hemminger, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, support, support, 660804 Il 23/02/2012 02:38, Eric Dumazet ha scritto: > Which driver handles this Traverse Solos card ? drivers/atm/solos-pci.c ~# lsmod | grep solos solos_pci 20009 2 atm 32378 7 pppoatm,br2684,solos_pci Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 1:38 ` Eric Dumazet ` (2 preceding siblings ...) 2012-02-23 1:55 ` Niccolò Belli @ 2012-02-23 2:02 ` Niccolò Belli 2012-02-23 2:06 ` Eric Dumazet 3 siblings, 1 reply; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 2:02 UTC (permalink / raw) Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel Il 23/02/2012 02:38, Eric Dumazet ha scritto: > Which driver handles this Traverse Solos card ? drivers/atm/solos-pci.c ~# lsmod | grep solos solos_pci 20009 2 atm 32378 7 pppoatm,br2684,solos_pci Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 2:02 ` Niccolò Belli @ 2012-02-23 2:06 ` Eric Dumazet 2012-02-23 2:12 ` Niccolò Belli 2012-02-23 13:45 ` Niccolò Belli 0 siblings, 2 replies; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 2:06 UTC (permalink / raw) To: Niccolò Belli Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel Le jeudi 23 février 2012 à 03:02 +0100, Niccolò Belli a écrit : > Il 23/02/2012 02:38, Eric Dumazet ha scritto: > > Which driver handles this Traverse Solos card ? > > drivers/atm/solos-pci.c > > ~# lsmod | grep solos > solos_pci 20009 2 > atm 32378 7 pppoatm,br2684,solos_pci > Thanks ! Please try following patch. diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 534972e..f170933 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c @@ -84,9 +84,11 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) if (!(x->props.flags & XFRM_STATE_NOECN)) ipip_ecn_decapsulate(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); + if (skb_mac_header_was_set(skb)) { + old_mac = skb_mac_header(skb); + skb_set_mac_header(skb, -skb->mac_len); + memmove(skb_mac_header(skb), old_mac, skb->mac_len); + } skb_reset_network_header(skb); err = 0; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 2:06 ` Eric Dumazet @ 2012-02-23 2:12 ` Niccolò Belli 2012-02-23 13:45 ` Niccolò Belli 1 sibling, 0 replies; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 2:12 UTC (permalink / raw) To: Eric Dumazet Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel Il 23/02/2012 03:06, Eric Dumazet ha scritto: > Please try following patch. > > diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c > index 534972e..f170933 100644 > --- a/net/ipv4/xfrm4_mode_tunnel.c > +++ b/net/ipv4/xfrm4_mode_tunnel.c > @@ -84,9 +84,11 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) > if (!(x->props.flags& XFRM_STATE_NOECN)) > ipip_ecn_decapsulate(skb); > > - old_mac = skb_mac_header(skb); > - skb_set_mac_header(skb, -skb->mac_len); > - memmove(skb_mac_header(skb), old_mac, skb->mac_len); > + if (skb_mac_header_was_set(skb)) { > + old_mac = skb_mac_header(skb); > + skb_set_mac_header(skb, -skb->mac_len); > + memmove(skb_mac_header(skb), old_mac, skb->mac_len); > + } > skb_reset_network_header(skb); > err = 0; Wow, thanks! It will try it as soon as possible tomorrow, going sleeping now :) Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 2:06 ` Eric Dumazet 2012-02-23 2:12 ` Niccolò Belli @ 2012-02-23 13:45 ` Niccolò Belli 2012-02-23 14:36 ` Eric Dumazet 1 sibling, 1 reply; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 13:45 UTC (permalink / raw) To: Eric Dumazet Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, 660804, support, support Il 23/02/2012 03:06, Eric Dumazet ha scritto: > Thanks ! > > Please try following patch. > > diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c > index 534972e..f170933 100644 > --- a/net/ipv4/xfrm4_mode_tunnel.c > +++ b/net/ipv4/xfrm4_mode_tunnel.c > @@ -84,9 +84,11 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) > if (!(x->props.flags& XFRM_STATE_NOECN)) > ipip_ecn_decapsulate(skb); > > - old_mac = skb_mac_header(skb); > - skb_set_mac_header(skb, -skb->mac_len); > - memmove(skb_mac_header(skb), old_mac, skb->mac_len); > + if (skb_mac_header_was_set(skb)) { > + old_mac = skb_mac_header(skb); > + skb_set_mac_header(skb, -skb->mac_len); > + memmove(skb_mac_header(skb), old_mac, skb->mac_len); > + } > skb_reset_network_header(skb); > err = 0; > Your patch does solve the problem, thanks! Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 13:45 ` Niccolò Belli @ 2012-02-23 14:36 ` Eric Dumazet 2012-02-23 14:39 ` Eric Dumazet 2012-02-23 20:11 ` David Miller 0 siblings, 2 replies; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 14:36 UTC (permalink / raw) To: Niccolò Belli, David Miller Cc: Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, 660804, support, support > Your patch does solve the problem, thanks! > Thanks for testing. Here is the official patch I submit for review then. [PATCH] ipsec: be careful of non existing mac headers Nicollo Belli reported ipsec crashes in case we handle a frame without mac header (atm in his case) Before copying mac header, better make sure it is present. Bugzilla reference: https://bugzilla.kernel.org/show_bug.cgi?id=42809 Reported-by: Niccolò Belli <darkbasic@linuxsystems.it> Tested-by: Niccolò Belli <darkbasic@linuxsystems.it> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> --- net/ipv4/xfrm4_mode_beet.c | 9 +++++---- net/ipv4/xfrm4_mode_tunnel.c | 10 ++++++---- net/ipv6/xfrm6_mode_beet.c | 9 +++++---- net/ipv6/xfrm6_mode_tunnel.c | 10 ++++++---- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index 6341818..d3451f6 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c @@ -111,10 +111,11 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) skb_push(skb, sizeof(*iph)); skb_reset_network_header(skb); - memmove(skb->data - skb->mac_len, skb_mac_header(skb), - skb->mac_len); - skb_set_mac_header(skb, -skb->mac_len); - + if (skb_mac_header_was_set(skb)) { + memmove(skb->data - skb->mac_len, skb_mac_header(skb), + skb->mac_len); + skb_set_mac_header(skb, -skb->mac_len); + } xfrm4_beet_make_header(skb); iph = ip_hdr(skb); diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 534972e..a646f30 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c @@ -66,7 +66,6 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) { - const unsigned char *old_mac; int err = -EINVAL; if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPIP) @@ -84,9 +83,12 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) if (!(x->props.flags & XFRM_STATE_NOECN)) ipip_ecn_decapsulate(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); + if (skb_mac_header_was_set(skb)) { + const unsigned char *old_mac = skb_mac_header(skb); + + skb_set_mac_header(skb, -skb->mac_len); + memmove(skb_mac_header(skb), old_mac, skb->mac_len); + } skb_reset_network_header(skb); err = 0; diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c index a81ce94..74c4b92 100644 --- a/net/ipv6/xfrm6_mode_beet.c +++ b/net/ipv6/xfrm6_mode_beet.c @@ -80,7 +80,6 @@ static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) { struct ipv6hdr *ip6h; - const unsigned char *old_mac; int size = sizeof(struct ipv6hdr); int err; @@ -91,10 +90,12 @@ static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) __skb_push(skb, size); skb_reset_network_header(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); + if (skb_mac_header_was_set(skb)) { + const unsigned char *old_mac = skb_mac_header(skb); + skb_set_mac_header(skb, -skb->mac_len); + memmove(skb_mac_header(skb), old_mac, skb->mac_len); + } xfrm6_beet_make_header(skb); ip6h = ipv6_hdr(skb); diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index 261e6e6..edb7091 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c @@ -63,7 +63,6 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) { int err = -EINVAL; - const unsigned char *old_mac; if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6) goto out; @@ -80,9 +79,12 @@ static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) if (!(x->props.flags & XFRM_STATE_NOECN)) ipip6_ecn_decapsulate(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); + if (skb_mac_header_was_set(skb)) { + const unsigned char *old_mac = skb_mac_header(skb); + + skb_set_mac_header(skb, -skb->mac_len); + memmove(skb_mac_header(skb), old_mac, skb->mac_len); + } skb_reset_network_header(skb); err = 0; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 14:36 ` Eric Dumazet @ 2012-02-23 14:39 ` Eric Dumazet 2012-02-23 19:08 ` Niccolò Belli 2012-02-23 20:11 ` David Miller 1 sibling, 1 reply; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 14:39 UTC (permalink / raw) To: Niccolò Belli Cc: David Miller, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, 660804, support, support Le jeudi 23 février 2012 à 15:36 +0100, Eric Dumazet a écrit : > [PATCH] ipsec: be careful of non existing mac headers > > Nicollo Belli reported ipsec crashes in case we handle a frame without > mac header (atm in his case) Oops sorry for your name being mangled in changelog, its Niccolò as correctly spelled in the "Reported-by" and "Tested-by" tags ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 14:39 ` Eric Dumazet @ 2012-02-23 19:08 ` Niccolò Belli 0 siblings, 0 replies; 21+ messages in thread From: Niccolò Belli @ 2012-02-23 19:08 UTC (permalink / raw) To: Eric Dumazet Cc: David Miller, Linux Networking Developer Mailing List, openadsl-users, openadsl-devel, 660804, support, support Il 23/02/2012 15:39, Eric Dumazet ha scritto: > Oops sorry for your name being mangled in changelog, its Niccolò as > correctly spelled in the "Reported-by" and "Tested-by" tags Don't worry and thanks for your help. I'm currently running the official patch you submitted for review. Niccolò ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 14:36 ` Eric Dumazet 2012-02-23 14:39 ` Eric Dumazet @ 2012-02-23 20:11 ` David Miller 2012-02-23 20:17 ` Eric Dumazet 1 sibling, 1 reply; 21+ messages in thread From: David Miller @ 2012-02-23 20:11 UTC (permalink / raw) To: eric.dumazet Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 23 Feb 2012 15:36:26 +0100 > [PATCH] ipsec: be careful of non existing mac headers > > Nicollo Belli reported ipsec crashes in case we handle a frame without > mac header (atm in his case) > > Before copying mac header, better make sure it is present. > > Bugzilla reference: https://bugzilla.kernel.org/show_bug.cgi?id=42809 > > Reported-by: Niccolò Belli <darkbasic@linuxsystems.it> > Tested-by: Niccolò Belli <darkbasic@linuxsystems.it> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Three instances of the same piece of code, maybe a helper function is appropriate at that point? :-) You might even get ambitious and add a big comment to that helper function explaining the situation. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 20:11 ` David Miller @ 2012-02-23 20:17 ` Eric Dumazet 2012-02-23 20:23 ` David Miller 0 siblings, 1 reply; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 20:17 UTC (permalink / raw) To: David Miller Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support Le jeudi 23 février 2012 à 15:11 -0500, David Miller a écrit : > Three instances of the same piece of code, maybe a helper function is > appropriate at that point? :-) You might even get ambitious and add a > big comment to that helper function explaining the situation. I did have this idea but refrained because this kind of things is harder to backport to stable kernels. I'll make a cleanup in net-next if you agree ? ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 20:17 ` Eric Dumazet @ 2012-02-23 20:23 ` David Miller 2012-02-23 20:28 ` Eric Dumazet 2012-02-23 20:55 ` [PATCH V2] ipsec: be careful of non existing mac headers Eric Dumazet 0 siblings, 2 replies; 21+ messages in thread From: David Miller @ 2012-02-23 20:23 UTC (permalink / raw) To: eric.dumazet Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 23 Feb 2012 21:17:23 +0100 > Le jeudi 23 février 2012 à 15:11 -0500, David Miller a écrit : >> Three instances of the same piece of code, maybe a helper function is >> appropriate at that point? :-) You might even get ambitious and add a >> big comment to that helper function explaining the situation. > > I did have this idea but refrained because this kind of things is harder > to backport to stable kernels. > > I'll make a cleanup in net-next if you agree ? I think the work to backport is equal whether you use a helper function or not. Heck, use an inline function so you don't have to worry about module exports or any details like that. Besides, I'm the one who likely has to backport this thing, so... :-) ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Bug 42809] New: kernel panic when receiving an ipsec packet 2012-02-23 20:23 ` David Miller @ 2012-02-23 20:28 ` Eric Dumazet 2012-02-23 20:55 ` [PATCH V2] ipsec: be careful of non existing mac headers Eric Dumazet 1 sibling, 0 replies; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 20:28 UTC (permalink / raw) To: David Miller Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support Le jeudi 23 février 2012 à 15:23 -0500, David Miller a écrit : > I think the work to backport is equal whether you use a helper function > or not. Heck, use an inline function so you don't have to worry about > module exports or any details like that. > > Besides, I'm the one who likely has to backport this thing, so... :-) Great, I'll send an updated version in a couple of minutes ;) ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH V2] ipsec: be careful of non existing mac headers 2012-02-23 20:23 ` David Miller 2012-02-23 20:28 ` Eric Dumazet @ 2012-02-23 20:55 ` Eric Dumazet 2012-02-23 21:53 ` David Miller 1 sibling, 1 reply; 21+ messages in thread From: Eric Dumazet @ 2012-02-23 20:55 UTC (permalink / raw) To: David Miller Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support Niccolo Belli reported ipsec crashes in case we handle a frame without mac header (atm in his case) Before copying mac header, better make sure it is present. Bugzilla reference: https://bugzilla.kernel.org/show_bug.cgi?id=42809 Reported-by: Niccolò Belli <darkbasic@linuxsystems.it> Tested-by: Niccolò Belli <darkbasic@linuxsystems.it> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> --- V2: added skb_mac_header_rebuild() helper as David suggested. include/linux/skbuff.h | 10 ++++++++++ net/ipv4/xfrm4_mode_beet.c | 5 +---- net/ipv4/xfrm4_mode_tunnel.c | 6 ++---- net/ipv6/xfrm6_mode_beet.c | 6 +----- net/ipv6/xfrm6_mode_tunnel.c | 6 ++---- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 50db9b0..ae86ade 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1465,6 +1465,16 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) } #endif /* NET_SKBUFF_DATA_USES_OFFSET */ +static inline void skb_mac_header_rebuild(struct sk_buff *skb) +{ + if (skb_mac_header_was_set(skb)) { + const unsigned char *old_mac = skb_mac_header(skb); + + skb_set_mac_header(skb, -skb->mac_len); + memmove(skb_mac_header(skb), old_mac, skb->mac_len); + } +} + static inline int skb_checksum_start_offset(const struct sk_buff *skb) { return skb->csum_start - skb_headroom(skb); diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index 6341818..e3db3f9 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c @@ -110,10 +110,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) skb_push(skb, sizeof(*iph)); skb_reset_network_header(skb); - - memmove(skb->data - skb->mac_len, skb_mac_header(skb), - skb->mac_len); - skb_set_mac_header(skb, -skb->mac_len); + skb_mac_header_rebuild(skb); xfrm4_beet_make_header(skb); diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 534972e..ed4bf11 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c @@ -66,7 +66,6 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) { - const unsigned char *old_mac; int err = -EINVAL; if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPIP) @@ -84,10 +83,9 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) if (!(x->props.flags & XFRM_STATE_NOECN)) ipip_ecn_decapsulate(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); skb_reset_network_header(skb); + skb_mac_header_rebuild(skb); + err = 0; out: diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c index a81ce94..9949a35 100644 --- a/net/ipv6/xfrm6_mode_beet.c +++ b/net/ipv6/xfrm6_mode_beet.c @@ -80,7 +80,6 @@ static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) { struct ipv6hdr *ip6h; - const unsigned char *old_mac; int size = sizeof(struct ipv6hdr); int err; @@ -90,10 +89,7 @@ static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) __skb_push(skb, size); skb_reset_network_header(skb); - - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); + skb_mac_header_rebuild(skb); xfrm6_beet_make_header(skb); diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index 261e6e6..9f2095b 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c @@ -63,7 +63,6 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) { int err = -EINVAL; - const unsigned char *old_mac; if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6) goto out; @@ -80,10 +79,9 @@ static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) if (!(x->props.flags & XFRM_STATE_NOECN)) ipip6_ecn_decapsulate(skb); - old_mac = skb_mac_header(skb); - skb_set_mac_header(skb, -skb->mac_len); - memmove(skb_mac_header(skb), old_mac, skb->mac_len); skb_reset_network_header(skb); + skb_mac_header_rebuild(skb); + err = 0; out: ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH V2] ipsec: be careful of non existing mac headers 2012-02-23 20:55 ` [PATCH V2] ipsec: be careful of non existing mac headers Eric Dumazet @ 2012-02-23 21:53 ` David Miller 0 siblings, 0 replies; 21+ messages in thread From: David Miller @ 2012-02-23 21:53 UTC (permalink / raw) To: eric.dumazet Cc: darkbasic, netdev, openadsl-users, openadsl-devel, 660804, support, support From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 23 Feb 2012 21:55:02 +0100 > Niccolo Belli reported ipsec crashes in case we handle a frame without > mac header (atm in his case) > > Before copying mac header, better make sure it is present. > > Bugzilla reference: https://bugzilla.kernel.org/show_bug.cgi?id=42809 > > Reported-by: Niccolò Belli <darkbasic@linuxsystems.it> > Tested-by: Niccolò Belli <darkbasic@linuxsystems.it> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied and queued up for -stable, thanks. BTW, if anyone wants to see what's queued up for -stable I have a public patchwork bundle for it: http://patchwork.ozlabs.org/bundle/davem/stable/ Just FYI. ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2012-02-23 21:54 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <bug-42809-100@https.bugzilla.kernel.org/> 2012-02-22 17:20 ` [Bug 42809] New: kernel panic when receiving an ipsec packet Stephen Hemminger 2012-02-22 17:41 ` Niccolò Belli 2012-02-23 0:59 ` Niccolò Belli 2012-02-23 1:38 ` Eric Dumazet 2012-02-23 1:46 ` [openadsl-users] " Jason White 2012-02-23 1:54 ` Eric Dumazet 2012-02-23 13:48 ` Bug#660804: " chas williams - CONTRACTOR 2012-02-23 1:55 ` Niccolò Belli 2012-02-23 2:02 ` Niccolò Belli 2012-02-23 2:06 ` Eric Dumazet 2012-02-23 2:12 ` Niccolò Belli 2012-02-23 13:45 ` Niccolò Belli 2012-02-23 14:36 ` Eric Dumazet 2012-02-23 14:39 ` Eric Dumazet 2012-02-23 19:08 ` Niccolò Belli 2012-02-23 20:11 ` David Miller 2012-02-23 20:17 ` Eric Dumazet 2012-02-23 20:23 ` David Miller 2012-02-23 20:28 ` Eric Dumazet 2012-02-23 20:55 ` [PATCH V2] ipsec: be careful of non existing mac headers Eric Dumazet 2012-02-23 21:53 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).