[dpdk-dev,v1] afpacket: fix critical issue reported by klocwork

Message ID 1423732089-6202-1-git-send-email-cunming.liang@intel.com (mailing list archive)
State Rejected, archived
Headers

Commit Message

Cunming Liang Feb. 12, 2015, 9:08 a.m. UTC
Klocwork report 'req' might be used uninitialized.
In some cases it can 'goto error' when '*internals' not been set.
The result is unexpected checking the value of '*internals'.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
 lib/librte_pmd_af_packet/rte_eth_af_packet.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
  

Comments

Thomas Monjalon Feb. 20, 2015, 10:19 a.m. UTC | #1
Hi Cunming,

You would have more chance to have a review by CC'ing John.
I checked your patch and have a comment below.

2015-02-12 17:08, Cunming Liang:
> Klocwork report 'req' might be used uninitialized.
> In some cases it can 'goto error' when '*internals' not been set.
> The result is unexpected checking the value of '*internals'.
> 
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> ---
>  lib/librte_pmd_af_packet/rte_eth_af_packet.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> index 1ffe1cd..185607d 100644
> --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
>  	size_t ifnamelen;
>  	unsigned k_idx;
>  	struct sockaddr_ll sockaddr;
> -	struct tpacket_req *req;
> +	struct tpacket_req *req = NULL;

If *internals is set to NULL, there should be no case where req used
and undefined.

>  	struct pkt_rx_queue *rx_queue;
>  	struct pkt_tx_queue *tx_queue;
>  	int rc, qsockfd, tpver, discard;
>  	unsigned int i, q, rdsize;
>  	int fanout_arg __rte_unused, bypass __rte_unused;
>  
> +	*internals = NULL;
> +
>  	for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
>  		pair = &kvlist->pairs[k_idx];
>  		if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL)
>
  
John W. Linville Feb. 20, 2015, 6:38 p.m. UTC | #2
On Fri, Feb 20, 2015 at 11:19:59AM +0100, Thomas Monjalon wrote:
> Hi Cunming,
> 
> You would have more chance to have a review by CC'ing John.
> I checked your patch and have a comment below.
> 
> 2015-02-12 17:08, Cunming Liang:
> > Klocwork report 'req' might be used uninitialized.
> > In some cases it can 'goto error' when '*internals' not been set.
> > The result is unexpected checking the value of '*internals'.
> > 
> > Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> > ---
> >  lib/librte_pmd_af_packet/rte_eth_af_packet.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> > 
> > diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > index 1ffe1cd..185607d 100644
> > --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
> >  	size_t ifnamelen;
> >  	unsigned k_idx;
> >  	struct sockaddr_ll sockaddr;
> > -	struct tpacket_req *req;
> > +	struct tpacket_req *req = NULL;
> 
> If *internals is set to NULL, there should be no case where req used
> and undefined.

I agree -- it looks to me like req is protected by checking for
*internals == NULL.  I don't think this patch is necessary.
 
> >  	struct pkt_rx_queue *rx_queue;
> >  	struct pkt_tx_queue *tx_queue;
> >  	int rc, qsockfd, tpver, discard;
> >  	unsigned int i, q, rdsize;
> >  	int fanout_arg __rte_unused, bypass __rte_unused;
> >  
> > +	*internals = NULL;
> > +
> >  	for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
> >  		pair = &kvlist->pairs[k_idx];
> >  		if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL)
> > 
> 
> 
> 
>
  
Cunming Liang Feb. 25, 2015, 12:57 a.m. UTC | #3
> -----Original Message-----
> From: John W. Linville [mailto:linville@tuxdriver.com]
> Sent: Saturday, February 21, 2015 2:39 AM
> To: Thomas Monjalon
> Cc: Liang, Cunming; dev@dpdk.org; John Linville
> Subject: Re: [dpdk-dev] [PATCH v1] afpacket: fix critical issue reported by
> klocwork
> 
> On Fri, Feb 20, 2015 at 11:19:59AM +0100, Thomas Monjalon wrote:
> > Hi Cunming,
> >
> > You would have more chance to have a review by CC'ing John.
> > I checked your patch and have a comment below.
> >
> > 2015-02-12 17:08, Cunming Liang:
> > > Klocwork report 'req' might be used uninitialized.
> > > In some cases it can 'goto error' when '*internals' not been set.
> > > The result is unexpected checking the value of '*internals'.
> > >
> > > Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> > > ---
> > >  lib/librte_pmd_af_packet/rte_eth_af_packet.c | 4 +++-
> > >  1 file changed, 3 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > index 1ffe1cd..185607d 100644
> > > --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
> > >  	size_t ifnamelen;
> > >  	unsigned k_idx;
> > >  	struct sockaddr_ll sockaddr;
> > > -	struct tpacket_req *req;
> > > +	struct tpacket_req *req = NULL;
> >
> > If *internals is set to NULL, there should be no case where req used
> > and undefined.
[LCM] Agree, so that's why I add '*internals = NULL' below as well.
> 
> I agree -- it looks to me like req is protected by checking for
> *internals == NULL.  I don't think this patch is necessary.
[LCM] The major piece of the patch is add setting for '*internals=NULL;'.
> 
> > >  	struct pkt_rx_queue *rx_queue;
> > >  	struct pkt_tx_queue *tx_queue;
> > >  	int rc, qsockfd, tpver, discard;
> > >  	unsigned int i, q, rdsize;
> > >  	int fanout_arg __rte_unused, bypass __rte_unused;
> > >
> > > +	*internals = NULL;
> > > +
> > >  	for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
> > >  		pair = &kvlist->pairs[k_idx];
> > >  		if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL)
> > >
> >
> >
> >
> >
> 
> --
> John W. Linville		Someday the world will need a hero, and you
> linville@tuxdriver.com			might be all we have.  Be ready.
  
