[PATCH] Do not hold state lock while checking size

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@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
kaber@trash.net 2005-04-07 11:31:38 -07:00 committed by Greg KH
parent 82e59799aa
commit 92ef2364e6
2 changed files with 12 additions and 12 deletions

View file

@ -103,17 +103,17 @@ int xfrm4_output(struct sk_buff *skb)
goto error_nolock;
}
if (x->props.mode) {
err = xfrm4_tunnel_check_size(skb);
if (err)
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;
}
xfrm4_encap(skb);
err = x->type->output(skb);

View file

@ -103,17 +103,17 @@ int xfrm6_output(struct sk_buff *skb)
goto error_nolock;
}
if (x->props.mode) {
err = xfrm6_tunnel_check_size(skb);
if (err)
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;
}
xfrm6_encap(skb);
err = x->type->output(skb);