diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/mangle.c | 9 | ||||
-rw-r--r-- | source3/smbd/reply.c | 32 | ||||
-rw-r--r-- | source3/smbd/server.c | 2 |
3 files changed, 28 insertions, 15 deletions
diff --git a/source3/smbd/mangle.c b/source3/smbd/mangle.c index 177a34c975..6d98d9e39c 100644 --- a/source3/smbd/mangle.c +++ b/source3/smbd/mangle.c @@ -383,13 +383,10 @@ BOOL is_mangled(char *s) /**************************************************************************** return a base 36 character. v must be from 0 to 35. ****************************************************************************/ -static char base36(int v) +static char base36(unsigned int v) { - v = v % 36; - if (v < 10) - return('0'+v); - else /* needed to work around a DEC C compiler bug */ - return('A' + (v-10)); + static char basechars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + return basechars[v % 36]; } diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 7b8f4a502f..89b07f1b9e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -181,7 +181,7 @@ int reply_tcon(char *inbuf,char *outbuf) int outsize = 0; int uid = SVAL(inbuf,smb_uid); int vuid; - int pwlen; + int pwlen=0; *service = *user = *password = *dev = 0; @@ -218,6 +218,7 @@ int reply_tcon_and_X(char *inbuf,char *outbuf,int length,int bufsize) int uid = SVAL(inbuf,smb_uid); int vuid; int passlen = SVAL(inbuf,smb_vwv3); + BOOL doencrypt = SMBENCRYPT(); *service = *user = *password = *devicename = 0; @@ -231,8 +232,15 @@ int reply_tcon_and_X(char *inbuf,char *outbuf,int length,int bufsize) char *path; char *p; memcpy(password,smb_buf(inbuf),passlen); - password[passlen]=0; + password[passlen]=0; path = smb_buf(inbuf) + passlen; + + if (!doencrypt || passlen != 24) { + if (strequal(password," ")) + *password = 0; + passlen = strlen(password); + } + DEBUG(4,("parsing net-path %s, passlen=%d\n",path,passlen)); strcpy(service,path+2); p = strchr(service,'\\'); @@ -315,7 +323,7 @@ int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize) int smb_mpxmax; int smb_vc_num; uint32 smb_sesskey; - int smb_apasslen; + int smb_apasslen = 0; pstring smb_apasswd; int smb_ntpasslen = 0; pstring smb_ntpasswd; @@ -343,6 +351,9 @@ int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize) BOOL doencrypt = SMBENCRYPT(); char *p = smb_buf(inbuf); + if (passlen1 != 24 && passlen2 != 24) + doencrypt = False; + if(doencrypt) { /* Save the lanman2 password and the NT md4 password. */ smb_apasslen = passlen1; @@ -366,17 +377,22 @@ int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize) } /* we use the first password that they gave */ smb_apasslen = passlen1; - StrnCpy(smb_apasswd,p,smb_apasslen); + StrnCpy(smb_apasswd,p,smb_apasslen); + + /* trim the password */ + smb_apasslen = strlen(smb_apasswd); + + /* wfwg sometimes uses a space instead of a null */ + if (strequal(smb_apasswd," ")) { + smb_apasslen = 0; + *smb_apasswd = 0; + } } p += passlen1 + passlen2; strcpy(user,p); p = skip_string(p,1); DEBUG(3,("Domain=[%s] NativeOS=[%s] NativeLanMan=[%s]\n", p,skip_string(p,1),skip_string(p,2))); - - /* now work around the Win95 bug */ - if(!doencrypt && smb_apasslen==24) - smb_apasslen = strlen(smb_apasswd); } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index e0e9838a74..5db62426ca 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -841,7 +841,7 @@ void open_file(int fnum,int cnum,char *fname1,int flags,int mode) Files[fnum].print_file = Connections[cnum].printer; Files[fnum].modified = False; Files[fnum].cnum = cnum; - string_set(&Files[fnum].name,fname); + string_set(&Files[fnum].name,dos_to_unix(fname,False)); Files[fnum].wbmpx_ptr = NULL; /* |