The branch, master has been updated via 2efa2e0 s3: smbd: Replace lp_posix_pathnames() with req->posix_pathnames in dir.c. Only one remaining. via 52bae79 s3: smbd: Remove lp_posix_pathnames() checks on paths sent in via old Win9X RPC calls. via 398ee27 s3: smbd: Replace lp_posix_pathnames() with smbreq->posix_pathnames in smb2_query_directory.c. via 944e940 s3: smbd: smb2_create.c - remove all uses of lp_posix_pathnames(). via a2f025e s3: smbd: Convert all but one use of lp_posix_pathnames() into req->posix_pathnames in trans2.c via 3cd1b18 s3: smbd: Remove *all* uses of lp_posix_pathnames() from open.c via 865bd48 s3: smbd: Replace most uses of lp_posix_pathnames() with req->posix_pathnames in nttrans.c via 6db6bc2 s3: smbd: Replace most uses of lp_posix_pathnames() with req->posix_pathnames in reply.c via 40df6f2 s3: smbd: Now struct smb_request has a bool posix_pathnames, remove the lp_posix_pathnames() call inside srvstr_get_path_req_wcard(). via 4587d83 s3: smbd: VFS change. Add new field bool posix_pathnames into struct smb_request. via cc729ae s3: smbd: srvstr_get_path() is now only called when lp_posix_pathnames() is false. via 88bb480 s3: smbd: Split all calls to srvstr_get_path() to calls to srvstr_get_path_posix() or srvstr_get_path() depending on lp_posix_pathnames(). via c78d739 s3: smbd: Add srvstr_get_path_posix(). via 5740761 s3: smbd: We now know that srvstr_get_path_wcard() is only called when lp_posix_pathnames() is false. via 41d62df s3: smbd: Split all calls to srvstr_get_path_wcard() into srvstr_get_path_wcard_posix() or srvstr_get_path_wcard() depending on lp_posix_pathnames(). via eb7198f s3: smbd: Add srvstr_get_path_wcard_posix(). via db36ee4 s3: smbd: Move lp_posix_pathnames() out into srvstr_get_path_req_wcard(). via 5a34069 s3: smbd: Move lp_posix_pathnames() out into srvstr_get_path(). via 4a6d7e1 s3: smbd: Move lp_posix_pathnames() out of srvstr_get_path_wcard_internal(). from f33224d net: Fix Coverity ID 241039 Unchecked return value
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 2efa2e08a440579827e18bbe14225e4f2513c232 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 14:46:36 2015 -0800 s3: smbd: Replace lp_posix_pathnames() with req->posix_pathnames in dir.c. Only one remaining. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Wed Dec 23 21:27:46 CET 2015 on sn-devel-144 commit 52bae7927cecbf43d98f29c57da45d49873a15dd Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 14:09:52 2015 -0800 s3: smbd: Remove lp_posix_pathnames() checks on paths sent in via old Win9X RPC calls. No unix client makes these. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 398ee270de106e3cb8d5ca01282aa7692ac1d815 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:55:21 2015 -0800 s3: smbd: Replace lp_posix_pathnames() with smbreq->posix_pathnames in smb2_query_directory.c. Currently SMB2/3 doesn't do posix pathname processing, leave this as a placeholder for when SMB2 unix extensions are added. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 944e94013c1367d65766cab83eccbacc79326445 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:52:10 2015 -0800 s3: smbd: smb2_create.c - remove all uses of lp_posix_pathnames(). Currently SMB2/3 doesn't do POSIX pathname processing. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit a2f025e26bb10e6574ea9b8d877eff75697e469e Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:49:55 2015 -0800 s3: smbd: Convert all but one use of lp_posix_pathnames() into req->posix_pathnames in trans2.c Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 3cd1b185bd49da6c61b2df24d097c99bc8fee032 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:45:30 2015 -0800 s3: smbd: Remove *all* uses of lp_posix_pathnames() from open.c Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 865bd48f3ac5072f9f69521d56338f1c74b861f7 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:44:10 2015 -0800 s3: smbd: Replace most uses of lp_posix_pathnames() with req->posix_pathnames in nttrans.c Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 6db6bc204fc911106d36d5690de765dc4d61e34b Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:41:45 2015 -0800 s3: smbd: Replace most uses of lp_posix_pathnames() with req->posix_pathnames in reply.c Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 40df6f23f33348761a6fbd39c73de1b6e2ed190c Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:36:57 2015 -0800 s3: smbd: Now struct smb_request has a bool posix_pathnames, remove the lp_posix_pathnames() call inside srvstr_get_path_req_wcard(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 4587d83f075a82665a48b52087b2704d2105882e Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:35:10 2015 -0800 s3: smbd: VFS change. Add new field bool posix_pathnames into struct smb_request. Initialize from lp_posix_pathnames() global. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit cc729ae47d87a4659590af86e5389f37d17a523f Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:27:55 2015 -0800 s3: smbd: srvstr_get_path() is now only called when lp_posix_pathnames() is false. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 88bb4801c0c7632caf6b1b059aa07d56cf215c60 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:26:49 2015 -0800 s3: smbd: Split all calls to srvstr_get_path() to calls to srvstr_get_path_posix() or srvstr_get_path() depending on lp_posix_pathnames(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit c78d73986d69f52699d576c3d0cad157feef13a8 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:18:03 2015 -0800 s3: smbd: Add srvstr_get_path_posix(). Not yet used, will be plumbed into existing callers of srvstr_get_path() when lp_posix_pathnames() is true. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 5740761e78711b59b1b7734bbbc76ddb55c3abc8 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:14:41 2015 -0800 s3: smbd: We now know that srvstr_get_path_wcard() is only called when lp_posix_pathnames() is false. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 41d62dfcb6179ff760a35e38d73009ae3761c533 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:13:44 2015 -0800 s3: smbd: Split all calls to srvstr_get_path_wcard() into srvstr_get_path_wcard_posix() or srvstr_get_path_wcard() depending on lp_posix_pathnames(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit eb7198f9991c5baba241dd2897107ba80dd6a817 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:07:49 2015 -0800 s3: smbd: Add srvstr_get_path_wcard_posix(). Allows us to call this directly and eventually remove the lp_posix_pathnames() call from inside of srvstr_get_path_wcard(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit db36ee422bc45147169997c0217ea43b104efcec Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:04:11 2015 -0800 s3: smbd: Move lp_posix_pathnames() out into srvstr_get_path_req_wcard(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 5a340698755fa591f0d2b7a63d50f41c051e487b Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 13:01:08 2015 -0800 s3: smbd: Move lp_posix_pathnames() out into srvstr_get_path(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> commit 4a6d7e1e1599634d4bcfa7cf00eb6f5f4a4aa177 Author: Jeremy Allison <j...@samba.org> Date: Tue Dec 22 12:52:58 2015 -0800 s3: smbd: Move lp_posix_pathnames() out of srvstr_get_path_wcard_internal(). Pass as parameter. Part of moving this switch out to the external request parsing code. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <volker.lende...@sernet.de> ----------------------------------------------------------------------- Summary of changes: source3/include/vfs.h | 3 + source3/rpc_server/srvsvc/srv_srvsvc_nt.c | 4 +- source3/smbd/dir.c | 5 +- source3/smbd/nttrans.c | 79 ++++++++-- source3/smbd/open.c | 8 +- source3/smbd/process.c | 1 + source3/smbd/proto.h | 17 +++ source3/smbd/reply.c | 167 ++++++++++++++++++---- source3/smbd/smb2_create.c | 6 +- source3/smbd/smb2_query_directory.c | 4 +- source3/smbd/trans2.c | 230 +++++++++++++++++++++++++----- 11 files changed, 437 insertions(+), 87 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 71e1af9..66e4fc6 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -169,6 +169,7 @@ /* Version 33 - Remove notify_watch_fn */ /* Bump to version 34 - Samba 4.4 will ship with that */ /* Version 34 - Remove bool posix_open, add uint64_t posix_flags */ +/* Version 34 - Added bool posix_pathnames to struct smb_request */ #define SMB_VFS_INTERFACE_VERSION 34 @@ -464,6 +465,8 @@ struct smb_request { struct smb_request **chain; struct timeval request_time; + + bool posix_pathnames; }; /* diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c index fd71650..b1e9d13 100644 --- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c +++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c @@ -2311,7 +2311,7 @@ WERROR _srvsvc_NetGetFileSecurity(struct pipes_struct *p, files_struct *fsp = NULL; int snum; char *oldcwd = NULL; - uint32_t ucf_flags = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags = 0; ZERO_STRUCT(st); @@ -2459,7 +2459,7 @@ WERROR _srvsvc_NetSetFileSecurity(struct pipes_struct *p, char *oldcwd = NULL; struct security_descriptor *psd = NULL; uint32_t security_info_sent = 0; - uint32_t ucf_flags = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags = 0; ZERO_STRUCT(st); diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index ad57294..a322bb5 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -485,7 +485,7 @@ NTSTATUS dptr_create(connection_struct *conn, if (smb_dname == NULL) { return NT_STATUS_NO_MEMORY; } - if (lp_posix_pathnames()) { + if (req != NULL && req->posix_pathnames) { ret = SMB_VFS_LSTAT(conn, smb_dname); } else { ret = SMB_VFS_STAT(conn, smb_dname); @@ -545,7 +545,8 @@ NTSTATUS dptr_create(connection_struct *conn, TALLOC_FREE(dir_hnd); return NT_STATUS_NO_MEMORY; } - if (lp_posix_pathnames() || (wcard[0] == '.' && wcard[1] == 0)) { + if ((req != NULL && req->posix_pathnames) || + (wcard[0] == '.' && wcard[1] == 0)) { dptr->has_wild = True; } else { dptr->has_wild = wcard_has_wild; diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 6ef4c5a..b5fbbfd 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -462,7 +462,7 @@ void reply_ntcreate_and_X(struct smb_request *req) uint8_t oplock_granted = NO_OPLOCK_RETURN; struct case_semantics_state *case_state = NULL; uint32_t ucf_flags = UCF_PREP_CREATEFILE | - (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); TALLOC_CTX *ctx = talloc_tos(); START_PROFILE(SMBntcreateX); @@ -762,9 +762,25 @@ static void do_nt_transact_create_pipe(connection_struct *conn, flags = IVAL(params,0); - srvstr_get_path(ctx, params, req->flags2, &fname, params+53, - parameter_count-53, STR_TERMINATE, + if (req->posix_pathnames) { + srvstr_get_path_posix(ctx, + params, + req->flags2, + &fname, + params+53, + parameter_count-53, + STR_TERMINATE, &status); + } else { + srvstr_get_path(ctx, + params, + req->flags2, + &fname, + params+53, + parameter_count-53, + STR_TERMINATE, + &status); + } if (!NT_STATUS_IS_OK(status)) { reply_nterror(req, status); return; @@ -1003,7 +1019,7 @@ static void call_nt_transact_create(connection_struct *conn, uint8_t oplock_granted; struct case_semantics_state *case_state = NULL; uint32_t ucf_flags = UCF_PREP_CREATEFILE | - (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); TALLOC_CTX *ctx = talloc_tos(); DEBUG(5,("call_nt_transact_create\n")); @@ -1052,9 +1068,25 @@ static void call_nt_transact_create(connection_struct *conn, */ create_options &= ~NTCREATEX_OPTIONS_MUST_IGNORE_MASK; - srvstr_get_path(ctx, params, req->flags2, &fname, - params+53, parameter_count-53, - STR_TERMINATE, &status); + if (req->posix_pathnames) { + srvstr_get_path_posix(ctx, + params, + req->flags2, + &fname, + params+53, + parameter_count-53, + STR_TERMINATE, + &status); + } else { + srvstr_get_path(ctx, + params, + req->flags2, + &fname, + params+53, + parameter_count-53, + STR_TERMINATE, + &status); + } if (!NT_STATUS_IS_OK(status)) { reply_nterror(req, status); goto out; @@ -1528,8 +1560,8 @@ void reply_ntrename(struct smb_request *req) bool src_has_wcard = False; bool dest_has_wcard = False; uint32_t attrs; - uint32_t ucf_flags_src = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); - uint32_t ucf_flags_dst = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags_src = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags_dst = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); uint16_t rename_type; TALLOC_CTX *ctx = talloc_tos(); bool stream_rename = false; @@ -1552,7 +1584,7 @@ void reply_ntrename(struct smb_request *req) goto out; } - if (!lp_posix_pathnames() && ms_has_wild(oldname)) { + if (!req->posix_pathnames && ms_has_wild(oldname)) { reply_nterror(req, NT_STATUS_OBJECT_PATH_SYNTAX_BAD); goto out; } @@ -1565,7 +1597,7 @@ void reply_ntrename(struct smb_request *req) goto out; } - if (!lp_posix_pathnames()) { + if (!req->posix_pathnames) { /* The newname must begin with a ':' if the oldname contains a ':'. */ if (strchr_m(oldname, ':')) { @@ -1835,9 +1867,28 @@ static void call_nt_transact_rename(connection_struct *conn, if (!check_fsp(conn, req, fsp)) { return; } - srvstr_get_path_wcard(ctx, params, req->flags2, &new_name, params+4, - parameter_count - 4, - STR_TERMINATE, &status, &dest_has_wcard); + if (req->posix_pathnames) { + srvstr_get_path_wcard_posix(ctx, + params, + req->flags2, + &new_name, + params+4, + parameter_count - 4, + STR_TERMINATE, + &status, + &dest_has_wcard); + } else { + srvstr_get_path_wcard(ctx, + params, + req->flags2, + &new_name, + params+4, + parameter_count - 4, + STR_TERMINATE, + &status, + &dest_has_wcard); + } + if (!NT_STATUS_IS_OK(status)) { reply_nterror(req, status); return; diff --git a/source3/smbd/open.c b/source3/smbd/open.c index d4f257c..3c0a7a3 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -2529,7 +2529,8 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, } /* this is for OS/2 long file names - say we don't support them */ - if (!lp_posix_pathnames() && strstr(smb_fname->base_name,".+,;=[].")) { + if (req != NULL && !req->posix_pathnames && + strstr(smb_fname->base_name,".+,;=[].")) { /* OS/2 Workplace shell fix may be main code stream in a later * release. */ DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not " @@ -4828,7 +4829,8 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn, files_struct *dir_fsp; char *parent_fname = NULL; char *new_base_name = NULL; - uint32_t ucf_flags = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags = ((req != NULL && req->posix_pathnames) ? + UCF_POSIX_PATHNAMES : 0); NTSTATUS status; if (root_dir_fid == 0 || !smb_fname) { @@ -5040,7 +5042,7 @@ NTSTATUS create_file_default(connection_struct *conn, status = NT_STATUS_NOT_A_DIRECTORY; goto fail; } - if (lp_posix_pathnames()) { + if (req != NULL && req->posix_pathnames) { ret = SMB_VFS_LSTAT(conn, smb_fname); } else { ret = SMB_VFS_STAT(conn, smb_fname); diff --git a/source3/smbd/process.c b/source3/smbd/process.c index c99c75e..79ca91f 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -629,6 +629,7 @@ static bool init_smb_request(struct smb_request *req, req->smb2req = NULL; req->priv_paths = NULL; req->chain = NULL; + req->posix_pathnames = lp_posix_pathnames(); smb_init_perfcount_data(&req->pcd); /* Ensure we have at least wct words and 2 bytes of bcc. */ diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 55e8286..847a191 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -847,6 +847,15 @@ size_t srvstr_get_path_wcard(TALLOC_CTX *ctx, int flags, NTSTATUS *err, bool *contains_wcard); +size_t srvstr_get_path_wcard_posix(TALLOC_CTX *ctx, + const char *inbuf, + uint16_t smb_flags2, + char **pp_dest, + const char *src, + size_t src_len, + int flags, + NTSTATUS *err, + bool *contains_wcard); size_t srvstr_get_path(TALLOC_CTX *ctx, const char *inbuf, uint16_t smb_flags2, @@ -855,6 +864,14 @@ size_t srvstr_get_path(TALLOC_CTX *ctx, size_t src_len, int flags, NTSTATUS *err); +size_t srvstr_get_path_posix(TALLOC_CTX *ctx, + const char *inbuf, + uint16_t smb_flags2, + char **pp_dest, + const char *src, + size_t src_len, + int flags, + NTSTATUS *err); size_t srvstr_get_path_req_wcard(TALLOC_CTX *mem_ctx, struct smb_request *req, char **pp_dest, const char *src, int flags, NTSTATUS *err, bool *contains_wcard); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index b1ca7a5..77d5b6e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -253,15 +253,17 @@ NTSTATUS check_path_syntax_posix(char *path) /**************************************************************************** Pull a string and check the path allowing a wilcard - provide for error return. + Passes in posix flag. ****************************************************************************/ -size_t srvstr_get_path_wcard(TALLOC_CTX *ctx, +static size_t srvstr_get_path_wcard_internal(TALLOC_CTX *ctx, const char *base_ptr, uint16_t smb_flags2, char **pp_dest, const char *src, size_t src_len, int flags, + bool posix_pathnames, NTSTATUS *err, bool *contains_wcard) { @@ -288,7 +290,7 @@ size_t srvstr_get_path_wcard(TALLOC_CTX *ctx, return ret; } - if (lp_posix_pathnames()) { + if (posix_pathnames) { *err = check_path_syntax_posix(*pp_dest); } else { *err = check_path_syntax_wcard(*pp_dest, contains_wcard); @@ -298,6 +300,59 @@ size_t srvstr_get_path_wcard(TALLOC_CTX *ctx, } /**************************************************************************** + Pull a string and check the path allowing a wilcard - provide for error return. +****************************************************************************/ + +size_t srvstr_get_path_wcard(TALLOC_CTX *ctx, + const char *base_ptr, + uint16_t smb_flags2, + char **pp_dest, + const char *src, + size_t src_len, + int flags, + NTSTATUS *err, + bool *contains_wcard) +{ + return srvstr_get_path_wcard_internal(ctx, + base_ptr, + smb_flags2, + pp_dest, + src, + src_len, + flags, + false, + err, + contains_wcard); +} + +/**************************************************************************** + Pull a string and check the path allowing a wilcard - provide for error return. + posix_pathnames version. +****************************************************************************/ + +size_t srvstr_get_path_wcard_posix(TALLOC_CTX *ctx, + const char *base_ptr, + uint16_t smb_flags2, + char **pp_dest, + const char *src, + size_t src_len, + int flags, + NTSTATUS *err, + bool *contains_wcard) +{ + return srvstr_get_path_wcard_internal(ctx, + base_ptr, + smb_flags2, + pp_dest, + src, + src_len, + flags, + true, + err, + contains_wcard); +} + +/**************************************************************************** Pull a string and check the path - provide for error return. ****************************************************************************/ @@ -311,10 +366,46 @@ size_t srvstr_get_path(TALLOC_CTX *ctx, NTSTATUS *err) { bool ignore; - return srvstr_get_path_wcard(ctx, base_ptr, smb_flags2, pp_dest, src, - src_len, flags, err, &ignore); + return srvstr_get_path_wcard_internal(ctx, + base_ptr, + smb_flags2, + pp_dest, + src, + src_len, + flags, + false, + err, + &ignore); +} + +/**************************************************************************** + Pull a string and check the path - provide for error return. + posix_pathnames version. +****************************************************************************/ + +size_t srvstr_get_path_posix(TALLOC_CTX *ctx, + const char *base_ptr, + uint16_t smb_flags2, + char **pp_dest, + const char *src, + size_t src_len, + int flags, + NTSTATUS *err) +{ + bool ignore; + return srvstr_get_path_wcard_internal(ctx, + base_ptr, + smb_flags2, + pp_dest, + src, + src_len, + flags, + true, + err, + &ignore); } + size_t srvstr_get_path_req_wcard(TALLOC_CTX *mem_ctx, struct smb_request *req, char **pp_dest, const char *src, int flags, NTSTATUS *err, bool *contains_wcard) @@ -326,9 +417,29 @@ size_t srvstr_get_path_req_wcard(TALLOC_CTX *mem_ctx, struct smb_request *req, return 0; } - return srvstr_get_path_wcard(mem_ctx, (const char *)req->inbuf, - req->flags2, pp_dest, src, bufrem, flags, - err, contains_wcard); + if (req->posix_pathnames) { + return srvstr_get_path_wcard_internal(mem_ctx, + (const char *)req->inbuf, + req->flags2, + pp_dest, + src, + bufrem, + flags, + true, + err, + contains_wcard); + } else { + return srvstr_get_path_wcard_internal(mem_ctx, + (const char *)req->inbuf, + req->flags2, + pp_dest, + src, + bufrem, + flags, + false, + err, + contains_wcard); + } } size_t srvstr_get_path_req(TALLOC_CTX *mem_ctx, struct smb_request *req, @@ -1165,7 +1276,7 @@ void reply_checkpath(struct smb_request *req) struct smb_filename *smb_fname = NULL; char *name = NULL; NTSTATUS status; - uint32_t ucf_flags = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); TALLOC_CTX *ctx = talloc_tos(); START_PROFILE(SMBcheckpath); @@ -1280,7 +1391,7 @@ void reply_getatr(struct smb_request *req) size = 0; mtime = 0; } else { - uint32_t ucf_flags = (lp_posix_pathnames() ? + uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); status = filename_convert(ctx, conn, @@ -1367,7 +1478,7 @@ void reply_setatr(struct smb_request *req) time_t mtime; const char *p; NTSTATUS status; - uint32_t ucf_flags = (lp_posix_pathnames() ? UCF_POSIX_PATHNAMES : 0); + uint32_t ucf_flags = (req->posix_pathnames ? UCF_POSIX_PATHNAMES : 0); TALLOC_CTX *ctx = talloc_tos(); START_PROFILE(SMBsetatr); @@ -1644,7 +1755,7 @@ void reply_search(struct smb_request *req) goto out; } - if (lp_posix_pathnames()) { + if (req->posix_pathnames) { reply_unknown_new(req, req->cmd); goto out; } @@ -1673,7 +1784,7 @@ void reply_search(struct smb_request *req) if (status_len == 0) { uint32_t ucf_flags = UCF_ALWAYS_ALLOW_WCARD_LCOMP | -- Samba Shared Repository