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