diff options
-rw-r--r-- | source3/include/smb.h | 11 | ||||
-rw-r--r-- | source3/smbd/nttrans.c | 25 |
2 files changed, 25 insertions, 11 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index e9352a2fb1..8f54ed7b84 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1199,10 +1199,6 @@ 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 @@ -1246,17 +1242,24 @@ struct bitmap { /* Mapping of generic access rights for files to specific rights. */ +/* This maps to 0x1F01FF */ #define FILE_GENERIC_ALL (STANDARD_RIGHTS_REQUIRED_ACCESS| SYNCHRONIZE_ACCESS|FILE_ALL_ACCESS) +/* This maps to 0x120089 */ #define FILE_GENERIC_READ (STANDARD_RIGHTS_READ_ACCESS|FILE_READ_DATA|FILE_READ_ATTRIBUTES|\ FILE_READ_EA|SYNCHRONIZE_ACCESS) +/* This maps to 0x120116 */ #define FILE_GENERIC_WRITE (STD_RIGHT_READ_CONTROL_ACCESS|FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|\ FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONIZE_ACCESS) #define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE_ACCESS|\ FILE_EXECUTE|SYNCHRONIZE_ACCESS) +/* Share specific rights. */ +#define SHARE_ALL_ACCESS FILE_GENERIC_ALL +#define SHARE_READ_ONLY (FILE_GENERIC_READ|FILE_EXECUTE) + /* Mapping of access rights to UNIX perms. */ #define UNIX_ACCESS_RWX FILE_GENERIC_ALL #define UNIX_ACCESS_R FILE_GENERIC_READ diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 51ed081edb..9094519b3e 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -847,13 +847,12 @@ int reply_ntcreate_and_X(connection_struct *conn, extended_oplock_granted = True; } -#if 0 - /* W2K sends back 42 words here ! If we do the same it breaks offline sync. Go figure... ? JRA. */ - set_message(outbuf,42,0,True); -#else - set_message(outbuf,34,0,True); -#endif - + if (flags & EXTENDED_RESPONSE_REQUIRED) { + set_message(outbuf,42,0,True); + } else { + set_message(outbuf,34,0,True); + } + p = outbuf + smb_vwv2; /* @@ -914,6 +913,18 @@ int reply_ntcreate_and_X(connection_struct *conn, p += 4; SCVAL(p,0,fsp->is_directory ? 1 : 0); + /* Fixme - we must do the same for NTTransCreate and pipe open. */ + if (flags & EXTENDED_RESPONSE_REQUIRED) { + uint32 perms = 0; + p += 26; + if (fsp->is_directory || can_write_to_file(conn, fname, &sbuf)) { + perms = FILE_GENERIC_ALL; + } else { + perms = FILE_GENERIC_READ|FILE_EXECUTE; + } + SIVAL(p,0,perms); + } + DEBUG(5,("reply_ntcreate_and_X: fnum = %d, open name = %s\n", fsp->fnum, fsp->fsp_name)); result = chain_reply(inbuf,outbuf,length,bufsize); |