The branch, master has been updated
       via  edc4c910f27 vfs: Simplify streams_depot_openat()
       via  57bcbbcacde smbd: Don't loose base_fsp statinfo in non_widelink_open
       via  b15c2497577 vfs: streams_xattr uses fsetxattr by now, remove an 
assert
       via  702af7f85f1 vfs: Ensure we have a base fsp openat() for named 
streams
       via  fbce308dd4b torture: Create a base_fsp for a named stream in vfstest
       via  b3ab69a4350 torture: Introduce error labels for vfstest's cmd_open()
      from  ac7d0b45fc7 Move LSP stuff to buildtools/devel_env.sh

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


- Log -----------------------------------------------------------------
commit edc4c910f27ea4920734dc2a62e4f57862024ed7
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 31 18:12:32 2022 +0200

    vfs: Simplify streams_depot_openat()
    
    We don't need an explicit stat(), VALID_STAT on the existing base_fsp
    is sufficient.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Fri Apr  1 21:18:37 UTC 2022 on sn-devel-184

commit 57bcbbcacde6d35e056b3a6fc4b7035b17919fe2
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 31 21:21:30 2022 +0200

    smbd: Don't loose base_fsp statinfo in non_widelink_open
    
    smb_fname_rel came from SMB_VFS_PARENT_PATHNAME() without a reference
    to the underlying base_fsp. We want to pass the existing stat-info to
    the VFS objects, so when creating the relative base fsp_name we should
    copy the stat-info from the base fsp we were handed, not the fake one
    that we just made up in SMB_VFS_PARENT_PATHNAME()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit b15c24975770298479cb3782f2618cdb361fdf12
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 31 17:49:06 2022 +0200

    vfs: streams_xattr uses fsetxattr by now, remove an assert
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 702af7f85f1c37117064e57135528ee56711844a
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Mar 31 17:40:35 2022 +0200

    vfs: Ensure we have a base fsp openat() for named streams
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit fbce308dd4b59c2669fd85352b6584e5bea9b771
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Feb 22 13:15:02 2022 +0100

    torture: Create a base_fsp for a named stream in vfstest
    
    This will enable a simplification in the stream-handling openat vfs
    routines.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit b3ab69a435020c15f6f6bbfdb7f2887eafe201bf
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Feb 22 12:38:27 2022 +0100

    torture: Introduce error labels for vfstest's cmd_open()
    
    Next patch will have another error exit
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

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

Summary of changes:
 source3/modules/vfs_fruit.c         |  2 ++
 source3/modules/vfs_streams_depot.c | 26 ++---------------------
 source3/modules/vfs_streams_xattr.c |  5 +----
 source3/smbd/open.c                 |  2 +-
 source3/torture/cmd_vfs.c           | 42 ++++++++++++++++++++++++++-----------
 5 files changed, 36 insertions(+), 41 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index 3c19aad8b0a..995c869d10f 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -1754,6 +1754,8 @@ static int fruit_openat(vfs_handle_struct *handle,
                                           mode);
        }
 
