iavf: fix dereference of null rx_buffer pointer
authorColin Ian King <colin.king@canonical.com>
Wed, 19 Jun 2019 14:30:44 +0000 (15:30 +0100)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 28 Jun 2019 23:00:10 +0000 (16:00 -0700)
A recent commit efa14c3985828d ("iavf: allow null RX descriptors") added
a null pointer sanity check on rx_buffer, however, rx_buffer is being
dereferenced before that check, which implies a null pointer dereference
bug can potentially occur.  Fix this by only dereferencing rx_buffer
until after the null pointer check.

Addresses-Coverity: ("Dereference before null check")
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/iavf/iavf_txrx.c

index 1cde1601bc329ec66937ddfefa3c751346c65d6f..0cca1b589b562420d4643d2a43af03a3c16a2c6c 100644 (file)
@@ -1296,7 +1296,7 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring,
                                          struct iavf_rx_buffer *rx_buffer,
                                          unsigned int size)
 {
-       void *va = page_address(rx_buffer->page) + rx_buffer->page_offset;
+       void *va;
 #if (PAGE_SIZE < 8192)
        unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2;
 #else
@@ -1308,6 +1308,7 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring,
        if (!rx_buffer)
                return NULL;
        /* prefetch first cache line of first page */
+       va = page_address(rx_buffer->page) + rx_buffer->page_offset;
        prefetch(va);
 #if L1_CACHE_BYTES < 128
        prefetch(va + L1_CACHE_BYTES);
@@ -1362,7 +1363,7 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring,
                                      struct iavf_rx_buffer *rx_buffer,
                                      unsigned int size)
 {
-       void *va = page_address(rx_buffer->page) + rx_buffer->page_offset;
+       void *va;
 #if (PAGE_SIZE < 8192)
        unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2;
 #else
@@ -1374,6 +1375,7 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring,
        if (!rx_buffer)
                return NULL;
        /* prefetch first cache line of first page */
+       va = page_address(rx_buffer->page) + rx_buffer->page_offset;
        prefetch(va);
 #if L1_CACHE_BYTES < 128
        prefetch(va + L1_CACHE_BYTES);