[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Thu Aug 4 18:11:01 UTC 2022
The branch, master has been updated
via 46418dddda9 s3: smbd: Convert driver_unix_convert() to use filename_convert_dirfsp().
via f42b5be4127 s3: smbd: Add dirfsp return parameter to driver_unix_convert().
via 87835c69ccf s3: smbd: In filename_convert_dirfsp_nosymlink() only use synthetic_smb_fname_split() for fake_files, not printer shares too.
via ffc19ac9859 s3: smbd: Remove filename_convert().
via 68483583630 s3: smbd: Convert filename_convert_smb1_search_path() to use filename_convert_dirfsp().
via 7bd5c05fbd9 s3: smbd: Add returned dirfsp pointer to filename_convert_smb1_search_path().
via 5a923ae36ab s3: smbd: We now know get_original_lcomp() never has to deal with an MSDFS pathname.
via 4112bab9aeb s3: smbd: In filename_convert_smb1_search_path(), after we have called dfs_redirect(), the path separator is always '/'.
via 2d9938dac32 s3: smbd: Remove TWRP handing inside get_original_lcomp().
via acff075a725 s3: smbd: In reply_ntrename(), move the call to get_original_lcomp(..newname..) after the call to extract_snapshot_token(..newname..).
via 5eed3f48b6e s3: smbd: Remove code for unused strip_gmt_from_raw_dfs().
via df5455c438d s3: smbd: Change filename_convert_smb1_search_path() to use extract_snapshot_token().
via 2ad3e63fe02 s3: smbd: Remove const from name_in parameter to filename_convert_smb1_search_path().
via 74715a75053 s3: smbd: Remove separate talloc_stackframe() from filename_convert_smb1_search_path().
via 7a823d44d23 s3: smbd: Allow extract_snapshot_token() to cope with MSDFS paths.
via 8b9fdc8ab1b s3: smbd: Add ucf_flags parameter to extract_snapshot_token().
from 2120b215872 testprogs: Reformat test_ktpass.sh
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 46418dddda9128c8fad8c68f6aa2212b7ad566c9
Author: Jeremy Allison <jra at samba.org>
Date: Tue Aug 2 14:06:44 2022 -0700
s3: smbd: Convert driver_unix_convert() to use filename_convert_dirfsp().
There is now only one user left of unix_convert(), inside
the MSDFS code. I have plans to get rid of this soon.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Thu Aug 4 18:10:43 UTC 2022 on sn-devel-184
commit f42b5be412717cdec67d86fe97314d5c0daa4e71
Author: Jeremy Allison <jra at samba.org>
Date: Tue Aug 2 14:01:59 2022 -0700
s3: smbd: Add dirfsp return parameter to driver_unix_convert().
Not yet used, but (dirfsp=NULL) value passed to functions
called after driver_unix_convert().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 87835c69ccf44ddf422f332caa5f00780634a48a
Author: Jeremy Allison <jra at samba.org>
Date: Tue Aug 2 18:13:52 2022 -0700
s3: smbd: In filename_convert_dirfsp_nosymlink() only use synthetic_smb_fname_split() for fake_files, not printer shares too.
Printer shares can have real filenames.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit ffc19ac98594c1b41731c7c5fe2e33f3224616c6
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 10:04:37 2022 -0700
s3: smbd: Remove filename_convert().
(\ _ /)
( \ O / )
(// \\)
X
/ \
/___\
_____/ \\_____
| + ||
| ||
| filename_convert ||
| ||
| ||
| ||
| ||
| _ ___ _ ||
| | \ | | \ ||
| | | | | | ||
| |_/ | |_/ ||
| | \ | | ||
| | \ | | ||
| | \. _|_. | . ||
| ||
* * | * ** * ** |** **
\)),.,\(/.,(//,,..,,\||(,,.,\\,.((//
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 684835836305cb0ffd144516320a81811fe78ac4
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 10:02:42 2022 -0700
s3: smbd: Convert filename_convert_smb1_search_path() to use filename_convert_dirfsp().
There are now no more users of filename_convert().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 7bd5c05fbd9e4c1a1fc99dd8d673636aa19578e7
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:58:54 2022 -0700
s3: smbd: Add returned dirfsp pointer to filename_convert_smb1_search_path().
Preparation for convertion of the last filename_convert() -> filename_convert_dirfsp().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 5a923ae36ab6e458987dbb0296b8dae1de35bd87
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 11:45:39 2022 -0700
s3: smbd: We now know get_original_lcomp() never has to deal with an MSDFS pathname.
Remove the call to dfs_redirect() within it.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 4112bab9aeb9816c6a7a753cc4f82a7136902896
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 11:42:17 2022 -0700
s3: smbd: In filename_convert_smb1_search_path(), after we have called dfs_redirect(), the path separator is always '/'.
This will allow us to remove the call to dfs_redirect() from get_original_lcomp().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 2d9938dac32ff4afb1dee840bcab50dc84b76bb4
Author: Jeremy Allison <jra at samba.org>
Date: Tue Aug 2 14:24:46 2022 -0700
s3: smbd: Remove TWRP handing inside get_original_lcomp().
Now we know all @GMT paths are removed before get_original_lcomp()
is called, we can eliminate this code.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit acff075a725118d42dc61b64c5ddb6f3178baf2f
Author: Jeremy Allison <jra at samba.org>
Date: Tue Aug 2 14:16:15 2022 -0700
s3: smbd: In reply_ntrename(), move the call to get_original_lcomp(..newname..) after the call to extract_snapshot_token(..newname..).
This was the last case where the snapshot TWRP token could be
passed into get_original_lcomp(). get_original_lcomp() can now
be changed to ignore TWRP tokens.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 5eed3f48b6e07c1f6463750922f4bea82e1448ab
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:50:57 2022 -0700
s3: smbd: Remove code for unused strip_gmt_from_raw_dfs().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit df5455c438d1b8f0751d042d56e999c6960af173
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:50:02 2022 -0700
s3: smbd: Change filename_convert_smb1_search_path() to use extract_snapshot_token().
strip_gmt_from_raw_dfs() is now no longer used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 2ad3e63fe02e6ca3ff4d5b70b0f3795e8cd414ba
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:27:37 2022 -0700
s3: smbd: Remove const from name_in parameter to filename_convert_smb1_search_path().
We're going to need to convert in place if it's an MSDFS path
with an SMB1 @GMT token.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 74715a750533cb350dc1f48e7e9d5ebd121c68ba
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:33:48 2022 -0700
s3: smbd: Remove separate talloc_stackframe() from filename_convert_smb1_search_path().
We're soon going to change this to return dirfsp and use convert_filename_dirfsp()
so we need to return values on the passed in talloc ctx.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 7a823d44d23ae6693f3abd6a0fca6a4e41c51298
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:20:36 2022 -0700
s3: smbd: Allow extract_snapshot_token() to cope with MSDFS paths.
"raw" MSDFS paths are passed here as \server\share\path.
find_snapshot_token() only looks for a '/' as a separator
in SMB1 shapshot paths.
Allow extract_snapshot_token() to cope with SMB1 MSDFS paths by
converting in place, looking for the @GMT token with a '/'
separator via find_snapshot_token(), and then converting back.
Note, this a temporary measure until we handle DFS paths better
and will be removed in the next patchset.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Reviewed-by: Volker Lendecke <vl at samba.org>
commit 8b9fdc8ab1b06a3bf75ff3757b3e40ddd0d1eb9f
Author: Jeremy Allison <jra at samba.org>
Date: Wed Aug 3 09:08:48 2022 -0700
s3: smbd: Add ucf_flags parameter to extract_snapshot_token().
Will be needed to cope with MSDFS paths which can be passed in
to this function.
Note, this a temporary measure until we handle DFS paths better
and will be removed in the next patchset.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Reviewed-by: Volker Lendecke <vl at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/printing/nt_printing.c | 41 +++--
source3/smbd/filename.c | 369 ++++++-----------------------------------
source3/smbd/proto.h | 11 +-
source3/smbd/smb1_nttrans.c | 31 ++--
source3/smbd/smb1_reply.c | 28 ++--
source3/smbd/smb1_trans2.c | 12 +-
source3/smbd/smb2_trans2.c | 8 +-
7 files changed, 130 insertions(+), 370 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index dc54a194f65..4b4d12f25d5 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -242,7 +242,8 @@ bool nt_printing_init(struct messaging_context *msg_ctx)
static NTSTATUS driver_unix_convert(connection_struct *conn,
const char *old_name,
- struct smb_filename **smb_fname)
+ struct files_struct **pdirfsp,
+ struct smb_filename **psmb_fname)
{
NTSTATUS status;
TALLOC_CTX *ctx = talloc_tos();
@@ -258,9 +259,15 @@ static NTSTATUS driver_unix_convert(connection_struct *conn,
}
trim_string(name,"/","/");
- status = unix_convert(ctx, conn, name, 0, smb_fname, 0);
+ status = filename_convert_dirfsp(ctx,
+ conn,
+ name,
+ 0, /* ucf_flags */
+ 0, /* twrp */
+ pdirfsp,
+ psmb_fname);
if (!NT_STATUS_IS_OK(status)) {
- return NT_STATUS_NO_MEMORY;
+ return status;
}
return NT_STATUS_OK;
@@ -806,6 +813,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
struct smb_filename *smb_fname = NULL;
files_struct *fsp = NULL;
+ struct files_struct *dirfsp = NULL;
SMB_STRUCT_STAT st;
NTSTATUS status;
@@ -816,7 +824,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
old_create_time = (time_t)0;
/* Get file version info (if available) for previous file (if it exists) */
- status = driver_unix_convert(conn, old_file, &smb_fname);
+ status = driver_unix_convert(conn, old_file, &dirfsp, &smb_fname);
if (!NT_STATUS_IS_OK(status)) {
goto error_exit;
}
@@ -830,7 +838,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
- NULL, /* dirfsp */
+ dirfsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
@@ -878,7 +886,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
close_file_free(NULL, &fsp, NORMAL_CLOSE);
/* Get file version info (if available) for new file */
- status = driver_unix_convert(conn, new_file, &smb_fname);
+ status = driver_unix_convert(conn, new_file, &dirfsp, &smb_fname);
if (!NT_STATUS_IS_OK(status)) {
goto error_exit;
}
@@ -893,7 +901,7 @@ static int file_version_is_newer(connection_struct *conn, fstring new_file, fstr
status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
- NULL, /* dirfsp */
+ dirfsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
@@ -992,6 +1000,7 @@ static uint32_t get_correct_cversion(const struct auth_session_info *session_inf
NTSTATUS nt_status;
struct smb_filename *smb_fname = NULL;
files_struct *fsp = NULL;
+ struct files_struct *dirfsp = NULL;
struct conn_struct_tos *c = NULL;
connection_struct *conn = NULL;
char *printdollar = NULL;
@@ -1085,7 +1094,10 @@ static uint32_t get_correct_cversion(const struct auth_session_info *session_inf
* We switch to the directory where the driver files are located,
* so only work on the file names
*/
- nt_status = driver_unix_convert(conn, driverpath_in, &smb_fname);
+ nt_status = driver_unix_convert(conn,
+ driverpath_in,
+ &dirfsp,
+ &smb_fname);
if (!NT_STATUS_IS_OK(nt_status)) {
*perr = ntstatus_to_werror(nt_status);
goto error_exit;
@@ -1110,7 +1122,7 @@ static uint32_t get_correct_cversion(const struct auth_session_info *session_inf
nt_status = SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
- NULL, /* dirfsp */
+ dirfsp, /* dirfsp */
smb_fname, /* fname */
FILE_GENERIC_READ, /* access_mask */
FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
@@ -1439,8 +1451,12 @@ static WERROR move_driver_file_to_download_area(TALLOC_CTX *mem_ctx,
}
if (version != -1 && (version = file_version_is_newer(conn, old_name, new_name)) > 0) {
+ struct files_struct *dirfsp = NULL;
- status = driver_unix_convert(conn, old_name, &smb_fname_old);
+ status = driver_unix_convert(conn,
+ old_name,
+ &dirfsp,
+ &smb_fname_old);
if (!NT_STATUS_IS_OK(status)) {
ret = WERR_NOT_ENOUGH_MEMORY;
goto out;
@@ -1489,6 +1505,7 @@ WERROR move_driver_to_download_area(const struct auth_session_info *session_info
struct spoolss_AddDriverInfo3 *driver;
struct spoolss_AddDriverInfo3 converted_driver;
const char *short_architecture;
+ struct files_struct *dirfsp = NULL;
struct smb_filename *smb_dname = NULL;
char *new_dir = NULL;
struct conn_struct_tos *c = NULL;
@@ -1569,7 +1586,7 @@ WERROR move_driver_to_download_area(const struct auth_session_info *session_info
err = WERR_NOT_ENOUGH_MEMORY;
goto err_exit;
}
- nt_status = driver_unix_convert(conn, new_dir, &smb_dname);
+ nt_status = driver_unix_convert(conn, new_dir, &dirfsp, &smb_dname);
if (!NT_STATUS_IS_OK(nt_status)) {
err = WERR_NOT_ENOUGH_MEMORY;
goto err_exit;
@@ -1577,7 +1594,7 @@ WERROR move_driver_to_download_area(const struct auth_session_info *session_info
DEBUG(5,("Creating first directory: %s\n", smb_dname->base_name));
- nt_status = create_directory(conn, NULL, NULL, smb_dname);
+ nt_status = create_directory(conn, NULL, dirfsp, smb_dname);
if (!NT_STATUS_IS_OK(nt_status)
&& !NT_STATUS_EQUAL(nt_status, NT_STATUS_OBJECT_NAME_COLLISION)) {
DEBUG(0, ("failed to create driver destination directory: %s\n",
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 3e90b8dd71b..e378bb72b32 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -300,14 +300,28 @@ static bool find_snapshot_token(
return true;
}
-bool extract_snapshot_token(char *fname, NTTIME *twrp)
+bool extract_snapshot_token(char *fname, uint32_t ucf_flags, NTTIME *twrp)
{
const char *start = NULL;
const char *next = NULL;
size_t remaining;
bool found;
+ bool posix_path = (ucf_flags & UCF_POSIX_PATHNAMES);
+ bool msdfs_path = (ucf_flags & UCF_DFS_PATHNAME);
+ if (msdfs_path && !posix_path) {
+ /*
+ * A raw (non-POSIX) MSDFS path looks like \server\share\path.
+ * find_snapshot_token only looks for '/' separators.
+ * Convert the separator characters in place.
+ */
+ string_replace(fname, '\\', '/');
+ }
found = find_snapshot_token(fname, &start, &next, twrp);
+ if (msdfs_path && !posix_path) {
+ /* Put the original separators back. */
+ string_replace(fname, '/', '\\');
+ }
if (!found) {
return false;
}
@@ -346,7 +360,7 @@ NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname,
return NT_STATUS_OK;
}
- found = extract_snapshot_token(smb_fname->base_name, &twrp);
+ found = extract_snapshot_token(smb_fname->base_name, ucf_flags, &twrp);
if (!found) {
return NT_STATUS_OK;
}
@@ -1879,73 +1893,16 @@ char *get_original_lcomp(TALLOC_CTX *ctx,
const char *filename_in,
uint32_t ucf_flags)
{
- struct smb_filename *smb_fname = NULL;
char *last_slash = NULL;
char *orig_lcomp;
- char *fname = NULL;
- NTTIME twrp = 0;
NTSTATUS status;
- if (ucf_flags & UCF_DFS_PATHNAME) {
- status = dfs_redirect(ctx,
- conn,
- filename_in,
- ucf_flags,
- !conn->sconn->using_smb2,
- &twrp,
- &fname);
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("dfs_redirect "
- "failed for name %s with %s\n",
- filename_in,
- nt_errstr(status));
- return NULL;
- }
- filename_in = fname;
- ucf_flags &= ~UCF_DFS_PATHNAME;
- }
-
- /*
- * NB. We don't need to care about
- * is_fake_file_path(filename_in) here as these
- * code paths don't ever return original_lcomp
- * or use it anyway.
- */
-
- if (ucf_flags & UCF_GMT_PATHNAME) {
- /*
- * Ensure we don't return a @GMT
- * value as the last component.
- */
- smb_fname = synthetic_smb_fname(ctx,
- filename_in,
- NULL,
- NULL,
- twrp,
- 0);
- if (smb_fname == NULL) {
- TALLOC_FREE(fname);
- return NULL;
- }
- status = canonicalize_snapshot_path(smb_fname,
- ucf_flags,
- twrp);
- if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(fname);
- TALLOC_FREE(smb_fname);
- return NULL;
- }
- filename_in = smb_fname->base_name;
- }
last_slash = strrchr(filename_in, '/');
if (last_slash != NULL) {
orig_lcomp = talloc_strdup(ctx, last_slash+1);
} else {
orig_lcomp = talloc_strdup(ctx, filename_in);
}
- /* We're done with any temp names here. */
- TALLOC_FREE(smb_fname);
- TALLOC_FREE(fname);
if (orig_lcomp == NULL) {
return NULL;
}
@@ -1957,188 +1914,6 @@ char *get_original_lcomp(TALLOC_CTX *ctx,
return orig_lcomp;
}
-/**
- * Go through all the steps to validate a filename.
- *
- * @param ctx talloc_ctx to allocate memory with.
- * @param conn connection struct for vfs calls.
- * @param smbreq SMB request if we're using privileges.
- * @param name_in The unconverted name.
- * @param ucf_flags flags to pass through to unix_convert().
- * @param twrp Optional VSS time
- * @param p_cont_wcard If not NULL, will be set to true if the dfs path
- * resolution detects a wildcard.
- * @param _smb_fname The final converted name will be allocated if the
- * return is NT_STATUS_OK.
- *
- * @return NT_STATUS_OK if all operations completed successfully, appropriate
- * error otherwise.
- */
-NTSTATUS filename_convert(TALLOC_CTX *ctx,
- connection_struct *conn,
- const char *name_in,
- uint32_t ucf_flags,
- NTTIME twrp,
- struct smb_filename **_smb_fname)
-{
- struct smb_filename *smb_fname = NULL;
- NTSTATUS status;
-
- *_smb_fname = NULL;
-
- if (ucf_flags & UCF_DFS_PATHNAME) {
- char *fname = NULL;
- NTTIME dfs_twrp = 0;
- status = dfs_redirect(ctx, conn,
- name_in,
- ucf_flags,
- !conn->sconn->using_smb2,
- &dfs_twrp,
- &fname);
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("dfs_redirect "
- "failed for name %s with %s\n",
- name_in,
- nt_errstr(status));
- return status;
- }
- name_in = fname;
- ucf_flags &= ~UCF_DFS_PATHNAME;
- if (twrp == 0 && dfs_twrp != 0) {
- twrp = dfs_twrp;
- }
- }
-
- if (is_fake_file_path(name_in)) {
- smb_fname = synthetic_smb_fname_split(ctx,
- name_in,
- (ucf_flags & UCF_POSIX_PATHNAMES));
- if (smb_fname == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- smb_fname->st = (SMB_STRUCT_STAT) { .st_ex_nlink = 1 };
- smb_fname->st.st_ex_btime = (struct timespec){0, SAMBA_UTIME_OMIT};
- smb_fname->st.st_ex_atime = (struct timespec){0, SAMBA_UTIME_OMIT};
- smb_fname->st.st_ex_mtime = (struct timespec){0, SAMBA_UTIME_OMIT};
- smb_fname->st.st_ex_ctime = (struct timespec){0, SAMBA_UTIME_OMIT};
-
- *_smb_fname = smb_fname;
- return NT_STATUS_OK;
- }
-
- status = unix_convert(ctx, conn, name_in, twrp, &smb_fname, ucf_flags);
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("unix_convert failed "
- "for name %s with %s\n",
- name_in,
- nt_errstr(status));
- return status;
- }
-
- if ((ucf_flags & UCF_POSIX_PATHNAMES) &&
- VALID_STAT(smb_fname->st) &&
- S_ISLNK(smb_fname->st.st_ex_mode))
- {
- status = check_veto_path(conn, smb_fname);
- if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(smb_fname);
- return status;
- }
- } else {
- status = check_name(conn, smb_fname);
- }
- if (!NT_STATUS_IS_OK(status)) {
- DBG_NOTICE("check_name failed "
- "for name %s with %s\n",
- smb_fname_str_dbg(smb_fname),
- nt_errstr(status));
- TALLOC_FREE(smb_fname);
- return status;
- }
-
- if (!VALID_STAT(smb_fname->st)) {
- DBG_DEBUG("[%s] does not exist, skipping pathref fsp\n",
- smb_fname_str_dbg(smb_fname));
- *_smb_fname = smb_fname;
- return NT_STATUS_OK;
- }
-
- status = openat_pathref_fsp(conn->cwd_fsp, smb_fname);
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
- /*
- * We deal with symlinks here as we do in
- * SMB_VFS_CREATE_FILE(): return success for POSIX clients with
- * the notable difference that there will be no fsp in
- * smb_fname->fsp.
- *
- * For Windows (non POSIX) clients fail with
- * NT_STATUS_OBJECT_NAME_NOT_FOUND.
- */
- if (smb_fname->flags & SMB_FILENAME_POSIX_PATH &&
- S_ISLNK(smb_fname->st.st_ex_mode))
- {
- status = NT_STATUS_OK;
- }
- }
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("openat_pathref_fsp [%s] failed: %s\n",
- smb_fname_str_dbg(smb_fname),
- nt_errstr(status));
- return status;
- }
-
- *_smb_fname = smb_fname;
- return status;
-}
-
-/*
- * Strip a @GMT component from an SMB1-DFS path. Could be anywhere
- * in the path.
- */
-
-static char *strip_gmt_from_raw_dfs(TALLOC_CTX *ctx,
- const char *name_in,
- bool posix_pathnames,
- NTTIME *_twrp)
-{
- NTSTATUS status;
- struct smb_filename *smb_fname = NULL;
- char *name_out = NULL;
-
- smb_fname = synthetic_smb_fname(ctx,
- name_in,
- NULL,
- NULL,
- 0,
- 0);
- if (smb_fname == NULL) {
- return NULL;
- }
- if (!posix_pathnames) {
- /*
- * Raw DFS names are still '\\' separated.
- * canonicalize_snapshot_path() only works
- * on '/' separated paths. Convert.
- */
- string_replace(smb_fname->base_name, '\\', '/');
- }
- status = canonicalize_snapshot_path(smb_fname,
- UCF_GMT_PATHNAME,
- 0);
- if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(smb_fname);
- return NULL;
- }
- if (!posix_pathnames) {
- /* Replace as raw DFS names. */
- string_replace(smb_fname->base_name, '/', '\\');
- }
- name_out = talloc_strdup(ctx, smb_fname->base_name);
- *_twrp = smb_fname->twrp;
- TALLOC_FREE(smb_fname);
- return name_out;
-}
-
/*
* Deal with the SMB1 semantics of sending a pathname with a
* wildcard as the terminal component for a SMB1search or
@@ -2147,8 +1922,9 @@ static char *strip_gmt_from_raw_dfs(TALLOC_CTX *ctx,
NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx,
connection_struct *conn,
- const char *name_in,
+ char *name_in,
uint32_t ucf_flags,
+ struct files_struct **_dirfsp,
struct smb_filename **_smb_fname_out,
char **_mask_out)
{
@@ -2158,24 +1934,23 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx,
struct smb_filename *smb_fname = NULL;
bool posix_pathnames = (ucf_flags & UCF_POSIX_PATHNAMES);
NTTIME twrp = 0;
- TALLOC_CTX *frame = talloc_stackframe();
*_smb_fname_out = NULL;
+ *_dirfsp = NULL;
*_mask_out = NULL;
DBG_DEBUG("name_in: %s\n", name_in);
+ if (ucf_flags & UCF_GMT_PATHNAME) {
+ extract_snapshot_token(name_in, ucf_flags, &twrp);
+ ucf_flags &= ~UCF_GMT_PATHNAME;
+ }
+
if (ucf_flags & UCF_DFS_PATHNAME) {
/*
* We've been given a raw DFS pathname.
- * In Windows mode this is separated by '\\'
- * characters.
- *
- * We need to remove the last component
- * which must be a wildcard before passing
- * to dfs_redirect(). But the last component
- * may also be a @GMT- token so we have to
- * remove that first.
+ * In Windows mode this is separated by '\'
+ * characters, in POSIX by '/' characters.
*/
char path_sep = posix_pathnames ? '/' : '\\';
char *fname = NULL;
@@ -2183,17 +1958,8 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx,
char *last_component = NULL;
/* Work on a copy of name_in. */
- if (ucf_flags & UCF_GMT_PATHNAME) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list