From: Jeremy Allison Date: Fri, 6 Sep 2019 21:51:29 +0000 (-0700) Subject: s3: pysmbd: Ensure conn->cwd_fsp member of created connections is initialized. X-Git-Tag: talloc-2.3.1~908 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e7828faf3b76c82781e8707d7d7ef990224bd7e;p=thirdparty%2Fsamba.git s3: pysmbd: Ensure conn->cwd_fsp member of created connections is initialized. This is needed to correctly call the XXXAT() vfs calls. We should probably just use create_conn_struct_tos_cwd() here and pass $cwd instead of using create_conn_struct_tos() and passing "/" as the share root. We wouldn't change the current working directory and the created share root would be set to $cwd but I'm not sure what effects this may have on users of pysmbd in case any of them pass paths above the $cwd to these functions. Less changes to just call vfs_ChDir(conn, &cwd) which doesn't change the current directory and leaves the share root as "/". Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c index 082c2b44f94..c0905b4b485 100644 --- a/source3/smbd/pysmbd.c +++ b/source3/smbd/pysmbd.c @@ -56,6 +56,9 @@ static connection_struct *get_conn_tos( struct conn_struct_tos *c = NULL; int snum = -1; NTSTATUS status; + char *cwd = NULL; + struct smb_filename cwd_fname = {0}; + int ret; if (!posix_locking_init(false)) { PyErr_NoMemory(); @@ -80,6 +83,29 @@ static connection_struct *get_conn_tos( /* Ignore read-only and share restrictions */ c->conn->read_only = false; c->conn->share_access = SEC_RIGHTS_FILE_ALL; + + /* Provided by libreplace if not present. Always mallocs. */ + cwd = get_current_dir_name(); + if (cwd == NULL) { + PyErr_NoMemory(); + return NULL; + } + + cwd_fname.base_name = cwd; + /* + * We need to call vfs_ChDir() to initialize + * conn->cwd_fsp correctly. Change directory + * to current directory (so no change for process). + */ + ret = vfs_ChDir(c->conn, &cwd_fname); + if (ret != 0) { + status = map_nt_error_from_unix(errno); + SAFE_FREE(cwd); + PyErr_NTSTATUS_IS_ERR_RAISE(status); + } + + SAFE_FREE(cwd); + return c->conn; }