[dpdk-dev] [PATCH v4 03/17] eal: fix wrong strnlen() return value in 32bit icc

Liang, Cunming cunming.liang at intel.com
Mon Feb 9 12:57:11 CET 2015



> -----Original Message-----
> From: Olivier MATZ [mailto:olivier.matz at 6wind.com]
> Sent: Monday, February 09, 2015 4:00 AM
> To: Liang, Cunming; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v4 03/17] eal: fix wrong strnlen() return value in
> 32bit icc
> 
> Hi,
> 
> On 02/02/2015 03:02 AM, Cunming Liang wrote:
> > The problem is that strnlen() here may return invalid value with 32bit icc.
> > (actually it returns it’s second parameter,e.g: sysconf(_SC_ARG_MAX)).
> > It starts to manifest hwen max_len parameter is > 2M and using icc –m32 –O2
> (or above).
> >
> > Suggested-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> > Signed-off-by: Cunming Liang <cunming.liang at intel.com>
> > ---
> >  lib/librte_eal/common/eal_common_options.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/librte_eal/common/eal_common_options.c
> b/lib/librte_eal/common/eal_common_options.c
> > index 29ebb6f..22d5d37 100644
> > --- a/lib/librte_eal/common/eal_common_options.c
> > +++ b/lib/librte_eal/common/eal_common_options.c
> > @@ -227,7 +227,7 @@ eal_parse_corelist(const char *corelist)
> >  	/* Remove all blank characters ahead and after */
> >  	while (isblank(*corelist))
> >  		corelist++;
> > -	i = strnlen(corelist, sysconf(_SC_ARG_MAX));
> > +	i = strnlen(corelist, PATH_MAX);
> >  	while ((i > 0) && isblank(corelist[i - 1]))
> >  		i--;
> >
> > @@ -469,7 +469,7 @@ eal_parse_lcores(const char *lcores)
> >  	/* Remove all blank characters ahead and after */
> >  	while (isblank(*lcores))
> >  		lcores++;
> > -	i = strnlen(lcores, sysconf(_SC_ARG_MAX));
> > +	i = strnlen(lcores, PATH_MAX);
> >  	while ((i > 0) && isblank(lcores[i - 1]))
> >  		i--;
> >
> >
> 
> I think PATH_MAX is not equivalent to _SC_ARG_MAX.
> 
> But the main question is: why do we need to use strnlen() here instead
> of strlen? We can expect that argv[] pointers are always nul-terminated.
> Replacing them by strlen() would probably also solve the icc issue.
[LCM] You're right, here strlen() also solve icc issue and no risk for argv[].
But follows practice suggestion, keeping using those with 'n' function in DPDK is not bad.
There's additional two reason to keep strnlen and PATH_MAX.
1. PATH_MAX is defined as 4096 which is enough as our input. It doesn't matter to be _SC_ARG_MAX or not.
2. strnlen and PATH_MAX already used in eal_parse_coremask, to keep the style consistent in '-l' and '--lcores'.

> 
> Regards,
> Olivier


More information about the dev mailing list