Thomas Monjalon Feb. 25, 2015, 8:45 a.m. UTC | #4
2015-02-25 00:57, Liang, Cunming:
> From: John W. Linville [mailto:linville@tuxdriver.com]
> > On Fri, Feb 20, 2015 at 11:19:59AM +0100, Thomas Monjalon wrote:
> > > 2015-02-12 17:08, Cunming Liang:
> > > > --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
> > > >  	size_t ifnamelen;
> > > >  	unsigned k_idx;
> > > >  	struct sockaddr_ll sockaddr;
> > > > -	struct tpacket_req *req;
> > > > +	struct tpacket_req *req = NULL;
> > >
> > > If *internals is set to NULL, there should be no case where req used
> > > and undefined.
> 
> [LCM] Agree, so that's why I add '*internals = NULL' below as well.
> > 
> > I agree -- it looks to me like req is protected by checking for
> > *internals == NULL.  I don't think this patch is necessary.
> 
> [LCM] The major piece of the patch is add setting for '*internals=NULL;'.

Yes understood, but it is already initialized to NULL before calling
rte_pmd_init_internals():
http://dpdk.org/browse/dpdk/tree/lib/librte_pmd_af_packet/rte_eth_af_packet.c#n706
  
Cunming Liang Feb. 25, 2015, 9:52 a.m. UTC | #5
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, February 25, 2015 4:46 PM
> To: Liang, Cunming
> Cc: John W. Linville; dev@dpdk.org; John Linville
> Subject: Re: [dpdk-dev] [PATCH v1] afpacket: fix critical issue reported by
> klocwork
> 
> 2015-02-25 00:57, Liang, Cunming:
> > From: John W. Linville [mailto:linville@tuxdriver.com]
> > > On Fri, Feb 20, 2015 at 11:19:59AM +0100, Thomas Monjalon wrote:
> > > > 2015-02-12 17:08, Cunming Liang:
> > > > > --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > > +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > > @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
> > > > >  	size_t ifnamelen;
> > > > >  	unsigned k_idx;
> > > > >  	struct sockaddr_ll sockaddr;
> > > > > -	struct tpacket_req *req;
> > > > > +	struct tpacket_req *req = NULL;
> > > >
> > > > If *internals is set to NULL, there should be no case where req used
> > > > and undefined.
> >
> > [LCM] Agree, so that's why I add '*internals = NULL' below as well.
> > >
> > > I agree -- it looks to me like req is protected by checking for
> > > *internals == NULL.  I don't think this patch is necessary.
> >
> > [LCM] The major piece of the patch is add setting for '*internals=NULL;'.
> 
> Yes understood, but it is already initialized to NULL before calling
> rte_pmd_init_internals():
> http://dpdk.org/browse/dpdk/tree/lib/librte_pmd_af_packet/rte_eth_af_packet
> .c#n706
[LCM] I see, it's complained by klocwork.
So either adding 'internals=NULL' or adding some comments helps to avoid checking again on the next scanning.
How do you think ?
  
Thomas Monjalon Feb. 25, 2015, 9:56 a.m. UTC | #6
2015-02-25 09:52, Liang, Cunming:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2015-02-25 00:57, Liang, Cunming:
> > > From: John W. Linville [mailto:linville@tuxdriver.com]
> > > > On Fri, Feb 20, 2015 at 11:19:59AM +0100, Thomas Monjalon wrote:
> > > > > 2015-02-12 17:08, Cunming Liang:
> > > > > > --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > > > +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> > > > > > @@ -439,13 +439,15 @@ rte_pmd_init_internals(const char *name,
> > > > > >  	size_t ifnamelen;
> > > > > >  	unsigned k_idx;
> > > > > >  	struct sockaddr_ll sockaddr;
> > > > > > -	struct tpacket_req *req;
> > > > > > +	struct tpacket_req *req = NULL;
> > > > >
> > > > > If *internals is set to NULL, there should be no case where req used
> > > > > and undefined.
> > >
> > > [LCM] Agree, so that's why I add '*internals = NULL' below as well.
> > > >
> > > > I agree -- it looks to me like req is protected by checking for
> > > > *internals == NULL.  I don't think this patch is necessary.
> > >
> > > [LCM] The major piece of the patch is add setting for '*internals=NULL;'.
> > 
> > Yes understood, but it is already initialized to NULL before calling
> > rte_pmd_init_internals():
> > http://dpdk.org/browse/dpdk/tree/lib/librte_pmd_af_packet/rte_eth_af_packet
> > .c#n706
> [LCM] I see, it's complained by klocwork.
> So either adding 'internals=NULL' or adding some comments helps to avoid checking again on the next scanning.
> How do you think ?

No, we don't have to pollute the code for a tool.
You should check how to disable this false positive in your tool.
  

Patch

diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
index 1ffe1cd..185607d 100644
--- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
+++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
@@ -439,13 +439,15 @@  rte_pmd_init_internals(const char *name,
 	size_t ifnamelen;
 	unsigned k_idx;
 	struct sockaddr_ll sockaddr;
-	struct tpacket_req *req;
+	struct tpacket_req *req = NULL;
 	struct pkt_rx_queue *rx_queue;
 	struct pkt_tx_queue *tx_queue;
 	int rc, qsockfd, tpver, discard;
 	unsigned int i, q, rdsize;
 	int fanout_arg __rte_unused, bypass __rte_unused;
 
+	*internals = NULL;
+
 	for (k_idx = 0; k_idx < kvlist->count; k_idx++) {
 		pair = &kvlist->pairs[k_idx];
 		if (strstr(pair->key, ETH_AF_PACKET_IFACE_ARG) != NULL)