From: Ralph Boehme Date: Fri, 28 May 2021 07:25:22 +0000 (+0200) Subject: smbd: add create_conn_struct_cwd() X-Git-Tag: tevent-0.11.0~343 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9a2d6bcfd5797dd4db764921548c8dca6dd0eb21;p=thirdparty%2Fsamba.git smbd: add create_conn_struct_cwd() 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 Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 864cd102403..4c7aa89e859 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -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; diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index c0df35bcc48..e10ffa5110e 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -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;