[v2,3/3] dma/idxd: fix null pointer dereference during pci remove
Checks
Commit Message
The 'info' struct was being declared as a NULL pointer. If a NULL
pointer is passed to 'rte_dma_info_get', EINVAL is returned and the
struct is not populated. This subsequently causes a segfault when
dereferencing 'info'.
This patch fixes the issue by simply declaring 'info' as a variable and
passing its address to 'rte_dma_info_get'.
Fixes: 9449330a8458 ("dma/idxd: create dmadev instances on PCI probe")
Cc: stable@dpdk.org
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
---
drivers/dma/idxd/idxd_pci.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Comments
On Sun, Jul 03, 2022 at 01:22:43PM +0100, Kevin Laatz wrote:
> The 'info' struct was being declared as a NULL pointer. If a NULL
> pointer is passed to 'rte_dma_info_get', EINVAL is returned and the
> struct is not populated. This subsequently causes a segfault when
> dereferencing 'info'.
>
> This patch fixes the issue by simply declaring 'info' as a variable and
s/as a variable/on the stack/
> passing its address to 'rte_dma_info_get'.
>
> Fixes: 9449330a8458 ("dma/idxd: create dmadev instances on PCI probe")
> Cc: stable@dpdk.org
>
> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> drivers/dma/idxd/idxd_pci.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma/idxd/idxd_pci.c b/drivers/dma/idxd/idxd_pci.c
> index 9349c56b3f..3c1effeb84 100644
> --- a/drivers/dma/idxd/idxd_pci.c
> +++ b/drivers/dma/idxd/idxd_pci.c
> @@ -379,10 +379,10 @@ idxd_dmadev_remove_pci(struct rte_pci_device *dev)
> IDXD_PMD_INFO("Closing %s on NUMA node %d", name, dev->device.numa_node);
>
> RTE_DMA_FOREACH_DEV(i) {
> - struct rte_dma_info *info = {0};
> - rte_dma_info_get(i, info);
> - if (strncmp(name, info->dev_name, strlen(name)) == 0)
> - idxd_dmadev_destroy(info->dev_name);
> + struct rte_dma_info info;
> + rte_dma_info_get(i, &info);
> + if (strncmp(name, info.dev_name, strlen(name)) == 0)
> + idxd_dmadev_destroy(info.dev_name);
> }
>
> return 0;
> --
> 2.31.1
>
@@ -379,10 +379,10 @@ idxd_dmadev_remove_pci(struct rte_pci_device *dev)
IDXD_PMD_INFO("Closing %s on NUMA node %d", name, dev->device.numa_node);
RTE_DMA_FOREACH_DEV(i) {
- struct rte_dma_info *info = {0};
- rte_dma_info_get(i, info);
- if (strncmp(name, info->dev_name, strlen(name)) == 0)
- idxd_dmadev_destroy(info->dev_name);
+ struct rte_dma_info info;
+ rte_dma_info_get(i, &info);
+ if (strncmp(name, info.dev_name, strlen(name)) == 0)
+ idxd_dmadev_destroy(info.dev_name);
}
return 0;