diff options
author | Jeremy Allison <jra@samba.org> | 2007-04-07 05:49:24 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:19:14 -0500 |
commit | bca29ddbba62320204ac9eb098cdaac9a6b03d80 (patch) | |
tree | 12abeb92895cd7099e54595d31103c8e56e22bb1 | |
parent | b86758ebcc9d017594bf16041d4e83b6d8b27ff3 (diff) | |
download | samba-bca29ddbba62320204ac9eb098cdaac9a6b03d80.tar.gz samba-bca29ddbba62320204ac9eb098cdaac9a6b03d80.tar.bz2 samba-bca29ddbba62320204ac9eb098cdaac9a6b03d80.zip |
r22122: Start to fix csc issue with Vista. Make smbd support
the extended 7 word response for tconX rather than the
3 word one we supported previously.
Jeremy.
(This used to be commit 137953226a2d691259e7e84d6ae0dc24755e5a3a)
-rw-r--r-- | source3/include/smb.h | 7 | ||||
-rw-r--r-- | source3/libsmb/cliconnect.c | 1 | ||||
-rw-r--r-- | source3/smbd/reply.c | 23 |
3 files changed, 30 insertions, 1 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index 27c1af1f82..e9352a2fb1 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1199,6 +1199,10 @@ struct bitmap { #define SMB_SUPPORT_SEARCH_BITS 0x0001 #define SMB_SHARE_IN_DFS 0x0002 +/* Share specific rights. */ +#define SHARE_ALL_ACCESS 0x001F01FF +#define SHARE_READ_ONLY 0x001200A9 + /* Named pipe write mode flags. Used in writeX calls. */ #define PIPE_RAW_MODE 0x4 #define PIPE_START_MESSAGE 0x8 @@ -1480,6 +1484,9 @@ char *strdup(char *s); #define FLAGS2_WIN2K_SIGNATURE 0xC852 /* Hack alert ! For now... JRA. */ +/* TCONX Flag (smb_vwv2). */ +#define TCONX_FLAG_EXTENDED_RESPONSE 0x8 + /* Capabilities. see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */ #define CAP_RAW_MODE 0x0001 diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 3b9c477b26..dff098cd01 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -1064,6 +1064,7 @@ BOOL cli_send_tconX(struct cli_state *cli, cli_setup_packet(cli); SSVAL(cli->outbuf,smb_vwv0,0xFF); + SSVAL(cli->outbuf,smb_vwv2,TCONX_FLAG_EXTENDED_RESPONSE); SSVAL(cli->outbuf,smb_vwv3,passlen); p = smb_buf(cli->outbuf); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 5be086f749..d7b3a0fab1 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -452,6 +452,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt int passlen = SVAL(inbuf,smb_vwv3); pstring path; char *p, *q; + uint16 tcon_flags = SVAL(inbuf,smb_vwv2); START_PROFILE(SMBtconX); @@ -522,7 +523,27 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt /* NT sets the fstype of IPC$ to the null string */ const char *fstype = IS_IPC(conn) ? "" : lp_fstype(SNUM(conn)); - set_message(outbuf,3,0,True); + if (tcon_flags & TCONX_FLAG_EXTENDED_RESPONSE) { + /* Return permissions. */ + uint32 perm1 = 0; + uint32 perm2 = 0; + + set_message(outbuf,7,0,True); + + if (IS_IPC(conn)) { + perm1 = FILE_ALL_ACCESS; + perm2 = FILE_ALL_ACCESS; + } else { + perm1 = CAN_WRITE(conn) ? + SHARE_ALL_ACCESS : + SHARE_READ_ONLY; + } + + SIVAL(outbuf, smb_vwv3, perm1); + SIVAL(outbuf, smb_vwv5, perm2); + } else { + set_message(outbuf,3,0,True); + } p = smb_buf(outbuf); p += srvstr_push(outbuf, p, server_devicetype, -1, |