net/af_packet: guard against buffer overruns in Rx path
authorMichał Mirosław <michal.miroslaw@atendesoftware.pl>
Tue, 13 Dec 2016 01:28:34 +0000 (02:28 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 17 Jan 2017 18:40:51 +0000 (19:40 +0100)
Signed-off-by: Michał Mirosław <michal.miroslaw@atendesoftware.pl>
Acked-by: John W. Linville <linville@tuxdriver.com>
drivers/net/af_packet/rte_eth_af_packet.c

index f670165..ac16f8c 100644 (file)
@@ -366,18 +366,20 @@ eth_rx_queue_setup(struct rte_eth_dev *dev,
 {
        struct pmd_internals *internals = dev->data->dev_private;
        struct pkt_rx_queue *pkt_q = &internals->rx_queue[rx_queue_id];
-       uint16_t buf_size;
+       unsigned int buf_size, data_size;
 
        pkt_q->mb_pool = mb_pool;
 
        /* Now get the space available for data in the mbuf */
-       buf_size = (uint16_t)(rte_pktmbuf_data_room_size(pkt_q->mb_pool) -
-               RTE_PKTMBUF_HEADROOM);
+       buf_size = rte_pktmbuf_data_room_size(pkt_q->mb_pool) -
+               RTE_PKTMBUF_HEADROOM;
+       data_size = internals->req.tp_frame_size;
+       data_size -= TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
 
-       if (ETH_FRAME_LEN > buf_size) {
+       if (data_size > buf_size) {
                RTE_LOG(ERR, PMD,
                        "%s: %d bytes will not fit in mbuf (%d bytes)\n",
-                       dev->data->name, ETH_FRAME_LEN, buf_size);
+                       dev->data->name, data_size, buf_size);
                return -ENOMEM;
        }