netdev
[Top] [All Lists]

[05/08] [IPSEC]: Do not hold state lock while checking size

To: linux-kernel@xxxxxxxxxxxxxxx, stable@xxxxxxxxxx
Subject: [05/08] [IPSEC]: Do not hold state lock while checking size
From: Greg KH <gregkh@xxxxxxx>
Date: Tue, 5 Apr 2005 09:47:27 -0700
Cc: kaber@xxxxxxxxx, davem@xxxxxxxxxxxxx, netdev@xxxxxxxxxxx
In-reply-to: <20050405164539.GA17299@kroah.com>
References: <20050405164539.GA17299@kroah.com>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.5.8i
-stable review patch.  If anyone has any objections, please let us know.

------------------

This patch from Herbert Xu fixes a deadlock with IPsec.
When an ICMP frag. required is sent and the ICMP message
needs the same SA as the packet that caused it the state
will be locked twice.

[IPSEC]: Do not hold state lock while checking size.

This can elicit ICMP message output and thus result in a
deadlock.

Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
Signed-off-by: Chris Wright <chrisw@xxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

diff -Nru a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c
--- a/net/ipv4/xfrm4_output.c   2005-03-20 16:53:05 +01:00
+++ b/net/ipv4/xfrm4_output.c   2005-03-20 16:53:05 +01:00
@@ -103,16 +103,16 @@
                        goto error_nolock;
        }
 
-       spin_lock_bh(&x->lock);
-       err = xfrm_state_check(x, skb);
-       if (err)
-               goto error;
-
        if (x->props.mode) {
                err = xfrm4_tunnel_check_size(skb);
                if (err)
-                       goto error;
+                       goto error_nolock;
        }
+
+       spin_lock_bh(&x->lock);
+       err = xfrm_state_check(x, skb);
+       if (err)
+               goto error;
 
        xfrm4_encap(skb);
 
diff -Nru a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
--- a/net/ipv6/xfrm6_output.c   2005-03-20 16:53:05 +01:00
+++ b/net/ipv6/xfrm6_output.c   2005-03-20 16:53:05 +01:00
@@ -103,16 +103,16 @@
                        goto error_nolock;
        }
 
-       spin_lock_bh(&x->lock);
-       err = xfrm_state_check(x, skb);
-       if (err)
-               goto error;
-
        if (x->props.mode) {
                err = xfrm6_tunnel_check_size(skb);
                if (err)
-                       goto error;
+                       goto error_nolock;
        }
+
+       spin_lock_bh(&x->lock);
+       err = xfrm_state_check(x, skb);
+       if (err)
+               goto error;
 
        xfrm6_encap(skb);
 

<Prev in Thread] Current Thread [Next in Thread>
  • [05/08] [IPSEC]: Do not hold state lock while checking size, Greg KH <=