Fix bug #7733 - Invalid client DOS attributes on create can cause incorrect unix...
authorJeremy Allison <jra@samba.org>
Fri, 15 Oct 2010 20:30:07 +0000 (13:30 -0700)
committerJeremy Allison <jra@samba.org>
Sat, 16 Oct 2010 00:38:21 +0000 (17:38 -0700)
It turns out a client can send an NTCreateX call for a new file, but specify
FILE_ATTRIBUTE_DIRECTORY in the attribute list. Windows silently strips this,
but we don't - causing the unix_mode() function to go through the "mode bits
for new directory" codepath, instead of the "mode bits for new file" codepath.

Jeremy.

source3/smbd/open.c

index 77f33b1cb3030806ea3682cc698596567bc0aef5..10e01203745303c456d0dcbb2b8c67c05534966d 100644 (file)
@@ -1512,6 +1512,12 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 
        ZERO_STRUCT(id);
 
+       /* Windows allows a new file to be created and
+          silently removes a FILE_ATTRIBUTE_DIRECTORY
+          sent by the client. Do the same. */
+
+       new_dos_attributes &= ~FILE_ATTRIBUTE_DIRECTORY;
+
        if (conn->printer) {
                /*
                 * Printers are handled completely differently.
@@ -2469,6 +2475,9 @@ static NTSTATUS open_directory(connection_struct *conn,
 
        SMB_ASSERT(!is_ntfs_stream_smb_fname(smb_dname));
 
+       /* Ensure we have a directory attribute. */
+       file_attributes |= FILE_ATTRIBUTE_DIRECTORY;
+
        DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
                 "share_access = 0x%x create_options = 0x%x, "
                 "create_disposition = 0x%x, file_attributes = 0x%x\n",