diff options
-rw-r--r-- | source3/lib/ms_fnmatch.c | 4 | ||||
-rw-r--r-- | source3/lib/util.c | 18 | ||||
-rw-r--r-- | source3/smbd/dir.c | 4 |
3 files changed, 21 insertions, 5 deletions
diff --git a/source3/lib/ms_fnmatch.c b/source3/lib/ms_fnmatch.c index a0cbfd2ee2..c7cf54d26b 100644 --- a/source3/lib/ms_fnmatch.c +++ b/source3/lib/ms_fnmatch.c @@ -146,7 +146,7 @@ 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, BOOL translate_pattern, BOOL is_case_sensitive) { wpstring p, s; @@ -179,7 +179,7 @@ int ms_fnmatch(const char *pattern, const char *string, enum protocol_types prot return -1; } - if (protocol <= PROTOCOL_LANMAN2) { + if (translate_pattern) { /* for older negotiated protocols it is possible to translate the pattern to produce a "new style" diff --git a/source3/lib/util.c b/source3/lib/util.c index cd30ef9814..265302d2d4 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -2475,7 +2475,23 @@ BOOL mask_match(const char *string, char *pattern, BOOL is_case_sensitive) if (strcmp(pattern,".") == 0) return False; - return ms_fnmatch(pattern, string, Protocol, is_case_sensitive) == 0; + return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0; +} + +/******************************************************************* + A wrapper that handles case sensitivity and the special handling + of the ".." name. Varient that is only called by old search code which requires + pattern translation. +*******************************************************************/ + +BOOL mask_match_search(const char *string, char *pattern, BOOL is_case_sensitive) +{ + if (strcmp(string,"..") == 0) + string = "."; + if (strcmp(pattern,".") == 0) + return False; + + return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0; } /******************************************************************* diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 6ecdcec461..55f1523865 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -698,7 +698,7 @@ BOOL dir_check_ftype(connection_struct *conn,int mode,int dirtype) static BOOL mangle_mask_match(connection_struct *conn, fstring filename, char *mask) { mangle_map(filename,True,False,SNUM(conn)); - return mask_match(filename,mask,False); + return mask_match_search(filename,mask,False); } /**************************************************************************** @@ -740,7 +740,7 @@ BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype, pstring fname see masktest for a demo */ if ((strcmp(mask,"*.*") == 0) || - mask_match(filename,mask,False) || + mask_match_search(filename,mask,False) || mangle_mask_match(conn,filename,mask)) { if (!mangle_is_8_3(filename, False)) |