diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/ms_fnmatch.c | 31 | ||||
-rw-r--r-- | source3/lib/util.c | 2 |
2 files changed, 22 insertions, 11 deletions
diff --git a/source3/lib/ms_fnmatch.c b/source3/lib/ms_fnmatch.c index bdfb26d0ca..3040dc7f9d 100644 --- a/source3/lib/ms_fnmatch.c +++ b/source3/lib/ms_fnmatch.c @@ -55,7 +55,8 @@ struct max_n { not contain a '.', otherwise it points at the last dot in 'n'. */ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n, - struct max_n *max_n, const smb_ucs2_t *ldot) + struct max_n *max_n, const smb_ucs2_t *ldot, + BOOL is_case_sensitive) { smb_ucs2_t c; int i; @@ -68,7 +69,7 @@ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n, return null_match(p); } for (i=0; n[i]; i++) { - if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) { + if (ms_fnmatch_core(p, n+i, max_n+1, ldot, is_case_sensitive) == 0) { return 0; } } @@ -86,9 +87,9 @@ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n, return -1; } for (i=0; n[i]; i++) { - if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) return 0; + if (ms_fnmatch_core(p, n+i, max_n+1, ldot, is_case_sensitive) == 0) return 0; if (n+i == ldot) { - if (ms_fnmatch_core(p, n+i+1, max_n+1, ldot) == 0) return 0; + if (ms_fnmatch_core(p, n+i+1, max_n+1, ldot, is_case_sensitive) == 0) return 0; if (!max_n->postdot || max_n->postdot > n) max_n->postdot = n; return -1; } @@ -125,8 +126,13 @@ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n, break; default: - if (c != *n && toupper_w(c) != toupper_w(*n)) { - return -1; + if (c != *n) { + if (is_case_sensitive) { + return -1; + } + if (toupper_w(c) != toupper_w(*n)) { + return -1; + } } n++; break; @@ -140,7 +146,8 @@ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n, return -1; } -int ms_fnmatch(const char *pattern, const char *string, enum protocol_types protocol) +int ms_fnmatch(const char *pattern, const char *string, enum protocol_types protocol, + BOOL is_case_sensitive) { wpstring p, s; int ret, count, i; @@ -153,7 +160,11 @@ int ms_fnmatch(const char *pattern, const char *string, enum protocol_types prot if (strpbrk(pattern, "<>*?\"") == NULL) { /* this is not just an optmisation - it is essential for LANMAN1 correctness */ - return StrCaseCmp(pattern, string); + if (is_case_sensitive) { + return strcmp(pattern, string); + } else { + return StrCaseCmp(pattern, string); + } } pstrcpy_wa(p, pattern); @@ -190,7 +201,7 @@ int ms_fnmatch(const char *pattern, const char *string, enum protocol_types prot } } - ret = ms_fnmatch_core(p, s, max_n, strrchr_w(s, UCS2_CHAR('.'))); + ret = ms_fnmatch_core(p, s, max_n, strrchr_w(s, UCS2_CHAR('.')), is_case_sensitive); if (max_n) { free(max_n); @@ -203,5 +214,5 @@ int ms_fnmatch(const char *pattern, const char *string, enum protocol_types prot /* a generic fnmatch function - uses for non-CIFS pattern matching */ int gen_fnmatch(const char *pattern, const char *string) { - return ms_fnmatch(pattern, string, PROTOCOL_NT1); + return ms_fnmatch(pattern, string, PROTOCOL_NT1, False); } diff --git a/source3/lib/util.c b/source3/lib/util.c index 53ce8ab17b..5e88bd896f 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -2325,7 +2325,7 @@ BOOL mask_match(const char *string, char *pattern, BOOL is_case_sensitive) if (strcmp(pattern,".") == 0) return False; - return ms_fnmatch(pattern, string, Protocol) == 0; + return ms_fnmatch(pattern, string, Protocol, is_case_sensitive) == 0; } /******************************************************************* |