The branch, master has been updated
       via  d1846452e96 vfs: Add VFS_OPEN_HOW_WITH_BACKUP_INTENT
       via  f701faf6677 smbd: Remove "flags2" from open_file_ntcreate()
       via  02d9321ce0c smbd: Pass struct vfs_open_how to open_file()
       via  7c356769870 smbd: Remove "local_flags" from open_file()
       via  6ec031b2d14 smbd: Make open_file() a bit safer
       via  884b9926b9c smbd: Simplify open_file()
       via  814b37bdcf7 smbd: Simplify open_file()
       via  f8645c7a101 smbd: Simplify open_file()
       via  df78af98936 smbd: Simplify an if-condition in open_file()
       via  45005d4b71c smbd: Simplify open_file()
       via  ad7b119b8be smbd: Don't change incoming flags in open_file()
       via  3f4c937dcf9 smbd: Remove variable "accmode" from open_file()
       via  236df26a1f4 smbd: Slightly simplify open_file()
       via  2a53fdeb449 smbd: Pass "struct vfs_open_how" to reopen_from_fsp()
       via  7996c07bd8e smbd: Pass "struct vfs_open_how" to fd_open_atomic()
       via  4b376fff032 smbd: Pass "struct vfs_open_how" to reopen_from_procfd()
      from  cb89ea70b1f libsmb: Use pidl generated parsing for posix file info

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d1846452e96217695c8cb2537f071f287ab210d4
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Sep 1 14:51:47 2023 +0200

    vfs: Add VFS_OPEN_HOW_WITH_BACKUP_INTENT
    
    Indicate BACKUP_INTENT to vfs_openat(). Why? I have a customer request
    who wants to add O_NOATIME in this case to avoid metadata updates when
    a backup or virus-checking application comes along.
    
    This does not fully handle BACKUP_INTENT correctly, this would require
    become_root() appropriately. We might want to do that later after a
    lot of careful security audit, but this patch independently might
    already provide some infrastructure for it.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Thu Oct  5 14:00:33 UTC 2023 on atb-devel-224

