diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-11-14 00:45:58 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 17:53:52 -0500 |
commit | 0ebea8ef3559b545c37b016f44e84c3b33e47c39 (patch) | |
tree | 7a47787c1b830084ac2d36371490b9e2574e2472 /net/ipv4/ah4.c | |
parent | 668dc8af3150f837f7f0461001bbbc0ce25d7bdf (diff) |
[IPSEC]: Move state lock into x->type->input
This patch releases the lock on the state before calling
x->type->input. It also adds the lock to the spots where they're
currently needed.
Most of those places (all except mip6) are expected to disappear with
async crypto.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ah4.c')
-rw-r--r-- | net/ipv4/ah4.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index a989d29b44ea..d76803a3dcae 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
@@ -169,6 +169,8 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
169 | if (ip_clear_mutable_options(iph, &dummy)) | 169 | if (ip_clear_mutable_options(iph, &dummy)) |
170 | goto out; | 170 | goto out; |
171 | } | 171 | } |
172 | |||
173 | spin_lock(&x->lock); | ||
172 | { | 174 | { |
173 | u8 auth_data[MAX_AH_AUTH_LEN]; | 175 | u8 auth_data[MAX_AH_AUTH_LEN]; |
174 | 176 | ||
@@ -176,12 +178,16 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
176 | skb_push(skb, ihl); | 178 | skb_push(skb, ihl); |
177 | err = ah_mac_digest(ahp, skb, ah->auth_data); | 179 | err = ah_mac_digest(ahp, skb, ah->auth_data); |
178 | if (err) | 180 | if (err) |
179 | goto out; | 181 | goto unlock; |
180 | if (memcmp(ahp->work_icv, auth_data, ahp->icv_trunc_len)) { | 182 | if (memcmp(ahp->work_icv, auth_data, ahp->icv_trunc_len)) |
181 | err = -EBADMSG; | 183 | err = -EBADMSG; |
182 | goto out; | ||
183 | } | ||
184 | } | 184 | } |
185 | unlock: | ||
186 | spin_unlock(&x->lock); | ||
187 | |||
188 | if (err) | ||
189 | goto out; | ||
190 | |||
185 | skb->network_header += ah_hlen; | 191 | skb->network_header += ah_hlen; |
186 | memcpy(skb_network_header(skb), work_buf, ihl); | 192 | memcpy(skb_network_header(skb), work_buf, ihl); |
187 | skb->transport_header = skb->network_header; | 193 | skb->transport_header = skb->network_header; |