[IPSEC]: Lock state when copying non-atomic fields to user-space
[deliverable/linux.git] / net / xfrm / xfrm_user.c
index 2cbbe5e93a7bb5ecdc59653378435d97cc32fa60..5238f6a8dfad9face8a889132fe3ba4aa27e19ed 100644 (file)
@@ -507,8 +507,16 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
                                    struct xfrm_usersa_info *p,
                                    struct sk_buff *skb)
 {
+       spin_lock_bh(&x->lock);
        copy_to_user_state(x, p);
 
+       if (x->coaddr)
+               NLA_PUT(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
+
+       if (x->lastused)
+               NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
+       spin_unlock_bh(&x->lock);
+
        if (x->aalg)
                NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg);
        if (x->ealg)
@@ -522,12 +530,6 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
        if (x->security && copy_sec_ctx(x->security, skb) < 0)
                goto nla_put_failure;
 
-       if (x->coaddr)
-               NLA_PUT(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
-
-       if (x->lastused)
-               NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
-
        return 0;
 
 nla_put_failure:
This page took 0.0258969999999999 seconds and 5 git commands to generate.