commit f701faf6677100bef6cbcf7f3d5c973f76a6bb49
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 15:55:26 2023 +0200

    smbd: Remove "flags2" from open_file_ntcreate()
    
    "flags" carried just the O_ACCMODE bits, "flags2" everything
    else. Unify them.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 02d9321ce0c9fd5b5968ca950cfa3b2eb2a768fc
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 15:36:01 2023 +0200

    smbd: Pass struct vfs_open_how to open_file()
    
    We want to pass BACKUP_INTENT down into reopen_from_fsp, and the
    elegant way is to do this via vfs_open_how.resolve.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 7c35676987053fa4e51c1fc2ee2cfb1951aad708
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 15:27:46 2023 +0200

    smbd: Remove "local_flags" from open_file()
    
    This needs close review. I could not see where we were actually
    referencing the original flags in a way that would not be available in
    local_flags. The reason for this patch is that I want to pass in
    vfs_open_how into open_file(), and the distinction between flags and
    local_flags made this significantly harder to understand for me.
    
    The only place where we really used both versions is the DBG_NOTICE in
    the last hunk, and this will come back in the next patch.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 6ec031b2d146962a414da69694d298c00df0c517
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 15:25:07 2023 +0200

    smbd: Make open_file() a bit safer
    
    Move adding O_RDWR before the check for read only shares. I haven't
    been able to pass this condition through SMB, but in any case we
    should not accidentially open with O_RDWR in the !CAN_WRITE(conn)
    case.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 884b9926b9ce5176e861bffd3ab62dec642ee786
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:59:29 2023 +0200

    smbd: Simplify open_file()
    
    Simplify an if-condition:
    
    We have to return NT_STATUS_OBJECT_NAME_INVALID even if we're not
    creating. In fact, we probably should not end up in open_file() if
    we're open a Windows file with a wildcard.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 814b37bdcf7eec3c68f1574028dc9c417029e80f
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Sep 1 16:33:04 2023 +0200

    smbd: Simplify open_file()
    
    We have extracted FSP_POSIX_FLAGS_PATHNAMES above.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit f8645c7a1014a2d3f655c453ae833de3c83776b9
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:53:18 2023 +0200

    smbd: Simplify open_file()
    
    We handle O_TRUNC further down anyway by passing local_flags&~O_TRUNC to
    reopen_from_fsp(). No need for this FIFO special case.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit df78af98936774cc1c01729eb4280877cbc05ff6
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:50:05 2023 +0200

    smbd: Simplify an if-condition in open_file()
    
    We use the plain (flags&O_TRUNC) a few lines above, make the
    if-condition a bit more readable.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 45005d4b71cfed06fad2f12ee17f2b8c82eb16ac
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:46:21 2023 +0200

    smbd: Simplify open_file()
    
    We can unconditionally just and-out O_CREAT from local_flags, so
    remove an if-condition.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit ad7b119b8be325c8d140676f535042f87aecf1ae
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:44:37 2023 +0200

    smbd: Don't change incoming flags in open_file()
    
    This will be part of a const struct vfs_open_how soon. Further down in
    this function we don't look at O_CREAT or O_EXCL of "flags" anymore
    anyway.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 3f4c937dcf92fb875bb178a142526b31502cd180
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 5 14:40:30 2023 +0200

    smbd: Remove variable "accmode" from open_file()
    
    We directly look at the flags in many other places in this function,
    so do this also for O_ACCMODE for clarity.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 236df26a1f4451f5e7fd66fe52ce7fda77bc9abf
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Sep 1 16:31:03 2023 +0200

    smbd: Slightly simplify open_file()
    
    Replace "truncating" variable reference with what it was defined
    as. We use "(flags & O_TRUNC)" a few lines above, so it can't be that
    bad.
    
    After we set it to "false" further down, it was never used again.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 2a53fdeb449f4a8521ee0f82026dfbdf8b38928b
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Aug 31 16:26:57 2023 +0200

    smbd: Pass "struct vfs_open_how" to reopen_from_fsp()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 7996c07bd8e943bbc75da0beaca849eff8c87aa0
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Aug 31 15:04:18 2023 +0200

    smbd: Pass "struct vfs_open_how" to fd_open_atomic()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 4b376fff0320f63db73b4754ea86d7f85cb3a2c9
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Aug 31 14:59:47 2023 +0200

    smbd: Pass "struct vfs_open_how" to reopen_from_procfd()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/vfs.h         |   1 +
 source3/modules/vfs_default.c |   3 +-
 source3/smbd/open.c           | 258 +++++++++++++++++++++---------------------
 3 files changed, 131 insertions(+), 131 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 8ada8d8aadf..1e2e88d65ce 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -908,6 +908,7 @@ struct vfs_aio_state {
 };
 
 #define VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS 1
