Proper fix for #6898 - Samba duplicates file content on appending. Pointed out by...
authorJeremy Allison <jra@samba.org>
Mon, 23 Nov 2009 23:01:34 +0000 (15:01 -0800)
committerKarolin Seeger <kseeger@samba.org>
Thu, 26 Nov 2009 10:41:12 +0000 (11:41 +0100)
(cherry picked from commit f8bd0559ada056722d7d5ae0286753e7c591650b)
(cherry picked from commit 45bbbb04fb9a8ff8eaa3b64c8cae42c5b8a77027)

source3/include/smb.h
source3/smbd/filename.c
source3/smbd/nttrans.c

index a3acb7c415da2055d1409b63944b92756b39dce2..09689840280c791d9fe410fb16f47bc73ecdb2ec 100644 (file)
@@ -1954,6 +1954,7 @@ struct smb_file_time {
 #define UCF_SAVE_LCOMP                 0x00000001
 #define UCF_ALWAYS_ALLOW_WCARD_LCOMP   0x00000002
 #define UCF_COND_ALLOW_WCARD_LCOMP     0x00000004
+#define UCF_POSIX_PATHNAMES            0x00000008
 
 /*
  * smb_filename
index 5d6661df2a13d1fad1b16e42ed3c6085b55c446b..16e36312bbf78fa472f36ab6e9f6a05f55310086 100644 (file)
@@ -238,7 +238,8 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                }
        }
 
-       posix_pathnames = lp_posix_pathnames();
+       posix_pathnames = (lp_posix_pathnames() ||
+                               (ucf_flags & UCF_POSIX_PATHNAMES));
 
        /*
         * Strip off the stream, and add it back when we're done with the
index 5c6d78089d71077f2cea4d44c32130f7500e3138..9e982911b9c7665cee3515e57999feb48f4854a8 100644 (file)
@@ -418,11 +418,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
        flags = IVAL(req->vwv+3, 1);
        access_mask = IVAL(req->vwv+7, 1);
        file_attributes = IVAL(req->vwv+13, 1);
-       /*
-        * Bug #6898 - clients using Windows opens should
-        * never be able to set this attribute.
-        */
-       file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
        share_access = IVAL(req->vwv+15, 1);
        create_disposition = IVAL(req->vwv+17, 1);
        create_options = IVAL(req->vwv+19, 1);
@@ -483,7 +478,8 @@ void reply_ntcreate_and_X(struct smb_request *req)
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
-                               0,
+                               (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ?
+                                       UCF_POSIX_PATHNAMES : 0,
                                NULL,
                                &smb_fname);
 
@@ -498,6 +494,13 @@ void reply_ntcreate_and_X(struct smb_request *req)
                goto out;
        }
 
+       /*
+        * Bug #6898 - clients using Windows opens should
+        * never be able to set this attribute into the
+        * VFS.
+        */
+       file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
+
        status = SMB_VFS_CREATE_FILE(
                conn,                                   /* conn */
                req,                                    /* req */
@@ -918,11 +921,6 @@ static void call_nt_transact_create(connection_struct *conn,
        flags = IVAL(params,0);
        access_mask = IVAL(params,8);
        file_attributes = IVAL(params,20);
-       /*
-        * Bug #6898 - clients using Windows opens should
-        * never be able to set this attribute.
-        */
-       file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
        share_access = IVAL(params,24);
        create_disposition = IVAL(params,28);
        create_options = IVAL(params,32);
@@ -1004,7 +1002,8 @@ static void call_nt_transact_create(connection_struct *conn,
                                conn,
                                req->flags2 & FLAGS2_DFS_PATHNAMES,
                                fname,
-                               0,
+                               (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ?
+                                       UCF_POSIX_PATHNAMES : 0,
                                NULL,
                                &smb_fname);
 
@@ -1025,6 +1024,13 @@ static void call_nt_transact_create(connection_struct *conn,
                        ? BATCH_OPLOCK : 0;
        }
 
+       /*
+        * Bug #6898 - clients using Windows opens should
+        * never be able to set this attribute into the
+        * VFS.
+        */
+       file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
+
        status = SMB_VFS_CREATE_FILE(
                conn,                                   /* conn */
                req,                                    /* req */