> -----Original Message-----
> From: Kevin Traynor [mailto:ktray...@redhat.com]
> Sent: Tuesday 1 October 2019 13:53
> To: dev@dpdk.org
> Cc: Kevin Traynor <ktray...@redhat.com>; Ferriter, Cian
> <cian.ferri...@intel.com>; sta...@dpdk.org
> Subject: [PATCH 1/9] net/pcap: fix argument checks
> 
> Previously rx/tx_queues were passed into eth_from_pcaps_common() as
> ptrs and were checked for being NULL.
> 
> In commit da6ba28f0540 ("net/pcap: use a struct to pass user options") that
> changed to pass in a ptr to a pmd_devargs_all which contains the
> rx/tx_queues.
> 
> The parameter checking was not updated as part of that commit and coverity
> caught that there was still a check if rx/tx_queues were NULL, apparently
> after they had been dereferenced.
> 
> Fix that by checking the pmd_devargs_all ptr and removing the NULL checks
> on rx/tx_queues.
> 
> 1231        struct pmd_devargs *rx_queues = &devargs_all->rx_queues;
> 1232        struct pmd_devargs *tx_queues = &devargs_all->tx_queues;
> 1233        const unsigned int nb_rx_queues = rx_queues->num_of_queue;
>     deref_ptr: Directly dereferencing pointer tx_queues.
> 1234        const unsigned int nb_tx_queues = tx_queues->num_of_queue;
> 1235        unsigned int i;
> 1236
> 1237        /* do some parameter checking */
>     CID 345004: Dereference before null check (REVERSE_INULL)
>     [select issue]
> 1238        if (rx_queues == NULL && nb_rx_queues > 0)
> 1239                return -1;
>     CID 345029 (#1 of 1): Dereference before null check (REVERSE_INULL)
>     check_after_deref: Null-checking tx_queues suggests that it may be
>     null, but it has already been dereferenced on all paths leading to
>     the check.
> 1240        if (tx_queues == NULL && nb_tx_queues > 0)
> 1241                return -1;
> 
> Coverity issue: 345029
> Coverity issue: 345044
> Fixes: da6ba28f0540 ("net/pcap: use a struct to pass user options")
> Cc: cian.ferri...@intel.com
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Kevin Traynor <ktray...@redhat.com>

Acked-by: Cian Ferriter <cian.ferri...@intel.com>


> ---
>  drivers/net/pcap/rte_eth_pcap.c | 19 +++++++++++--------
>  1 file changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/pcap/rte_eth_pcap.c
> b/drivers/net/pcap/rte_eth_pcap.c index 5489010b6..7cf00306e 100644
> --- a/drivers/net/pcap/rte_eth_pcap.c
> +++ b/drivers/net/pcap/rte_eth_pcap.c
> @@ -1229,16 +1229,19 @@ eth_from_pcaps_common(struct
> rte_vdev_device *vdev,  {
>       struct pmd_process_private *pp;
> -     struct pmd_devargs *rx_queues = &devargs_all->rx_queues;
> -     struct pmd_devargs *tx_queues = &devargs_all->tx_queues;
> -     const unsigned int nb_rx_queues = rx_queues->num_of_queue;
> -     const unsigned int nb_tx_queues = tx_queues->num_of_queue;
> +     struct pmd_devargs *rx_queues;
> +     struct pmd_devargs *tx_queues;
> +     unsigned int nb_rx_queues;
> +     unsigned int nb_tx_queues;
>       unsigned int i;
> 
> -     /* do some parameter checking */
> -     if (rx_queues == NULL && nb_rx_queues > 0)
> -             return -1;
> -     if (tx_queues == NULL && nb_tx_queues > 0)
> +     if (devargs_all == NULL)
>               return -1;
> 
> +     rx_queues = &devargs_all->rx_queues;
> +     tx_queues = &devargs_all->tx_queues;
> +
> +     nb_rx_queues = rx_queues->num_of_queue;
> +     nb_tx_queues = tx_queues->num_of_queue;
> +
>       if (pmd_init_internals(vdev, nb_rx_queues, nb_tx_queues,
> internals,
>                       eth_dev) < 0)
> --
> 2.21.0

Reply via email to