You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2011/05/14 13:26:20 UTC

svn commit: r1103050 - /apr/apr/branches/1.4.x/strings/apr_fnmatch.c

Author: wrowe
Date: Sat May 14 11:26:19 2011
New Revision: 1103050

URL: http://svn.apache.org/viewvc?rev=1103050&view=rev
Log:
Fix another edge case, in [x-/] processing, which I can't seem 
to compose the proper test-case to expose.

Refactor a complex test into a very simple test and 
optimize the exception cases to bust the loop early.

Clean up documentation a bit.

Backports: r1103041, r1103046

Modified:
    apr/apr/branches/1.4.x/strings/apr_fnmatch.c

Modified: apr/apr/branches/1.4.x/strings/apr_fnmatch.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/strings/apr_fnmatch.c?rev=1103050&r1=1103049&r2=1103050&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/strings/apr_fnmatch.c (original)
+++ apr/apr/branches/1.4.x/strings/apr_fnmatch.c Sat May 14 11:26:19 2011
@@ -116,17 +116,22 @@ static APR_INLINE int fnmatch_ch(const c
                 break;
 
 leadingclosebrace:
-            /* Look at only well-formed range patterns; ']' is allowed only if escaped,
-             * while '/' is not allowed at all in FNM_PATHNAME mode.
+            /* Look at only well-formed range patterns; 
+             * "x-]" is not allowed unless escaped ("x-\]")
              */
             /* XXX: Fix for locale/MBCS character width */
-            if (((*pattern)[1] == '-') && (*pattern)[2] 
-                    && ((escape && ((*pattern)[2] != '\\'))
-                          ? (((*pattern)[2] != ']') && (!slash || ((*pattern)[2] != '/')))
-                          : (((*pattern)[3]) && (!slash || ((*pattern)[3] != '/'))))) {
+            if (((*pattern)[1] == '-') && ((*pattern)[2] != ']'))
+            {
                 startch = *pattern;
                 *pattern += (escape && ((*pattern)[2] == '\\')) ? 3 : 2;
 
+                /* NOT a properly balanced [expr] pattern, EOS terminated 
+                 * or ranges containing a slash in FNM_PATHNAME mode pattern
+                 * fall out to to the rewind and test '[' literal code path
+                 */
+                if (!**pattern || (slash && (**pattern == '\\')))
+                    break;
+
                 /* XXX: handle locale/MBCS comparison, advance by MBCS char width */
                 if ((**string >= *startch) && (**string <= **pattern))
                     result = 0;
@@ -150,7 +155,9 @@ leadingclosebrace:
             ++*pattern;
         }
 
-        /* NOT a properly balanced [expr] pattern; Rewind to test '[' literal */
+        /* NOT a properly balanced [expr] pattern; Rewind
+         * and reset result to test '[' literal
+         */
         *pattern = mismatch;
         result = APR_FNM_NOMATCH;
     }