diff options
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; |