[PATCH] Fix glob() function

Jordi Sanfeliu jordi@fibranet.cat
Sat Aug 17 15:38:22 GMT 2024


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
+		    return(3);	/* GLOB_NOMATCH */
+	}
   	else if (!(pglob->gl_flags & GLOB_NOSORT))
   		qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
   		    pglob->gl_pathc - oldpathc, sizeof(char *), compare);



The following is a simple test program:

# cat glob.c
#include <stdio.h>
#include <glob.h>

int main(void)
{
 	int globres;
 	glob_t globinfo;
 	char *ok1 = "/usr/share/man/man1/ls.[01-9]*";
 	char *ko1 = "/usr/share/man/man1/lsx.[01-9]*";
 	char *ok2 = "glob.c";
 	char *ko2 = "glob.x";

 	globres = glob(ok1, 0, NULL, &globinfo);
 	printf("globres = %d (%s)\n", globres, ok1);
 	globres = glob(ko1, 0, NULL, &globinfo);
 	printf("globres = %d (%s)\n", globres, ko1);

 	globres = glob(ok2, 0, NULL, &globinfo);
 	printf("globres = %d (%s)\n", globres, ok2);
 	globres = glob(ko2, 0, NULL, &globinfo);
 	printf("globres = %d (%s)\n", globres, ko2);

 	return 0;
}


The results before applying the patch were:

# ./glob
globres = 0 (/usr/share/man/man1/ls.[01-9]*)
globres = 0 (/usr/share/man/man1/lsx.[01-9]*)
globres = 0 (glob.c)
globres = 0 (glob.x)


The results after applying the patch are:
# ./glob
globres = 0 (/usr/share/man/man1/ls.[01-9]*)
globres = 3 (/usr/share/man/man1/lsx.[01-9]*)
globres = 0 (glob.c)
globres = 3 (glob.x)


Thanks.

[1] https://mandoc.bsd.lv/
[2] 
https://opensource.apple.com/source/Libinfo/Libinfo-129/util.subproj/glob.c

--
Jordi Sanfeliu
FIBRANET Network Services Provider
https://www.fibranet.cat


More information about the Newlib mailing list