+#define VFS_OPEN_HOW_WITH_BACKUP_INTENT 2
 
 struct vfs_open_how {
        int flags;
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 1d4b9b1a840..7fa6872d171 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -664,7 +664,8 @@ static int vfswrap_openat(vfs_handle_struct *handle,
 
        START_PROFILE(syscall_openat);
 
-       if (how->resolve & ~VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS) {
+       if (how->resolve & ~(VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS |
+                            VFS_OPEN_HOW_WITH_BACKUP_INTENT)) {
                errno = ENOSYS;
                result = -1;
                goto out;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 87719eec06e..d912acbb409 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -1113,11 +1113,10 @@ static NTSTATUS change_dir_owner_to_parent_fsp(struct 
files_struct *parent_fsp,
 static NTSTATUS fd_open_atomic(struct files_struct *dirfsp,
                               struct smb_filename *smb_fname,
                               files_struct *fsp,
-                              int flags,
-                              mode_t mode,
+                              const struct vfs_open_how *_how,
                               bool *file_created)
 {
-       struct vfs_open_how how = { .flags = flags, .mode = mode, };
+       struct vfs_open_how how = *_how;
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        NTSTATUS retry_status;
        bool file_existed = VALID_STAT(smb_fname->st);
@@ -1168,10 +1167,10 @@ static NTSTATUS fd_open_atomic(struct files_struct 
*dirfsp,
         */
 
        if (file_existed) {
-               how.flags = flags & ~(O_CREAT);
+               how.flags = _how->flags & ~(O_CREAT);
                retry_status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
        } else {
-               how.flags = flags | O_EXCL;
+               how.flags = _how->flags | O_EXCL;
                retry_status = NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
@@ -1189,9 +1188,9 @@ static NTSTATUS fd_open_atomic(struct files_struct 
*dirfsp,
                          file_existed ? "existed" : "did not exist");
 
                if (file_existed) {
-                       how.flags = flags & ~(O_CREAT);
+                       how.flags = _how->flags & ~(O_CREAT);
                } else {
-                       how.flags = flags | O_EXCL;
+                       how.flags = _how->flags | O_EXCL;
                }
 
                status = fd_openat(dirfsp, smb_fname, fsp, &how);
@@ -1202,10 +1201,8 @@ static NTSTATUS fd_open_atomic(struct files_struct 
*dirfsp,
 }
 
 static NTSTATUS reopen_from_procfd(struct files_struct *fsp,
-                                  int flags,
-                                  mode_t mode)
+                                  const struct vfs_open_how *how)
 {
-       struct vfs_open_how how = { .flags = flags, .mode = mode };
        struct smb_filename proc_fname;
        const char *p = NULL;
        char buf[PATH_MAX];
@@ -1246,7 +1243,7 @@ static NTSTATUS reopen_from_procfd(struct files_struct 
*fsp,
                                fsp->conn->cwd_fsp,
                                &proc_fname,
                                fsp,
-                               &how);
+                               how);
        if (new_fd == -1) {
                status = map_nt_error_from_unix(errno);
                fd_close(fsp);
@@ -1265,8 +1262,7 @@ static NTSTATUS reopen_from_procfd(struct files_struct 
*fsp,
 static NTSTATUS reopen_from_fsp(struct files_struct *dirfsp,
                                struct smb_filename *smb_fname,
                                struct files_struct *fsp,
-                               int flags,
-                               mode_t mode,
+                               const struct vfs_open_how *how,
                                bool *p_file_created)
 {
        bool __unused_file_created = false;
@@ -1281,9 +1277,7 @@ static NTSTATUS reopen_from_fsp(struct files_struct 
*dirfsp,
         *       SMB_VFS_REOPEN_FSP()?
         */
 
-       status = reopen_from_procfd(fsp,
-                                   flags,
-                                   mode);
+       status = reopen_from_procfd(fsp, how);
        if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
                return status;
        }
@@ -1299,13 +1293,7 @@ static NTSTATUS reopen_from_fsp(struct files_struct 
*dirfsp,
 
        fsp->fsp_flags.is_pathref = false;
 
-       status = fd_open_atomic(
-               dirfsp,
-               smb_fname,
-               fsp,
-               flags,
-               mode,
-               p_file_created);
+       status = fd_open_atomic(dirfsp, smb_fname, fsp, how, p_file_created);
        return status;
 }
 
@@ -1313,22 +1301,21 @@ static NTSTATUS reopen_from_fsp(struct files_struct 
*dirfsp,
  Open a file.
 ****************************************************************************/
 
-static NTSTATUS open_file(struct smb_request *req,
-                         struct files_struct *dirfsp,
-                         struct smb_filename *smb_fname_atname,
-                         files_struct *fsp,
-                         int flags,
-                         mode_t unx_mode,
-                         uint32_t access_mask, /* client requested access 
mask. */
-                         uint32_t open_access_mask, /* what we're actually 
using in the open. */
-                         uint32_t private_flags,
-                         bool *p_file_created)
+static NTSTATUS open_file(
+       struct smb_request *req,
+       struct files_struct *dirfsp,
+       struct smb_filename *smb_fname_atname,
+       files_struct *fsp,
+       const struct vfs_open_how *_how,
+       uint32_t access_mask,      /* client requested access mask. */
+       uint32_t open_access_mask, /* what we're actually using in the open. */
+       uint32_t private_flags,
+       bool *p_file_created)
 {
        connection_struct *conn = fsp->conn;
        struct smb_filename *smb_fname = fsp->fsp_name;
+       struct vfs_open_how how = *_how;
        NTSTATUS status = NT_STATUS_OK;
-       int accmode = (flags & O_ACCMODE);
-       int local_flags = flags;
        bool file_existed = VALID_STAT(fsp->fsp_name->st);
        const uint32_t need_fd_mask =
                FILE_READ_DATA |
@@ -1336,8 +1323,7 @@ static NTSTATUS open_file(struct smb_request *req,
                FILE_APPEND_DATA |
                FILE_EXECUTE |
                SEC_FLAG_SYSTEM_SECURITY;
-       bool creating = !file_existed && (flags & O_CREAT);
-       bool truncating = (flags & O_TRUNC);
+       bool creating = !file_existed && (how.flags & O_CREAT);
        bool open_fd = false;
        bool posix_open = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
 
@@ -1349,6 +1335,24 @@ static NTSTATUS open_file(struct smb_request *req,
                return NT_STATUS_FILE_IS_A_DIRECTORY;
        }
 
+       /*
+        * This little piece of insanity is inspired by the
+        * fact that an NT client can open a file for O_RDONLY,
+        * but set the create disposition to FILE_EXISTS_TRUNCATE.
+        * If the client *can* write to the file, then it expects to
+        * truncate the file, even though it is opening for readonly.
+        * Quicken uses this stupid trick in backup file creation...
+        * Thanks *greatly* to "David W. Chapman Jr." <dw...@inethouston.net>
+        * for helping track this one down. It didn't bite us in 2.0.x
+        * as we always opened files read-write in that release. JRA.
+        */
+
+       if (((how.flags & O_ACCMODE) == O_RDONLY) && (how.flags & O_TRUNC)) {
+               DBG_DEBUG("truncate requested on read-only open for file %s\n",
+                         smb_fname_str_dbg(smb_fname));
+               how.flags = (how.flags & ~O_ACCMODE) | O_RDWR;
+       }
+
        /* Check permissions */
 
        /*
@@ -1363,45 +1367,26 @@ static NTSTATUS open_file(struct smb_request *req,
 
        if (!CAN_WRITE(conn)) {
                /* It's a read-only share - fail if we wanted to write. */
-               if(accmode != O_RDONLY || (flags & O_TRUNC) || (flags & 
O_APPEND)) {
+               if ((how.flags & O_ACCMODE) != O_RDONLY ||
+                   (how.flags & O_TRUNC) || (how.flags & O_APPEND)) {
                        DEBUG(3,("Permission denied opening %s\n",
                                 smb_fname_str_dbg(smb_fname)));
                        return NT_STATUS_ACCESS_DENIED;
                }
-               if (flags & O_CREAT) {
-                       /* We don't want to write - but we must make sure that
-                          O_CREAT doesn't create the file if we have write
-                          access into the directory.
-                       */
-                       flags &= ~(O_CREAT|O_EXCL);
-                       local_flags &= ~(O_CREAT|O_EXCL);
-               }
-       }
-
-       /*
-        * This little piece of insanity is inspired by the
-        * fact that an NT client can open a file for O_RDONLY,
-        * but set the create disposition to FILE_EXISTS_TRUNCATE.
-        * If the client *can* write to the file, then it expects to
-        * truncate the file, even though it is opening for readonly.
-        * Quicken uses this stupid trick in backup file creation...
-        * Thanks *greatly* to "David W. Chapman Jr." <dw...@inethouston.net>
-        * for helping track this one down. It didn't bite us in 2.0.x
-        * as we always opened files read-write in that release. JRA.
-        */
-
-       if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
-               DEBUG(10,("open_file: truncate requested on read-only open "
-                         "for file %s\n", smb_fname_str_dbg(smb_fname)));
-               local_flags = (flags & ~O_ACCMODE)|O_RDWR;
+               /*
+                * We don't want to write - but we must make sure that
+                * O_CREAT doesn't create the file if we have write
+                * access into the directory.
+                */
+               how.flags &= ~(O_CREAT | O_EXCL);
        }
 
-       if ((open_access_mask & need_fd_mask) || creating || truncating) {
+       if ((open_access_mask & need_fd_mask) || creating ||
+           (how.flags & O_TRUNC)) {
                open_fd = true;
        }
 
        if (open_fd) {
-               const char *wild;
                int ret;
 
 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
@@ -1412,26 +1397,26 @@ static NTSTATUS open_file(struct smb_request *req,
                 */
 
                if (file_existed && S_ISFIFO(smb_fname->st.st_ex_mode)) {
-                       local_flags &= ~O_TRUNC; /* Can't truncate a FIFO. */
-                       local_flags |= O_NONBLOCK;
-                       truncating = false;
+                       how.flags |= O_NONBLOCK;
                }
 #endif
 
-               /* Don't create files with Microsoft wildcard characters. */
-               if (fsp_is_alternate_stream(fsp)) {
+               if (!posix_open) {
+                       const char *wild = smb_fname->base_name;
                        /*
-                        * wildcard characters are allowed in stream names
-                        * only test the basefilename
+                        * Don't open files with Microsoft wildcard characters.
                         */
-                       wild = fsp->base_fsp->fsp_name->base_name;
-               } else {
-                       wild = smb_fname->base_name;
-               }
-               if ((local_flags & O_CREAT) && !file_existed &&
-                   !(fsp->posix_flags & FSP_POSIX_FLAGS_PATHNAMES) &&
-                   ms_has_wild(wild))  {
-                       return NT_STATUS_OBJECT_NAME_INVALID;
+                       if (fsp_is_alternate_stream(fsp)) {
+                               /*
+                                * wildcard characters are allowed in stream
+                                * names only test the basefilename
+                                */
+                               wild = fsp->base_fsp->fsp_name->base_name;
+                       }
+
+                       if (ms_has_wild(wild)) {
+                               return NT_STATUS_OBJECT_NAME_INVALID;
+                       }
                }
 
                /* Can we access this file ? */
@@ -1471,7 +1456,7 @@ static NTSTATUS open_file(struct smb_request *req,
                        }
 
                        if (!file_existed) {
-                               if (!(local_flags & O_CREAT)) {
+                               if (!(how.flags & O_CREAT)) {
                                        /* File didn't exist and no O_CREAT. */
                                        return NT_STATUS_OBJECT_NAME_NOT_FOUND;
                                }
@@ -1496,11 +1481,11 @@ static NTSTATUS open_file(struct smb_request *req,
                 * Actually do the open - if O_TRUNC is needed handle it
                 * below under the share mode lock.
                 */
+               how.flags &= ~O_TRUNC;
                status = reopen_from_fsp(dirfsp,
                                         smb_fname_atname,
                                         fsp,
-                                        local_flags & ~O_TRUNC,
-                                        unx_mode,
+                                        &how,
                                         p_file_created);
                if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
                        /*
@@ -1513,13 +1498,16 @@ static NTSTATUS open_file(struct smb_request *req,
                        status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
                }
                if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
-                                "(flags=%d)\n", smb_fname_str_dbg(smb_fname),
-                                nt_errstr(status),local_flags,flags));
+                       DBG_NOTICE("Error opening file %s (%s) (in_flags=%d) "
+                                  "(flags=%d)\n",
+                                  smb_fname_str_dbg(smb_fname),
+                                  nt_errstr(status),
+                                  _how->flags,
+                                  how.flags);
                        return status;
                }
 
-               if (local_flags & O_NONBLOCK) {
+               if (how.flags & O_NONBLOCK) {
                        /*
                         * GPFS can return ETIMEDOUT for pread on
                         * nonblocking file descriptors when files
@@ -1551,7 +1539,7 @@ static NTSTATUS open_file(struct smb_request *req,
                                inherit_access_posix_acl(conn,
                                                         dirfsp,
                                                         smb_fname,
-                                                        unx_mode);
+                                                        how.mode);
                                need_re_stat = true;
                        }
 
@@ -3789,7 +3777,6 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
 {
        struct smb_filename *smb_fname = fsp->fsp_name;
        int flags=0;
-       int flags2=0;
        bool file_existed = VALID_STAT(smb_fname->st);
        bool def_acl = False;
        bool posix_open = False;
@@ -3977,7 +3964,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
                        return NT_STATUS_INVALID_PARAMETER;
        }
 
-       flags2 = disposition_to_open_flags(create_disposition);
+       flags = disposition_to_open_flags(create_disposition);
 
        /* We only care about matching attributes on file exists and
         * overwrite. */
@@ -4014,7 +4001,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
 
        open_access_mask = access_mask;
 
-       if (flags2 & O_TRUNC) {
+       if (flags & O_TRUNC) {
                open_access_mask |= FILE_WRITE_DATA; /* This will cause oplock 
breaks. */
        }
 
@@ -4044,7 +4031,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
         * mean the same thing under DOS and Unix.
         */
 
-       flags = calculate_open_access_flags(access_mask, private_flags);
+       flags |= calculate_open_access_flags(access_mask, private_flags);
 
        /*
         * Currently we only look at FILE_WRITE_THROUGH for create options.
@@ -4052,12 +4039,12 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
 
 #if defined(O_SYNC)
        if ((create_options & FILE_WRITE_THROUGH) && 
lp_strict_sync(SNUM(conn))) {
-               flags2 |= O_SYNC;
+               flags |= O_SYNC;
        }
 #endif /* O_SYNC */
 
        if (posix_open && (access_mask & FILE_APPEND_DATA)) {
-               flags2 |= O_APPEND;
+               flags |= O_APPEND;
        }
 
        if (!posix_open && !CAN_WRITE(conn)) {
@@ -4066,7 +4053,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
                 * O_CREAT or O_TRUNC are set, but for compatibility with
                 * older versions of Samba we just AND them out.
                 */
-               flags2 &= ~(O_CREAT|O_TRUNC);
+               flags &= ~(O_CREAT | O_TRUNC);
        }
 
        /*
@@ -4081,13 +4068,13 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
         * oplock we must periodically poll for available open
         * using O_NONBLOCK.
         */
-       flags2 |= O_NONBLOCK;
+       flags |= O_NONBLOCK;
 
        /*
         * Ensure we can't write on a read-only share or file.
         */
 
-       if (flags != O_RDONLY && file_existed &&
+       if (((flags & O_ACCMODE) != O_RDONLY) && file_existed &&
            (!CAN_WRITE(conn) || IS_DOS_READONLY(existing_dos_attributes))) {
                DEBUG(5,("open_file_ntcreate: write access requested for "
                         "file %s on read only %s\n",
@@ -4113,9 +4100,8 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
                fsp->posix_flags |= FSP_POSIX_FLAGS_ALL;
        }
 
-       if ((create_options & FILE_DELETE_ON_CLOSE) &&
-                       (flags2 & O_CREAT) &&
-                       !file_existed) {
+       if ((create_options & FILE_DELETE_ON_CLOSE) && (flags & O_CREAT) &&
+           !file_existed) {
                /* Delete on close semantics for new files. */
                status = can_set_delete_on_close(fsp,
                                                new_dos_attributes);
@@ -4129,28 +4115,39 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
         * Ensure we pay attention to default ACLs on directories if required.
         */
 
-        if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
-           (def_acl = directory_has_default_acl_fsp(parent_dir_fname->fsp)))
-       {
+       if ((flags & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
+           (def_acl = directory_has_default_acl_fsp(parent_dir_fname->fsp))) {
                unx_mode = (0777 & lp_create_mask(SNUM(conn)));
        }
 
-       DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o, "
-               "access_mask = 0x%x, open_access_mask = 0x%x\n",
-                (unsigned int)flags, (unsigned int)flags2,
-                (unsigned int)unx_mode, (unsigned int)access_mask,
-                (unsigned int)open_access_mask));
-
-       fsp_open = open_file(req,
-                            parent_dir_fname->fsp,
-                            smb_fname_atname,
-                            fsp,
-                            flags|flags2,
-                            unx_mode,
-                            access_mask,
-                            open_access_mask,
-                            private_flags,
-                            &new_file_created);
+       DEBUG(4,
+             ("calling open_file with flags=0x%X mode=0%o, "
+              "access_mask = 0x%x, open_access_mask = 0x%x\n",
+              (unsigned int)flags,
+              (unsigned int)unx_mode,
+              (unsigned int)access_mask,
+              (unsigned int)open_access_mask));
+
+       {
+               struct vfs_open_how how = {
+                       .flags = flags,
+                       .mode = unx_mode,
+               };
+
+               if (create_options & FILE_OPEN_FOR_BACKUP_INTENT) {
+                       how.resolve |= VFS_OPEN_HOW_WITH_BACKUP_INTENT;
+               }
+
+               fsp_open = open_file(req,
+                                    parent_dir_fname->fsp,
+                                    smb_fname_atname,
+                                    fsp,
+                                    &how,
+                                    access_mask,
+                                    open_access_mask,
+                                    private_flags,
+                                    &new_file_created);
+       }
        if (NT_STATUS_EQUAL(fsp_open, NT_STATUS_NETWORK_BUSY)) {
                if (file_existed && S_ISFIFO(fsp->fsp_name->st.st_ex_mode)) {
                        DEBUG(10, ("FIFO busy\n"));
@@ -4262,7 +4259,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
        if (new_file_created) {
                info = FILE_WAS_CREATED;
        } else {
-               if (flags2 & O_TRUNC) {
+               if (flags & O_TRUNC) {
                        info = FILE_WAS_OVERWRITTEN;
                } else {


-- 
Samba Shared Repository

Reply via email to