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;
}