summaryrefslogtreecommitdiff
path: root/usr/src/common/smbsrv/smb_match.c
diff options
context:
space:
mode:
authorJordan Brown <Jordan.Brown@Sun.COM>2009-11-05 14:34:36 -0800
committerJordan Brown <Jordan.Brown@Sun.COM>2009-11-05 14:34:36 -0800
commitbbf6f00c25b6a2bed23c35eac6d62998ecdb338c (patch)
tree8cf72fd47362b5b0da2ffe9be7fe7726a3d24426 /usr/src/common/smbsrv/smb_match.c
parentd95ac3ffcdcc13296bb4c53f621f72c0535f32c3 (diff)
downloadillumos-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.c45
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;
}
}