about summary refs log tree commit diff
path: root/posix/fnmatch_loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'posix/fnmatch_loop.c')
-rw-r--r--posix/fnmatch_loop.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c
index 2928037cab..5f6c05710e 100644
--- a/posix/fnmatch_loop.c
+++ b/posix/fnmatch_loop.c
@@ -90,9 +90,31 @@ FCT (pattern, string, no_leading_period, flags)
 	  if (c == L('\0'))
 	    /* The wildcard(s) is/are the last element of the pattern.
 	       If the name is a file name and contains another slash
-	       this does mean it cannot match.  */
-	    return ((flags & FNM_FILE_NAME) && STRCHR (n, L('/')) != NULL
-		    ? FNM_NOMATCH : 0);
+	       this does mean it cannot match.  If the FNM_LEADING_DIR
+	       flag is set and exactly one slash is following, we have
+	       a match.  */
+	    {
+	      int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
+
+	      if (flags & FNM_FILE_NAME)
+		{
+		  const CHAR *slashp = STRCHR (n, L('/'));
+
+		  if (flags & FNM_LEADING_DIR)
+		    {
+		      if (slashp != NULL
+			  && STRCHR (slashp + 1, L('/')) == NULL)
+			result = 0;
+		    }
+		  else
+		    {
+		      if (slashp == NULL)
+			result = 0;
+		    }
+		}
+
+	      return result;
+	    }
 	  else
 	    {
 	      const CHAR *endp;