xfrm: align nlattr properly when needed
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Fri, 22 Apr 2016 15:31:23 +0000 (17:31 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 24 Apr 2016 00:13:25 +0000 (20:13 -0400)
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/xfrm.h
net/xfrm/xfrm_user.c

index 2cd9e608d0d17d88985c3e32774e567da3236bb5..143338978b489bf68d4cb316cf2a7f938cdf5054 100644 (file)
@@ -302,6 +302,7 @@ enum xfrm_attr_type_t {
        XFRMA_SA_EXTRA_FLAGS,   /* __u32 */
        XFRMA_PROTO,            /* __u8 */
        XFRMA_ADDRESS_FILTER,   /* struct xfrm_address_filter */
+       XFRMA_PAD,
        __XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
index 2cc7af858c6f2a599aac11926d018d937622b236..d516845e16e30b69d2d47160ef9f45e6a4587a6b 100644 (file)
@@ -809,7 +809,8 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
                        goto out;
        }
        if (x->lastused) {
-               ret = nla_put_u64(skb, XFRMA_LASTUSED, x->lastused);
+               ret = nla_put_u64_64bit(skb, XFRMA_LASTUSED, x->lastused,
+                                       XFRMA_PAD);
                if (ret)
                        goto out;
        }
@@ -1813,7 +1814,7 @@ static inline size_t xfrm_aevent_msgsize(struct xfrm_state *x)
 
        return NLMSG_ALIGN(sizeof(struct xfrm_aevent_id))
               + nla_total_size(replay_size)
-              + nla_total_size(sizeof(struct xfrm_lifetime_cur))
+              + nla_total_size_64bit(sizeof(struct xfrm_lifetime_cur))
               + nla_total_size(sizeof(struct xfrm_mark))
               + nla_total_size(4) /* XFRM_AE_RTHR */
               + nla_total_size(4); /* XFRM_AE_ETHR */
@@ -1848,7 +1849,8 @@ static int build_aevent(struct sk_buff *skb, struct xfrm_state *x, const struct
        }
        if (err)
                goto out_cancel;
-       err = nla_put(skb, XFRMA_LTIME_VAL, sizeof(x->curlft), &x->curlft);
+       err = nla_put_64bit(skb, XFRMA_LTIME_VAL, sizeof(x->curlft), &x->curlft,
+                           XFRMA_PAD);
        if (err)
                goto out_cancel;
 
@@ -2617,7 +2619,7 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x)
                l += nla_total_size(sizeof(x->props.extra_flags));
 
        /* Must count x->lastused as it may become non-zero behind our back. */
-       l += nla_total_size(sizeof(u64));
+       l += nla_total_size_64bit(sizeof(u64));
 
        return l;
 }