smbd: add create_conn_struct_cwd()
authorRalph Boehme <slow@samba.org>
Fri, 28 May 2021 07:25:22 +0000 (09:25 +0200)
committerRalph Boehme <slow@samba.org>
Wed, 16 Jun 2021 05:08:29 +0000 (05:08 +0000)
Compared to create_conn_struct_tos_cwd() this takes a TALLOC_CTX and
tevent_context as additional arguments and the resulting connection_struct is
stable across the lifetime of mem_ctx and ev.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14740

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/msdfs.c
source3/smbd/proto.h

index 864cd1024033134c097114b221de3fe116f2447b..4c7aa89e859cb7a23c036a791ea5e23699021563 100644 (file)
@@ -495,6 +495,44 @@ NTSTATUS create_conn_struct_tos_cwd(struct messaging_context *msg,
        return NT_STATUS_OK;
 }
 
+/********************************************************
+ Fake up a connection struct for the VFS layer.
+ This takes an TALLOC_CTX and tevent_context from the
+ caller and the resulting connection_struct is stable
+ across the lifetime of mem_ctx and ev.
+
+ Note: this performs a vfs connect and changes cwd.
+
+ See also the comment for create_conn_struct_tos() above!
+*********************************************************/
+
+NTSTATUS create_conn_struct_cwd(TALLOC_CTX *mem_ctx,
+                               struct tevent_context *ev,
+                               struct messaging_context *msg,
+                               const struct auth_session_info *session_info,
+                               int snum,
+                               const char *path,
+                               struct connection_struct **c)
+{
+       NTSTATUS status;
+
+       become_root();
+       status = create_conn_struct_as_root(mem_ctx,
+                                           ev,
+                                           msg,
+                                           c,
+                                           snum,
+                                           path,
+                                           session_info);
+       unbecome_root();
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(c);
+               return status;
+       }
+
+       return NT_STATUS_OK;
+}
+
 static void shuffle_strlist(char **list, int count)
 {
        int i;
index c0df35bcc48c6163f0789011c1760292e2e7075e..e10ffa5110ea8d309a3ae4e059a131471ab1f7ec 100644 (file)
@@ -578,6 +578,14 @@ NTSTATUS dfs_redirect(TALLOC_CTX *ctx,
                        char **pp_name_out);
 struct connection_struct;
 struct smb_filename;
+
+NTSTATUS create_conn_struct_cwd(TALLOC_CTX *mem_ctx,
+                               struct tevent_context *ev,
+                               struct messaging_context *msg,
+                               const struct auth_session_info *session_info,
+                               int snum,
+                               const char *path,
+                               struct connection_struct **c);
 struct conn_struct_tos {
        struct connection_struct *conn;
        struct smb_filename *oldcwd_fname;