From 8b9fdc8ab1b06a3bf75ff3757b3e40ddd0d1eb9f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 3 Aug 2022 09:08:48 -0700 Subject: [PATCH] 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 Reviewed-by: Reviewed-by: Volker Lendecke --- source3/smbd/filename.c | 4 ++-- source3/smbd/proto.h | 2 +- source3/smbd/smb1_nttrans.c | 10 ++++++---- source3/smbd/smb1_reply.c | 24 ++++++++++++------------ source3/smbd/smb1_trans2.c | 8 ++++---- source3/smbd/smb2_trans2.c | 8 ++++---- 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 3e90b8dd71b..de29942bde0 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -300,7 +300,7 @@ 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; @@ -346,7 +346,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; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 0d541d15466..21eb32a9388 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -356,7 +356,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx, NTTIME twrp, struct smb_filename **smb_fname, uint32_t ucf_flags); -bool extract_snapshot_token(char *fname, NTTIME *twrp); +bool extract_snapshot_token(char *fname, uint32_t ucf_flags, NTTIME *twrp); NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname, uint32_t ucf_flags, NTTIME twrp); diff --git a/source3/smbd/smb1_nttrans.c b/source3/smbd/smb1_nttrans.c index cd68ecd2590..aa346a91ced 100644 --- a/source3/smbd/smb1_nttrans.c +++ b/source3/smbd/smb1_nttrans.c @@ -626,7 +626,7 @@ void reply_ntcreate_and_X(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, create_disposition); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp( ctx, conn, fname, ucf_flags, twrp, &dirfsp, &smb_fname); @@ -1081,7 +1081,7 @@ static void call_nt_transact_create(connection_struct *conn, ucf_flags = filename_create_ucf_flags(req, create_disposition); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -1468,7 +1468,7 @@ void reply_ntrename(struct smb_request *req) } if (ucf_flags_src & UCF_GMT_PATHNAME) { - extract_snapshot_token(oldname, &src_twrp); + extract_snapshot_token(oldname, ucf_flags_src, &src_twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -1519,7 +1519,9 @@ void reply_ntrename(struct smb_request *req) } } else { if (ucf_flags_dst & UCF_GMT_PATHNAME) { - extract_snapshot_token(newname, &dst_twrp); + extract_snapshot_token(newname, + ucf_flags_dst, + &dst_twrp); } status = filename_convert_dirfsp(ctx, conn, diff --git a/source3/smbd/smb1_reply.c b/source3/smbd/smb1_reply.c index fcfd670163d..1e969d40834 100644 --- a/source3/smbd/smb1_reply.c +++ b/source3/smbd/smb1_reply.c @@ -581,7 +581,7 @@ void reply_checkpath(struct smb_request *req) DEBUG(3,("reply_checkpath %s mode=%d\n", name, (int)SVAL(req->vwv+0, 0))); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(name, &twrp); + extract_snapshot_token(name, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -686,7 +686,7 @@ void reply_getatr(struct smb_request *req) uint32_t ucf_flags = ucf_flags_from_smb_request(req); NTTIME twrp = 0; if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -794,7 +794,7 @@ void reply_setatr(struct smb_request *req) } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -1468,7 +1468,7 @@ void reply_open(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, create_disposition); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -1664,7 +1664,7 @@ void reply_open_and_X(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, create_disposition); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, @@ -2096,7 +2096,7 @@ void reply_mknew(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, create_disposition); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, @@ -2246,7 +2246,7 @@ void reply_ctemp(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, FILE_CREATE); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -2393,7 +2393,7 @@ void reply_unlink(struct smb_request *req) } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(name, &twrp); + extract_snapshot_token(name, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -5833,7 +5833,7 @@ void reply_mkdir(struct smb_request *req) ucf_flags = filename_create_ucf_flags(req, FILE_CREATE); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(directory, &twrp); + extract_snapshot_token(directory, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -5909,7 +5909,7 @@ void reply_rmdir(struct smb_request *req) } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(directory, &twrp); + extract_snapshot_token(directory, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -6054,7 +6054,7 @@ void reply_mv(struct smb_request *req) } if (src_ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(name, &src_twrp); + extract_snapshot_token(name, src_ucf_flags, &src_twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -6075,7 +6075,7 @@ void reply_mv(struct smb_request *req) } if (dst_ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(newname, &dst_twrp); + extract_snapshot_token(newname, dst_ucf_flags, &dst_twrp); } status = filename_convert_dirfsp(ctx, conn, diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c index f46a45ab124..dc21e14aa86 100644 --- a/source3/smbd/smb1_trans2.c +++ b/source3/smbd/smb1_trans2.c @@ -586,7 +586,7 @@ static void call_trans2open(connection_struct *conn, (unsigned int)open_ofun, open_size)); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -2109,7 +2109,7 @@ static void call_trans2qfilepathinfo(connection_struct *conn, } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(req, conn, @@ -2508,7 +2508,7 @@ static void call_trans2setfilepathinfo(connection_struct *conn, } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(fname, &twrp); + extract_snapshot_token(fname, ucf_flags, &twrp); } status = filename_convert_dirfsp(req, conn, @@ -2685,7 +2685,7 @@ static void call_trans2mkdir(connection_struct *conn, struct smb_request *req, DEBUG(3,("call_trans2mkdir : name = %s\n", directory)); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(directory, &twrp); + extract_snapshot_token(directory, ucf_flags, &twrp); } status = filename_convert_dirfsp(ctx, conn, diff --git a/source3/smbd/smb2_trans2.c b/source3/smbd/smb2_trans2.c index d0f30a782bf..5834f2b1467 100644 --- a/source3/smbd/smb2_trans2.c +++ b/source3/smbd/smb2_trans2.c @@ -4914,7 +4914,7 @@ static NTSTATUS smb_set_file_unix_hlink(connection_struct *conn, smb_fname_str_dbg(smb_fname_new), oldname)); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(oldname, &old_twrp); + extract_snapshot_token(oldname, ucf_flags, &old_twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -5014,7 +5014,7 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn, } } else { if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(newname, &dst_twrp); + extract_snapshot_token(newname, ucf_flags, &dst_twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -5118,7 +5118,7 @@ static NTSTATUS smb_file_link_information(connection_struct *conn, newname)); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(newname, &dst_twrp); + extract_snapshot_token(newname, ucf_flags, &dst_twrp); } status = filename_convert_dirfsp(ctx, conn, @@ -5290,7 +5290,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, } if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(base_name, &dst_twrp); + extract_snapshot_token(base_name, ucf_flags, &dst_twrp); } status = filename_convert_dirfsp(ctx, conn, -- 2.47.3