net/ena: check pointer before memset
authorRafal Kozik <rk@semihalf.com>
Thu, 7 Jun 2018 09:43:18 +0000 (11:43 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 14 Jun 2018 17:27:50 +0000 (19:27 +0200)
Need to check if memory allocation succeed before using it.
Using memset on NULL pointer cause segfault.

Fixes: 9ba7981ec992 ("ena: add communication layer for DPDK")
Cc: stable@dpdk.org
Signed-off-by: Rafal Kozik <rk@semihalf.com>
Acked-by: Michal Krawczyk <mk@semihalf.com>
drivers/net/ena/base/ena_plat_dpdk.h

index e2af4ee..d30153e 100644 (file)
@@ -210,10 +210,15 @@ extern uint32_t ena_alloc_cnt;
                                "ena_alloc_%d", ena_alloc_cnt++);       \
                mz = rte_memzone_reserve(z_name, size, SOCKET_ID_ANY,   \
                                RTE_MEMZONE_IOVA_CONTIG);               \
-               memset(mz->addr, 0, size);                              \
-               virt = mz->addr;                                        \
-               phys = mz->iova;                                        \
                handle = mz;                                            \
+               if (mz == NULL) {                                       \
+                       virt = NULL;                                    \
+                       phys = 0;                                       \
+               } else {                                                \
+                       memset(mz->addr, 0, size);                      \
+                       virt = mz->addr;                                \
+                       phys = mz->iova;                                \
+               }                                                       \
        } while (0)
 #define ENA_MEM_FREE_COHERENT(dmadev, size, virt, phys, handle)        \
                ({ ENA_TOUCH(size); ENA_TOUCH(phys);                    \
@@ -230,9 +235,14 @@ extern uint32_t ena_alloc_cnt;
                                "ena_alloc_%d", ena_alloc_cnt++);       \
                mz = rte_memzone_reserve(z_name, size, node,            \
                                RTE_MEMZONE_IOVA_CONTIG);               \
-               memset(mz->addr, 0, size);                              \
-               virt = mz->addr;                                        \
-               phys = mz->iova;                                        \
+               if (mz == NULL) {                                       \
+                       virt = NULL;                                    \
+                       phys = 0;                                       \
+               } else {                                                \
+                       memset(mz->addr, 0, size);                      \
+                       virt = mz->addr;                                \
+                       phys = mz->iova;                                \
+               }                                                       \
                (void)mem_handle;                                       \
        } while (0)