This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [RFC][BZ #10278] glob() gives inconsistent results with trailing "/"
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: Carlos O'Donell <carlos at redhat dot com>
- Cc: eblake at redhat dot com, libc-alpha at sourceware dot org
- Date: Fri, 11 Oct 2013 17:24:27 +0200
- Subject: Re: [RFC][BZ #10278] glob() gives inconsistent results with trailing "/"
- Authentication-results: sourceware.org; auth=none
- References: <20131003075937 dot GA22576 at domone dot podge> <524D2FA4 dot 2020403 at redhat dot com>
On Thu, Oct 03, 2013 at 04:49:40AM -0400, Carlos O'Donell wrote:
> On 10/03/2013 03:59 AM, OndÅej BÃlka wrote:
> > Hi,
> >
> > For this bug https://sourceware.org/bugzilla/show_bug.cgi?id=10278 there
> > is a simple fix when we have DIRENT_H defined.
> >
> > For cross platform solution we would need surround this by ifdefs when
> > separator is not slash and handling case of no dirent.
> >
> > Comments?
>
> Sounds correct.
>
> We should add a regression test for this.
>
When I tried add a test I encountered an unexpected result, any insight
into this?
results for glob ("*/*/", GLOB_ALTDIRFUNC)
dir1lev1/dir1lev2/
dir1lev1/dir2lev2/
dir1lev1/dir3lev2/
dir2lev1/dir1lev2/
file2lev1/dir2lev1 *** WRONG
diff --git a/posix/glob.c b/posix/glob.c
index 4c7dce5..de7f7ff 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -276,6 +276,11 @@ glob (pattern, flags, errfunc, pglob)
return -1;
}
+ /* Posix requires all slashes to be matched. This means that with
+ trailing slash we could match only directories. */
+ if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
+ flags |= GLOB_ONLYDIR;
+
if (!(flags & GLOB_DOOFFS))
/* Have to do this so `globfree' knows where to start freeing. It
also makes all the code that uses gl_offs simpler. */
diff --git a/posix/tst-gnuglob.c b/posix/tst-gnuglob.c
index 0c967d0..a8cf92d 100644
--- a/posix/tst-gnuglob.c
+++ b/posix/tst-gnuglob.c
@@ -358,7 +358,7 @@ test_result (const char *fmt, int flags, glob_t *gl, const char *str[])
break;
if (str[inner] == NULL)
- errstr = ok ? "" : " *** WRONG";
+ errstr = ok ? "" : " *** WRONG";
else
errstr = ok ? "" : " * wrong position";
@@ -483,6 +483,13 @@ main (void)
"/file1lev1",
"/file2lev1");
+ test ("*/*/", 0 , 0,
+ "dir1lev1/dir1lev2/",
+ "dir1lev1/dir2lev2/",
+ "dir1lev1/dir3lev2/",
+ "dir2lev1/dir1lev2/",
+ "foo");
+
test ("", 0, GLOB_NOMATCH, NULL);
test ("", GLOB_NOCHECK, 0, "");