From 3b7cee95ac741ee24b8edd36095cc30e3377a23c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 23 Sep 1998 01:25:33 +0000 Subject: look at the CAP_NT_SMBS bit in the client capabilities to determine if we should serve up volume labels as ascii or unicode. NT wants ascii, W95 wants unicode. It's a crazy protocol! (This used to be commit 24b8a757ae2899d54dd2b2f091a3c0de6de84dbb) --- source3/smbd/reply.c | 8 +++++--- source3/smbd/trans2.c | 35 ++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 18 deletions(-) (limited to 'source3') diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 254fb32a51..21fa2e9a79 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -41,6 +41,8 @@ extern pstring sesssetup_user; extern fstring global_myworkgroup; extern int Client; extern int global_oplock_break; +uint32 global_client_caps = 0; + /**************************************************************************** report a possible attack via the password buffer overflow bug @@ -489,11 +491,11 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int } else { uint16 passlen1 = SVAL(inbuf,smb_vwv7); uint16 passlen2 = SVAL(inbuf,smb_vwv8); - uint32 client_caps = IVAL(inbuf,smb_vwv11); enum remote_arch_types ra_type = get_remote_arch(); - char *p = smb_buf(inbuf); + global_client_caps = IVAL(inbuf,smb_vwv11); + /* client_caps is used as final determination if client is NT or Win95. This is needed to return the correct error codes in some circumstances. @@ -501,7 +503,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int if(ra_type == RA_WINNT || ra_type == RA_WIN95) { - if(client_caps & (CAP_NT_SMBS | CAP_STATUS32)) + if(global_client_caps & (CAP_NT_SMBS | CAP_STATUS32)) set_remote_arch( RA_WINNT); else set_remote_arch( RA_WIN95); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 5c8c64a63c..fe44965674 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1069,7 +1069,8 @@ static int call_trans2qfsinfo(connection_struct *conn, char *vname = volume_label(SNUM(conn)); int snum = SNUM(conn); char *fstype = lp_fstype(SNUM(conn)); - + extern uint32 global_client_caps; + DEBUG(3,("call_trans2qfsinfo: level = %d\n", info_level)); if(dos_stat(".",&st)!=0) { @@ -1131,24 +1132,28 @@ static int call_trans2qfsinfo(connection_struct *conn, break; case SMB_QUERY_FS_VOLUME_INFO: - /* NT4 always serves this up as unicode. JRA had noted this was - * not the case in an earlier comment. What is going on? I - * tested with Win95 -> NT and a sniff definately showed - * unicode. The volume label now shows up correctly under Win95 - * with unicode here (tridge, Sep98) - */ - - data_len = 18 + 2*strlen(vname); - /* * Add volume serial number - hash of a combination of * the called hostname and the service name. */ - SIVAL(pdata,8,str_checksum(lp_servicename(snum)) ^ (str_checksum(local_machine)<<16) ); - SIVAL(pdata,12,strlen(vname)*2); - PutUniCode(pdata+18,vname); - DEBUG(5,("call_trans2qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol = %s\n", strlen(vname), - vname)); + SIVAL(pdata,8,str_checksum(lp_servicename(snum)) ^ + (str_checksum(local_machine)<<16)); + + /* NT4 always serves this up as unicode but expects it to be + * delivered as ascii! (tridge && JRA) + */ + if (global_client_caps & CAP_NT_SMBS) { + data_len = 18 + strlen(vname); + SIVAL(pdata,12,strlen(vname)); + pstrcpy(pdata+18,vname); + } else { + data_len = 18 + 2*strlen(vname); + SIVAL(pdata,12,strlen(vname)*2); + PutUniCode(pdata+18,vname); + } + + DEBUG(5,("call_trans2qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol = %s\n", + strlen(vname),vname)); break; case SMB_QUERY_FS_SIZE_INFO: { -- cgit