net: use common macro for assering skb->cb[] available size in protocol families
authorEyal Birger <eyal.birger@gmail.com>
Sun, 1 Mar 2015 12:58:29 +0000 (14:58 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Mar 2015 05:19:30 +0000 (00:19 -0500)
As part of an effort to move skb->dropcount to skb->cb[] use a common
macro in protocol families using skb->cb[] for ancillary data to
validate available room in skb->cb[].

Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h
net/bluetooth/af_bluetooth.c
net/can/bcm.c
net/can/raw.c
net/ipv4/af_inet.c
net/ipv4/tcp.c
net/ipv6/af_inet6.c
net/packet/af_packet.c
net/sctp/protocol.c

index ab186b1d31fffe7cc5b4888d85aca99c2d875da4..a2502d248641f24746c2581a40bde4fe7476facb 100644 (file)
@@ -2078,6 +2078,9 @@ static inline int sock_intr_errno(long timeo)
        return timeo == MAX_SCHEDULE_TIMEOUT ? -ERESTARTSYS : -EINTR;
 }
 
+#define sock_skb_cb_check_size(size) \
+       BUILD_BUG_ON((size) > FIELD_SIZEOF(struct sk_buff, cb))
+
 void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
                           struct sk_buff *skb);
 void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
index ce22e0cfa923fb947256f8c36405b7e8bce5c888..4b904c97a06872d0c71e3ca41bf7764a6a98c2e6 100644 (file)
@@ -711,10 +711,9 @@ EXPORT_SYMBOL_GPL(bt_debugfs);
 
 static int __init bt_init(void)
 {
-       struct sk_buff *skb;
        int err;
 
-       BUILD_BUG_ON(sizeof(struct bt_skb_cb) > sizeof(skb->cb));
+       sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
 
        BT_INFO("Core ver %s", VERSION);
 
index ee9ffd9565526eb0336fba37e17f0a31b2dd3c34..d559f922326d3880fb563419fabb70d2b8f21a32 100644 (file)
@@ -328,7 +328,7 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
         *  containing the interface index.
         */
 
-       BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct sockaddr_can));
+       sock_skb_cb_check_size(sizeof(struct sockaddr_can));
        addr = (struct sockaddr_can *)skb->cb;
        memset(addr, 0, sizeof(*addr));
        addr->can_family  = AF_CAN;
index 00c13ef23661bd92133fff7db45588d3bd83fc62..94601b7ff0a32feae393a995bed53e4e3a084830 100644 (file)
@@ -95,8 +95,8 @@ struct raw_sock {
  */
 static inline unsigned int *raw_flags(struct sk_buff *skb)
 {
-       BUILD_BUG_ON(sizeof(skb->cb) <= (sizeof(struct sockaddr_can) +
-                                        sizeof(unsigned int)));
+       sock_skb_cb_check_size(sizeof(struct sockaddr_can) +
+                              sizeof(unsigned int));
 
        /* return pointer after struct sockaddr_can */
        return (unsigned int *)(&((struct sockaddr_can *)skb->cb)[1]);
@@ -135,7 +135,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
         *  containing the interface index.
         */
 
-       BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct sockaddr_can));
+       sock_skb_cb_check_size(sizeof(struct sockaddr_can));
        addr = (struct sockaddr_can *)skb->cb;
        memset(addr, 0, sizeof(*addr));
        addr->can_family  = AF_CAN;
index d2e49baaff63420320486d310f5c8f7d0d54bcc2..4ce954cc94a4c11f7d0940ca8a4813f57e40bfda 100644 (file)
@@ -1675,7 +1675,7 @@ static int __init inet_init(void)
        struct list_head *r;
        int rc = -EINVAL;
 
-       BUILD_BUG_ON(sizeof(struct inet_skb_parm) > FIELD_SIZEOF(struct sk_buff, cb));
+       sock_skb_cb_check_size(sizeof(struct inet_skb_parm));
 
        rc = proto_register(&tcp_prot, 1);
        if (rc)
index 9d72a0fcd9284425e088cef6e1b8c14e95950ca4..4b57ea8dabc7acb67d8df64e9392f73d7800ee06 100644 (file)
@@ -3005,12 +3005,11 @@ static void __init tcp_init_mem(void)
 
 void __init tcp_init(void)
 {
-       struct sk_buff *skb = NULL;
        unsigned long limit;
        int max_rshare, max_wshare, cnt;
        unsigned int i;
 
-       BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb));
+       sock_skb_cb_check_size(sizeof(struct tcp_skb_cb));
 
        percpu_counter_init(&tcp_sockets_allocated, 0, GFP_KERNEL);
        percpu_counter_init(&tcp_orphan_count, 0, GFP_KERNEL);
index e8c4400f23e9b4afe47fcc45bb761d82354fb6a6..6bafcc2c79e3990c184aff1e50747f8fa2646da1 100644 (file)
@@ -824,7 +824,7 @@ static int __init inet6_init(void)
        struct list_head *r;
        int err = 0;
 
-       BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > FIELD_SIZEOF(struct sk_buff, cb));
+       sock_skb_cb_check_size(sizeof(struct inet6_skb_parm));
 
        /* Register the socket-side information for inet6_create.  */
        for (r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
index 7eea30b9c8e57213de8449323549b4cb2477f3f1..9cdb414cd231c995c6bb55583bad4387990549f5 100644 (file)
@@ -1816,8 +1816,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
                skb = nskb;
        }
 
-       BUILD_BUG_ON(sizeof(*PACKET_SKB_CB(skb)) + MAX_ADDR_LEN - 8 >
-                    sizeof(skb->cb));
+       sock_skb_cb_check_size(sizeof(*PACKET_SKB_CB(skb)) + MAX_ADDR_LEN - 8);
 
        sll = &PACKET_SKB_CB(skb)->sa.ll;
        sll->sll_hatype = dev->type;
index 8f34b27d5775f053ffde8a763f724c0d8b4f6e1f..53b7acde9aa37bf3d4029c459421564d5270f4c0 100644 (file)
@@ -1322,8 +1322,7 @@ static __init int sctp_init(void)
        int max_share;
        int order;
 
-       BUILD_BUG_ON(sizeof(struct sctp_ulpevent) >
-                    sizeof(((struct sk_buff *) 0)->cb));
+       sock_skb_cb_check_size(sizeof(struct sctp_ulpevent));
 
        /* Allocate bind_bucket and chunk caches. */
        status = -ENOBUFS;