+       SMB_ASSERT(fsp_is_alternate_stream(fsp));
+
        if (is_afpinfo_stream(smb_fname->stream_name)) {
                fd = fruit_open_meta(handle,
                                     dirfsp,
diff --git a/source3/modules/vfs_streams_depot.c 
b/source3/modules/vfs_streams_depot.c
index 3016cfcf19c..cc2d25a36f6 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -710,7 +710,6 @@ static int streams_depot_openat(struct vfs_handle_struct 
*handle,
                                mode_t mode)
 {
        struct smb_filename *smb_fname_stream = NULL;
-       struct smb_filename *smb_fname_base = NULL;
        struct files_struct *fspcwd = NULL;
        NTSTATUS status;
        int ret = -1;
@@ -724,28 +723,8 @@ static int streams_depot_openat(struct vfs_handle_struct 
*handle,
                                           mode);
        }
 
-       /*
-        * For now assert this so the below SMB_VFS_STAT() is ok.
-        */
-       SMB_ASSERT(fsp_get_pathref_fd(dirfsp) == AT_FDCWD);
-
-       /* Ensure the base file still exists. */
-       smb_fname_base = synthetic_smb_fname(talloc_tos(),
-                                       smb_fname->base_name,
-                                       NULL,
-                                       NULL,
-                                       smb_fname->twrp,
-                                       smb_fname->flags);
-       if (smb_fname_base == NULL) {
-               ret = -1;
-               errno = ENOMEM;
-               goto done;
-       }
-
-       ret = SMB_VFS_NEXT_STAT(handle, smb_fname_base);
-       if (ret == -1) {
-               goto done;
-       }
+       SMB_ASSERT(fsp_is_alternate_stream(fsp));
+       SMB_ASSERT(VALID_STAT(fsp->base_fsp->fsp_name->st));
 
        /* Determine the stream name, and then open it. */
        status = stream_smb_fname(handle, smb_fname, &smb_fname_stream, true);
@@ -771,7 +750,6 @@ static int streams_depot_openat(struct vfs_handle_struct 
*handle,
 
  done:
        TALLOC_FREE(smb_fname_stream);
-       TALLOC_FREE(smb_fname_base);
        TALLOC_FREE(fspcwd);
        return ret;
 }
diff --git a/source3/modules/vfs_streams_xattr.c 
b/source3/modules/vfs_streams_xattr.c
index 48fc1cd134b..324490354b0 100644
--- a/source3/modules/vfs_streams_xattr.c
+++ b/source3/modules/vfs_streams_xattr.c
@@ -343,10 +343,7 @@ static int streams_xattr_openat(struct vfs_handle_struct 
*handle,
                                           mode);
        }
 
-       /*
-        * For now assert this, so the below SMB_VFS_SETXATTR() works.
-        */
-       SMB_ASSERT(fsp_get_pathref_fd(dirfsp) == AT_FDCWD);
+       SMB_ASSERT(fsp_is_alternate_stream(fsp));
 
        status = streams_xattr_get_name(handle, talloc_tos(),
                                        smb_fname->stream_name, &xattr_name);
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 35f57221171..1644d867566 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -745,7 +745,7 @@ static NTSTATUS non_widelink_open(const struct files_struct 
*dirfsp,
                                                talloc_tos(),
                                                smb_fname_rel->base_name,
                                                NULL,
-                                               &smb_fname_rel->st,
+                                               &fsp->base_fsp->fsp_name->st,
                                                smb_fname_rel->twrp,
                                                smb_fname_rel->flags);
                        if (base_smb_fname_rel == NULL) {
diff --git a/source3/torture/cmd_vfs.c b/source3/torture/cmd_vfs.c
index 470f039c4a3..7a23f7bf5a2 100644
--- a/source3/torture/cmd_vfs.c
+++ b/source3/torture/cmd_vfs.c
@@ -383,12 +383,11 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, 
TALLOC_CTX *mem_ctx, int argc, c
 
        fsp = talloc_zero(vfs, struct files_struct);
        if (fsp == NULL) {
-               return NT_STATUS_NO_MEMORY;
+               goto nomem;
        }
        fsp->fh = fd_handle_create(fsp);
        if (fsp->fh == NULL) {
-               TALLOC_FREE(fsp);
-               return NT_STATUS_NO_MEMORY;
+               goto nomem;
        }
        fsp->conn = vfs->conn;
 
@@ -396,15 +395,30 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, 
TALLOC_CTX *mem_ctx, int argc, c
                                        argv[1],
                                        lp_posix_pathnames());
        if (smb_fname == NULL) {
-               TALLOC_FREE(fsp);
-               return NT_STATUS_NO_MEMORY;
+               goto nomem;
        }
 
        fsp->fsp_name = smb_fname;
 
        status = vfs_at_fspcwd(fsp, vfs->conn, &fspcwd);
        if (!NT_STATUS_IS_OK(status)) {
-               return status;
+               goto fail;
+       }
+
+       if (is_named_stream(smb_fname)) {
+               struct smb_filename *base_name = NULL;
+
+               base_name = cp_smb_filename_nostream(NULL, smb_fname);
+               if (base_name == NULL) {
+                       goto nomem;
+               }
+
+               status = openat_pathref_fsp(fspcwd, base_name);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto fail;
+               }
+
+               fsp->base_fsp = base_name->fsp;
        }
 
        fd = SMB_VFS_OPENAT(vfs->conn,
@@ -415,9 +429,8 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX 
*mem_ctx, int argc, c
                            mode);
        if (fd == -1) {
                printf("open: error=%d (%s)\n", errno, strerror(errno));
-               TALLOC_FREE(fsp);
-               TALLOC_FREE(smb_fname);
-               return NT_STATUS_UNSUCCESSFUL;
+               status = map_nt_error_from_unix(errno);
+               goto fail;
        }
        fsp_set_fd(fsp, fd);
 
@@ -435,9 +448,7 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX 
*mem_ctx, int argc, c
 
        if (!NT_STATUS_IS_OK(status)) {
                fd_close(fsp);
-               TALLOC_FREE(fsp);
-               TALLOC_FREE(smb_fname);
-               return status;
+               goto fail;
        }
 
        fsp->file_id = vfs_file_id_from_sbuf(vfs->conn, &smb_fname->st);
@@ -454,6 +465,13 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX 
*mem_ctx, int argc, c
        vfs->files[fsp_get_pathref_fd(fsp)] = fsp;
        printf("open: fd=%d\n", fsp_get_pathref_fd(fsp));
        return NT_STATUS_OK;
+
+nomem:
+       status = NT_STATUS_NO_MEMORY;
+fail:
+       TALLOC_FREE(smb_fname);
+       TALLOC_FREE(fsp);
+       return status;
 }
 
 


-- 
Samba Shared Repository

Reply via email to