netlink: Avoid netlink mmap alloc if msg size exceeds frame size
authorThomas Graf <tgraf@suug.ch>
Sat, 30 Nov 2013 12:21:31 +0000 (13:21 +0100)
committerJesse Gross <jesse@nicira.com>
Mon, 6 Jan 2014 23:52:06 +0000 (15:52 -0800)
An insufficent ring frame size configuration can lead to an
unnecessary skb allocation for every Netlink message. Check frame
size before taking the queue lock and allocating the skb and
re-check with lock to be safe.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Reviewed-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
net/netlink/af_netlink.c

index bca50b95c182300cbd89f8cfc21b17e9d6e31fe2..64334893c61cc2d0530afa2f28bff044102b183a 100644 (file)
@@ -1769,6 +1769,9 @@ struct sk_buff *netlink_alloc_skb(struct sock *ssk, unsigned int size,
        if (ring->pg_vec == NULL)
                goto out_put;
 
+       if (ring->frame_size - NL_MMAP_HDRLEN < size)
+               goto out_put;
+
        skb = alloc_skb_head(gfp_mask);
        if (skb == NULL)
                goto err1;
@@ -1778,6 +1781,7 @@ struct sk_buff *netlink_alloc_skb(struct sock *ssk, unsigned int size,
        if (ring->pg_vec == NULL)
                goto out_free;
 
+       /* check again under lock */
        maxlen = ring->frame_size - NL_MMAP_HDRLEN;
        if (maxlen < size)
                goto out_free;