diff options
author | Jordan Brown <Jordan.Brown@Sun.COM> | 2009-11-05 14:34:36 -0800 |
---|---|---|
committer | Jordan Brown <Jordan.Brown@Sun.COM> | 2009-11-05 14:34:36 -0800 |
commit | bbf6f00c25b6a2bed23c35eac6d62998ecdb338c (patch) | |
tree | 8cf72fd47362b5b0da2ffe9be7fe7726a3d24426 /usr/src/common/smbsrv/smb_match.c | |
parent | d95ac3ffcdcc13296bb4c53f621f72c0535f32c3 (diff) | |
download | illumos-gate-bbf6f00c25b6a2bed23c35eac6d62998ecdb338c.tar.gz |
6747532 ns_lookup_bypid spams syslog with too many messages
6888836 Not listing all files in a directory of a CIFS share in Windows XP
6812570 Trans2 is missing pass-through levels: FILE_RENAME_INFORMATION (and others)
6888827 Add Unicode codepage support
6865488 libadutils: leak in ldap_lookup_domains_in_forest()
6888708 idmapd crashing periodically. Need cores analyzed.
6891342 invalid, redundant SQL in rule WHERE expressions
6891767 minor cleanups in idmap
6892544 Panic occurred at smb_node_ref+0x7f(ffffffd612297310)
--HG--
rename : usr/src/uts/common/smbsrv/cifs.h => usr/src/uts/common/smbsrv/smb.h
Diffstat (limited to 'usr/src/common/smbsrv/smb_match.c')
-rw-r--r-- | usr/src/common/smbsrv/smb_match.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/usr/src/common/smbsrv/smb_match.c b/usr/src/common/smbsrv/smb_match.c index 0d612b3daf..88758926fe 100644 --- a/usr/src/common/smbsrv/smb_match.c +++ b/usr/src/common/smbsrv/smb_match.c @@ -30,7 +30,8 @@ #include <sys/types.h> #include <sys/sunddi.h> #endif -#include <smbsrv/ctype.h> +#include <smbsrv/string.h> +#include <smbsrv/smb.h> /* * Maximum recursion depth for the wildcard match functions. @@ -80,8 +81,8 @@ smb_match_private(const char *patn, const char *str, int *depth) for (;;) { switch (*patn) { - case 0: - return (*str == 0); + case '\0': + return (*str == '\0'); case '?': if (*str != 0) { @@ -95,7 +96,7 @@ smb_match_private(const char *patn, const char *str, int *depth) case '*': patn += strspn(patn, "*"); - if (*patn == 0) + if (*patn == '\0') return (1); if ((*depth)++ >= SMB_MATCH_DEPTH_MAX) @@ -128,7 +129,8 @@ smb_match83(char *patn, char *str83) char name83[14]; ptr = name83; - for (avail = 8; (avail > 0) && (*patn != '.') && (*patn != 0); + for (avail = SMB_NAME83_BASELEN; + (avail > 0) && (*patn != '.') && (*patn != 0); avail--) { *(ptr++) = *(patn++); } @@ -141,7 +143,7 @@ smb_match83(char *patn, char *str83) else if (*patn != 0) return (0); - for (avail = 3; (avail > 0) && (*patn != 0); avail--) { + for (avail = SMB_NAME83_EXTLEN; (avail > 0) && (*patn != 0); avail--) { *(ptr++) = *(patn++); } if (*patn != 0) @@ -187,8 +189,10 @@ smb_match_ci(char *patn, char *str) static int smb_match_ci_private(const char *patn, const char *str, int *depth) { - const char *p; - int rc; + const char *p; + smb_wchar_t wc1, wc2; + int nbytes1, nbytes2; + int rc; /* * "<" is a special pattern that matches only those names that do @@ -204,8 +208,8 @@ smb_match_ci_private(const char *patn, const char *str, int *depth) for (;;) { switch (*patn) { - case 0: - return (*str == 0); + case '\0': + return (*str == '\0'); case '?': if (*str != 0) { @@ -221,7 +225,7 @@ smb_match_ci_private(const char *patn, const char *str, int *depth) case '*': patn += strspn(patn, "*"); - if (*patn == 0) + if (*patn == '\0') return (1); if ((*depth)++ >= SMB_MATCH_DEPTH_MAX) @@ -236,17 +240,20 @@ smb_match_ci_private(const char *patn, const char *str, int *depth) return (0); default: - if (*str != *patn) { - int c1 = *str; - int c2 = *patn; + nbytes1 = smb_mbtowc(&wc1, patn, MTS_MB_CHAR_MAX); + nbytes2 = smb_mbtowc(&wc2, str, MTS_MB_CHAR_MAX); + if ((nbytes1 == -1) || (nbytes2 == -1)) + return (-1); - c1 = mts_tolower(c1); - c2 = mts_tolower(c2); - if (c1 != c2) + if (wc1 != wc2) { + wc1 = smb_tolower(wc1); + wc2 = smb_tolower(wc2); + if (wc1 != wc2) return (0); } - str++; - patn++; + + patn += nbytes1; + str += nbytes2; continue; } } |