Re: [PATCH] Fix glob() function

Corinna Vinschen <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hi Jordi,

the patch looks good, thank you.  Can you please send it as a git patch
created with `git format-patch' and a nice commit message?


Thanks,
Corinna


On Aug 20 08:03, Jordi Sanfeliu wrote:
> Find the patch attached, I hope is OK this time.
> Thanks.
> 
> --
> Jordi Sanfeliu
> FIBRANET Network Services Provider
> https://www.fibranet.cat
> 
> 
> On Mon, 19 Aug 2024, Corinna Vinschen wrote:
> 
> > Hi Jordi,
> > 
> > On Aug 17 17:38, Jordi Sanfeliu wrote:
> > > Hello,
> > > 
> > > While porting 'mandoc' [1] to my hobbyOS FiwixOS, I've discovered that the
> > > glob() function in Newlib always returns zero (success) even when the
> > > pathname was not found.
> > > 
> > > I was comparing the file 'libc/posix/glob.c' with the one from Apple [2] and
> > > then I applied the following patch:
> > > 
> > > diff --git a/newlib/libc/posix/glob.c b/newlib/libc/posix/glob.c
> > > index 5e6c2fcba..0347979de 100644
> > > --- a/newlib/libc/posix/glob.c
> > > +++ b/newlib/libc/posix/glob.c
> > > @@ -502,11 +502,14 @@ glob0(pattern, pglob, limit)
> > >   	 * and the pattern did not contain any magic characters
> > >   	 * GLOB_NOMAGIC is there just for compatibility with csh.
> > >   	 */
> > > -	if (pglob->gl_pathc == oldpathc &&
> > > -	    ((pglob->gl_flags & GLOB_NOCHECK) ||
> > > -	      ((pglob->gl_flags & GLOB_NOMAGIC) &&
> > > -	       !(pglob->gl_flags & GLOB_MAGCHAR))))
> > > -		return(globextend(pattern, pglob, limit));
> > > +	if (pglob->gl_pathc == oldpathc) {
> > > +	    if (((pglob->gl_flags & GLOB_NOCHECK) ||
> > > +	        ((pglob->gl_flags & GLOB_NOMAGIC) &&
> > > +	        !(pglob->gl_flags & GLOB_MAGCHAR))))
> > > +		    return(globextend(pattern, pglob, limit));
> > > +	    else
> > 
> > This is correct and as upstream, but...
> > 
> > > +		    return(3);	/* GLOB_NOMATCH */
> > 
> > ...this isn't.  Check with libc/include/glob.h.  Your patch should
> > add a
> > 
> >  #define GLOB_NOMATCH (-3)
> > 
> > to glob.h instead.
> > 
> > Also, check your whitespaces.  I'm getting quite a few warnings from
> > `git am':
> > 
> >  Applying: Fix glob() function
> >  .git/rebase-apply/patch:6: space before tab in indent.
> > 	   * and the pattern did not contain any magic characters
> >  .git/rebase-apply/patch:7: space before tab in indent.
> > 	   * GLOB_NOMAGIC is there just for compatibility with csh.
> >  .git/rebase-apply/patch:8: space before tab in indent.
> > 	   */
> >  .git/rebase-apply/patch:22: space before tab in indent.
> > 	  else if (!(pglob->gl_flags & GLOB_NOSORT))
> >  .git/rebase-apply/patch:23: space before tab in indent.
> > 		  qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
> >  warning: squelched 1 whitespace error
> >  warning: 6 lines add whitespace errors.
> > 
> > 
> > Thanks,
> > Corinna
> > 
> > 

> diff --git a/newlib/libc/include/glob.h b/newlib/libc/include/glob.h
> index 7a300e69d..c14840cf0 100644
> --- a/newlib/libc/include/glob.h
> +++ b/newlib/libc/include/glob.h
> @@ -80,6 +80,7 @@ typedef struct {
>  
>  #define	GLOB_NOSPACE	(-1)	/* Malloc call failed. */
>  #define	GLOB_ABEND	(-2)	/* Unignored error. */
> +#define	GLOB_NOMATCH	(-3)	/* No match and GLOB_NOCHECK not set. */
>  
>  __BEGIN_DECLS
>  int	glob(const char *__restrict, int, int (*)(const char *, int), 
> diff --git a/newlib/libc/posix/glob.c b/newlib/libc/posix/glob.c
> index 5e6c2fcba..20eec0263 100644
> --- a/newlib/libc/posix/glob.c
> +++ b/newlib/libc/posix/glob.c
> @@ -502,11 +502,14 @@ glob0(pattern, pglob, limit)
>  	 * and the pattern did not contain any magic characters
>  	 * GLOB_NOMAGIC is there just for compatibility with csh.
>  	 */
> -	if (pglob->gl_pathc == oldpathc &&
> -	    ((pglob->gl_flags & GLOB_NOCHECK) ||
> -	      ((pglob->gl_flags & GLOB_NOMAGIC) &&
> -	       !(pglob->gl_flags & GLOB_MAGCHAR))))
> -		return(globextend(pattern, pglob, limit));
> +	if (pglob->gl_pathc == oldpathc) {
> +		if ((pglob->gl_flags & GLOB_NOCHECK) ||
> +		    ((pglob->gl_flags & GLOB_NOMAGIC) &&
> +		    !(pglob->gl_flags & GLOB_MAGCHAR)))
> +			return(globextend(pattern, pglob, limit));
> +		else
> +			return(GLOB_NOMATCH);
> +	}
>  	else if (!(pglob->gl_flags & GLOB_NOSORT))
>  		qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
>  		    pglob->gl_pathc - oldpathc, sizeof(char *), compare);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.