sock_diag: align nlattr properly when needed
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Tue, 26 Apr 2016 08:06:14 +0000 (10:06 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Apr 2016 16:00:48 +0000 (12:00 -0400)
I also fix the value of INET_DIAG_MAX. It's wrong since commit 8f840e47f190
which is only in net-next right now, thus I didn't make a separate patch.

Fixes: 8f840e47f190 ("sctp: add the sctp_diag.c file")
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/inet_diag.h
net/core/sock_diag.c
net/ipv4/inet_diag.c
net/sctp/sctp_diag.c

index f5f3629dd553963d9149191193b91172e8286c35..a1664370566967fe9f3862921ffab13cc86385d0 100644 (file)
@@ -115,9 +115,11 @@ enum {
        INET_DIAG_SKV6ONLY,
        INET_DIAG_LOCALS,
        INET_DIAG_PEERS,
+       INET_DIAG_PAD,
+       __INET_DIAG_MAX,
 };
 
-#define INET_DIAG_MAX INET_DIAG_SKV6ONLY
+#define INET_DIAG_MAX (__INET_DIAG_MAX - 1)
 
 /* INET_DIAG_MEM */
 
index ca9e35bbe13ca1f6f7100f755c046ea60f624a06..6b10573cc9faa790fe261b452b85f3b774c3ec21 100644 (file)
@@ -120,7 +120,7 @@ static size_t sock_diag_nlmsg_size(void)
 {
        return NLMSG_ALIGN(sizeof(struct inet_diag_msg)
               + nla_total_size(sizeof(u8)) /* INET_DIAG_PROTOCOL */
-              + nla_total_size(sizeof(struct tcp_info))); /* INET_DIAG_INFO */
+              + nla_total_size_64bit(sizeof(struct tcp_info))); /* INET_DIAG_INFO */
 }
 
 static void sock_diag_broadcast_destroy_work(struct work_struct *work)
index ad7956fa659a51ba4e22b5e81a53fb7860970ed3..25af1243649b7083a5b20ef7116635acf0f4ceef 100644 (file)
@@ -220,8 +220,9 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
        }
 
        if ((ext & (1 << (INET_DIAG_INFO - 1))) && handler->idiag_info_size) {
-               attr = nla_reserve(skb, INET_DIAG_INFO,
-                                  handler->idiag_info_size);
+               attr = nla_reserve_64bit(skb, INET_DIAG_INFO,
+                                        handler->idiag_info_size,
+                                        INET_DIAG_PAD);
                if (!attr)
                        goto errout;
 
@@ -1078,7 +1079,9 @@ int inet_diag_handler_get_info(struct sk_buff *skb, struct sock *sk)
        }
 
        attr = handler->idiag_info_size
-               ? nla_reserve(skb, INET_DIAG_INFO, handler->idiag_info_size)
+               ? nla_reserve_64bit(skb, INET_DIAG_INFO,
+                                   handler->idiag_info_size,
+                                   INET_DIAG_PAD)
                : NULL;
        if (attr)
                info = nla_data(attr);
index bb2d8d9608e95c62d6e0a42ef2a87c1315fb4d6b..84829fff3bc975a142bc76f217ebd160bcb6a7a9 100644 (file)
@@ -161,8 +161,9 @@ static int inet_sctp_diag_fill(struct sock *sk, struct sctp_association *asoc,
        if (ext & (1 << (INET_DIAG_INFO - 1))) {
                struct nlattr *attr;
 
-               attr = nla_reserve(skb, INET_DIAG_INFO,
-                                  sizeof(struct sctp_info));
+               attr = nla_reserve_64bit(skb, INET_DIAG_INFO,
+                                        sizeof(struct sctp_info),
+                                        INET_DIAG_PAD);
                if (!attr)
                        goto errout;