The branch, master has been updated via 5075df4575d s3: smbd: Remove ugly SMB1-specific hack to filename_convert_dirfsp() via 5c9404f7531 s3: smbd: Remove the ucf_flags parameter from extract_snapshot_token(). via d21cf6bbb18 s3: smbd: Cleanup - integer align. consumedcnt should be a size_t. via 7ef1412f852 s3: smbd: Minor cleanup in parse_dfs_path(). via e5a49c310da s3: smbd: Remove 'bool posix_path' from struct dfs_path. via f24ef117cfa s3: smbd: Change srvstr_get_path_internal() to always call check_path_syntaxXXX(), even on DFS pathnames. from 972dd999b8d smbd: Fix a "set but not used" warning
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 5075df4575d9250fa53dcef024589084ad56062d Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 11:32:05 2022 -0700 s3: smbd: Remove ugly SMB1-specific hack to filename_convert_dirfsp() This was added due to the error code check in test_symlink_traversal_smb1_posix.sh. After careful consideration I've realized the error code expected here is incorrect, and not providing any security benefit. We already check that trying to fetch a file/traverse through a symlink that points outside of a share returns NT_STATUS_OBJECT_PATH_NOT_FOUND, and this is enforced in the symlink checks already inside filename_convert_dirfsp(). If a symlink points to a directory within the share for which the user has no permissions (as is tested here), then there's no benefit in mapping the error code from NT_STATUS_ACCESS_DENIED to NT_STATUS_OBJECT_PATH_NOT_FOUND, as we are not providing any extra information about the filesystem state the user cannot already obtain by normal SMB1+POSIX calls. Change the error code expected in this single test from NT_STATUS_OBJECT_PATH_NOT_FOUND to NT_STATUS_ACCESS_DENIED. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Fri Aug 5 10:24:23 UTC 2022 on sn-devel-184 commit 5c9404f753173465900c004e444174d247f692f6 Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 10:02:15 2022 -0700 s3: smbd: Remove the ucf_flags parameter from extract_snapshot_token(). Now we always call check_path_syntaxXXX(), even on DFS names we no longer need this. It was a BAD change, and I should feel BAD :-). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit d21cf6bbb18e6f83739caa457c983b361be789b4 Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 13:23:28 2022 -0700 s3: smbd: Cleanup - integer align. consumedcnt should be a size_t. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 7ef1412f85273d27edbe4f8a02121c2d5d7479ac Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 13:08:51 2022 -0700 s3: smbd: Minor cleanup in parse_dfs_path(). allow_wcards parameter is not used or looked at. Remove it. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit e5a49c310da4b18e366762e073fc9244b96d1b46 Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 19:09:39 2022 -0700 s3: smbd: Remove 'bool posix_path' from struct dfs_path. Nothing now sets or looks at it. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit f24ef117cfa195ef19b8130040555b75f42ae00b Author: Jeremy Allison <j...@samba.org> Date: Thu Aug 4 09:52:17 2022 -0700 s3: smbd: Change srvstr_get_path_internal() to always call check_path_syntaxXXX(), even on DFS pathnames. The original design decision to just copy a DFS path and let parse_dfs_path() take care of it was a horrible mistake. Fix srvstr_get_path_internal() to always return a /server/share/path (i.e. a path separated with '/', not '\'). This is a more complex change than I like to allow DFS path procesing in srvstr_get_path_internal() but needed as clients (including Samba smbclient) have a rather "fuzzy" idea of what constitutes a valid DFS path. If we detect the DFS path isn't valid here we have to fall back to treating it as a local path. I also need to modify the DFS parsing in filename_convert_smb1_search_path() to cope with only '/' separators. This also means parse_dfs_path() needs changing to cope. The changes here are best reviewed by just applying the fix and looking at the modified functions: srvstr_get_path_internal() parse_dfs_path() For parse_dfs_path() it's mostly removing bad code and makes parse_dfs_path() much easier to read. These changes will enable me to remove some ugly mistakes made adding ucf_flags to extract_snapshot_token(), as we can now always assume canonicalized paths. This is a little messy, but has to be done in one chunk as the change to srvstr_get_path_internal() depends on the change to parse_dfs_path(). Thanks to Volker for the insight that made this cleanup possible. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/include/msdfs.h | 1 - source3/modules/vfs_default.c | 2 +- source3/rpc_server/dfs/srv_dfs_nt.c | 6 +- .../tests/test_symlink_traversal_smb1_posix.sh | 2 +- source3/smbd/filename.c | 42 +------ source3/smbd/msdfs.c | 130 +++++++++------------ source3/smbd/proto.h | 4 +- source3/smbd/smb1_nttrans.c | 7 +- source3/smbd/smb1_reply.c | 24 ++-- source3/smbd/smb1_trans2.c | 8 +- source3/smbd/smb2_reply.c | 78 ++++++++++++- source3/smbd/smb2_trans2.c | 8 +- 12 files changed, 159 insertions(+), 153 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/include/msdfs.h b/source3/include/msdfs.h index 6a851cb3330..83265174373 100644 --- a/source3/include/msdfs.h +++ b/source3/include/msdfs.h @@ -61,7 +61,6 @@ struct dfs_path { char *hostname; char *servicename; char *reqpath; - bool posix_path; }; #endif /* _MSDFS_H */ diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 8e6cbfd3707..ef68a96282e 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -194,7 +194,7 @@ static NTSTATUS vfswrap_get_dfs_referrals(struct vfs_handle_struct *handle, struct dfs_GetDFSReferral *r) { struct junction_map *junction = NULL; - int consumedcnt = 0; + size_t consumedcnt = 0; bool self_referral = false; char *pathnamep = NULL; char *local_dfs_path = NULL; diff --git a/source3/rpc_server/dfs/srv_dfs_nt.c b/source3/rpc_server/dfs/srv_dfs_nt.c index b69f7025191..a69494e3902 100644 --- a/source3/rpc_server/dfs/srv_dfs_nt.c +++ b/source3/rpc_server/dfs/srv_dfs_nt.c @@ -59,7 +59,7 @@ WERROR _dfs_Add(struct pipes_struct *p, struct dfs_Add *r) struct junction_map *jn = NULL; struct referral *old_referral_list = NULL; bool self_ref = False; - int consumedcnt = 0; + size_t consumedcnt = 0; char *altpath = NULL; NTSTATUS status; TALLOC_CTX *ctx = talloc_tos(); @@ -137,7 +137,7 @@ WERROR _dfs_Remove(struct pipes_struct *p, struct dfs_Remove *r) dcesrv_call_session_info(dce_call); struct junction_map *jn = NULL; bool self_ref = False; - int consumedcnt = 0; + size_t consumedcnt = 0; bool found = False; TALLOC_CTX *ctx = talloc_tos(); char *altpath = NULL; @@ -392,7 +392,7 @@ WERROR _dfs_GetInfo(struct pipes_struct *p, struct dfs_GetInfo *r) dcesrv_connection_get_remote_address(dcesrv_conn); struct auth_session_info *session_info = dcesrv_call_session_info(dce_call); - int consumedcnt = strlen(r->in.dfs_entry_path); + size_t consumedcnt = strlen(r->in.dfs_entry_path); struct junction_map *jn = NULL; bool self_ref = False; TALLOC_CTX *ctx = talloc_tos(); diff --git a/source3/script/tests/test_symlink_traversal_smb1_posix.sh b/source3/script/tests/test_symlink_traversal_smb1_posix.sh index 1bde9c4ffa1..1ad1d56f12a 100755 --- a/source3/script/tests/test_symlink_traversal_smb1_posix.sh +++ b/source3/script/tests/test_symlink_traversal_smb1_posix.sh @@ -252,7 +252,7 @@ test_symlink_traversal_SMB1_posix() # Can't 'get' file inside a directory with no perms. smbclient_expect_error "get" "dir_inside_share_noperms/noperm_file_exists" "" "NT_STATUS_ACCESS_DENIED" || return 1 # In SMB1+POSIX you can't traverse through a symlink that points to a noperm directory. - smbclient_expect_error "get" "symlink_dir_inside_share_noperms/noperm_file_exists" "" "NT_STATUS_OBJECT_PATH_NOT_FOUND" || return 1 + smbclient_expect_error "get" "symlink_dir_inside_share_noperms/noperm_file_exists" "" "NT_STATUS_ACCESS_DENIED" || return 1 # But can list the directory with no perms and the symlink to it. smbclient_expect_error "ls" "dir_inside_share_noperms" "" "NT_STATUS_OK" || return 1 smbclient_expect_error "ls" "symlink_dir_inside_share_noperms" "" "NT_STATUS_OK" || return 1 diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index e378bb72b32..87abc8be376 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -300,28 +300,14 @@ static bool find_snapshot_token( return true; } -bool extract_snapshot_token(char *fname, uint32_t ucf_flags, NTTIME *twrp) +bool extract_snapshot_token(char *fname, 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; } @@ -360,7 +346,7 @@ NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname, return NT_STATUS_OK; } - found = extract_snapshot_token(smb_fname->base_name, ucf_flags, &twrp); + found = extract_snapshot_token(smb_fname->base_name, &twrp); if (!found) { return NT_STATUS_OK; } @@ -1932,7 +1918,6 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx, char *p = NULL; char *mask = NULL; struct smb_filename *smb_fname = NULL; - bool posix_pathnames = (ucf_flags & UCF_POSIX_PATHNAMES); NTTIME twrp = 0; *_smb_fname_out = NULL; @@ -1942,17 +1927,14 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx, DBG_DEBUG("name_in: %s\n", name_in); if (ucf_flags & UCF_GMT_PATHNAME) { - extract_snapshot_token(name_in, ucf_flags, &twrp); + extract_snapshot_token(name_in, &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, in POSIX by '/' characters. */ - char path_sep = posix_pathnames ? '/' : '\\'; char *fname = NULL; char *name_in_copy = NULL; char *last_component = NULL; @@ -1967,7 +1949,7 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx, * Now we know that the last component is the * wildcard. Copy it and truncate to remove it. */ - p = strrchr_m(name_in_copy, path_sep); + p = strrchr(name_in_copy, '/'); if (p == NULL) { last_component = talloc_strdup(ctx, name_in_copy); name_in_copy[0] = '\0'; @@ -2835,22 +2817,6 @@ next: &substitute, &unparsed); -#if defined(WITH_SMB1SERVER) - /* - * This isn't 100% correct, but it gets us close enough - * to the old behavior for SMB1+POSIX libsmbclient. If we went through a - * symlink, and we got NT_STATUS_ACCESS_DENIED on the directory - * containing the target, just don't allow the client to see the - * intermediate path. - */ - if (!conn->sconn->using_smb2 && - (ucf_flags & UCF_POSIX_PATHNAMES) && - symlink_redirects > 0 && - NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) { - return NT_STATUS_OBJECT_PATH_NOT_FOUND; - } -#endif - if (!NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) { return status; } diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 86dc3f4dd74..1f24c87ccbd 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -37,11 +37,13 @@ #include "source3/lib/substitute.h" /********************************************************************** - Parse a DFS pathname of the form \hostname\service\reqpath + Parse a DFS pathname of the form /hostname/service/reqpath into the dfs_path structure. - If POSIX pathnames is true, the pathname may also be of the - form /hostname/service/reqpath. - We cope with either here. + + NB. srvstr_get_path_internal() now *always* calls + check_path_syntax_XXX() on an incoming name, so + the path separator is now always '/', even from + Windows clients. Unfortunately, due to broken clients who might set the SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES bit and then @@ -58,18 +60,15 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, const char *pathname, - bool allow_wcards, bool allow_broken_path, struct dfs_path *pdp) /* MUST BE TALLOCED */ { const struct loadparm_substitution *lp_sub = loadparm_s3_global_substitution(); char *pathname_local; - char *p,*temp; + char *p; char *servicename; char *eos_ptr; - NTSTATUS status = NT_STATUS_OK; - char sepchar; ZERO_STRUCTP(pdp); @@ -80,30 +79,28 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, */ pathname_local = talloc_strdup(pdp, pathname); - if (!pathname_local) { + if (pathname_local == NULL) { return NT_STATUS_NO_MEMORY; } + /* + * parse_dfs_path() can be called from + * get_referred_path() and create_junction() + * which use Windows DFS paths of \server\share. + * Ensure we only have to cope with '/' separators. + */ + string_replace(pathname_local, '\\', '/'); + /* Get a pointer to the terminating '\0' */ eos_ptr = &pathname_local[strlen(pathname_local)]; - p = temp = pathname_local; + p = pathname_local; /* * Non-broken DFS paths *must* start with the - * path separator. For Windows this is always '\\', - * for posix paths this is always '/'. + * path separator '/'. */ - if (*pathname == '/') { - pdp->posix_path = true; - sepchar = '/'; - } else { - pdp->posix_path = false; - sepchar = '\\'; - } - - if (allow_broken_path && (*pathname != sepchar)) { - DEBUG(10,("parse_dfs_path: path %s doesn't start with %c\n", - pathname, sepchar )); + if (allow_broken_path && (*p != '/')) { + DBG_ERR("path %s doesn't start with /\n", p); /* * Possibly client sent a local path by mistake. * Try and convert to a local path. @@ -114,12 +111,7 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, pdp->hostname = eos_ptr; /* "" */ pdp->servicename = eos_ptr; /* "" */ - /* We've got no info about separators. */ - pdp->posix_path = lp_posix_pathnames(); - p = temp; - DEBUG(10,("parse_dfs_path: trying to convert %s to a " - "local path\n", - temp)); + DBG_ERR("trying to convert %s to a local path\n", p); goto local_path; } @@ -127,17 +119,15 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, * Safe to use on talloc'ed string as it only shrinks. * It also doesn't affect the eos_ptr. */ - trim_char(temp,sepchar,sepchar); + trim_char(p, '/', '/'); - DEBUG(10,("parse_dfs_path: temp = |%s| after trimming %c's\n", - temp, sepchar)); + DBG_ERR("p = |%s| after trimming /'s\n", p); /* Now tokenize. */ /* Parse out hostname. */ - p = strchr_m(temp,sepchar); + p = strchr(p,'/'); if(p == NULL) { - DEBUG(10,("parse_dfs_path: can't parse hostname from path %s\n", - temp)); + DBG_ERR("can't parse hostname from path %s\n", pathname_local); /* * Possibly client sent a local path by mistake. * Try and convert to a local path. @@ -146,20 +136,18 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, pdp->hostname = eos_ptr; /* "" */ pdp->servicename = eos_ptr; /* "" */ - p = temp; - DEBUG(10,("parse_dfs_path: trying to convert %s " - "to a local path\n", - temp)); + p = pathname_local; + DBG_ERR("trying to convert %s to a local path\n", p); goto local_path; } *p = '\0'; - pdp->hostname = temp; + pdp->hostname = pathname_local; - DEBUG(10,("parse_dfs_path: hostname: %s\n",pdp->hostname)); + DBG_ERR("hostname: %s\n",pdp->hostname); /* Parse out servicename. */ servicename = p+1; - p = strchr_m(servicename,sepchar); + p = strchr(servicename, '/'); if (p) { *p = '\0'; } @@ -169,8 +157,7 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, || (strequal(servicename, HOMES_NAME) && strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)), get_current_username()) )) ) { - DEBUG(10,("parse_dfs_path: %s is not our servicename\n", - servicename)); + DBG_ERR("%s is not our servicename\n", servicename); /* * Possibly client sent a local path by mistake. @@ -183,21 +170,20 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, /* Repair the path - replace the sepchar's we nulled out */ servicename--; - *servicename = sepchar; + *servicename = '/'; if (p) { - *p = sepchar; + *p = '/'; } - p = temp; - DEBUG(10,("parse_dfs_path: trying to convert %s " - "to a local path\n", - temp)); + p = pathname_local; + DBG_ERR("trying to convert %s to a local path\n", + pathname_local); goto local_path; } pdp->servicename = servicename; - DEBUG(10,("parse_dfs_path: servicename: %s\n",pdp->servicename)); + DBG_ERR("servicename: %s\n", pdp->servicename); if(p == NULL) { /* Client sent self referral \server\share. */ @@ -209,22 +195,14 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, local_path: - pdp->reqpath = p; - - /* Rest is reqpath. */ - if (pdp->posix_path) { - status = check_path_syntax_posix(pdp->reqpath); - } else { - status = check_path_syntax(pdp->reqpath); - } - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(10,("parse_dfs_path: '%s' failed with %s\n", - p, nt_errstr(status) )); - return status; - } + /* + * As check_path_syntax_XXX() has already been + * called we know this is a normal path containing + * '/' separators. + */ - DEBUG(10,("parse_dfs_path: rest of the path: %s\n",pdp->reqpath)); + pdp->reqpath = p; + DBG_ERR("rest of the path: %s\n", pdp->reqpath); return NT_STATUS_OK; } @@ -688,7 +666,7 @@ static NTSTATUS dfs_path_lookup(TALLOC_CTX *ctx, server+share+extrapath. */ uint32_t ucf_flags, NTTIME *_twrp, - int *consumedcntp, + size_t *consumedcntp, struct referral **ppreflist, size_t *preferral_count) { @@ -765,9 +743,7 @@ static NTSTATUS dfs_path_lookup(TALLOC_CTX *ctx, status = NT_STATUS_NO_MEMORY; goto out; } - if (!pdp->posix_path) { - string_replace(canon_dfspath, '\\', '/'); - } + string_replace(canon_dfspath, '\\', '/'); /* * localpath comes out of unix_convert, so it has @@ -830,7 +806,7 @@ static NTSTATUS dfs_path_lookup(TALLOC_CTX *ctx, if (consumedcntp) { *consumedcntp = strlen(canon_dfspath); DBG_DEBUG("Path consumed: %s " - "(%d)\n", + "(%zu)\n", canon_dfspath, *consumedcntp); } @@ -894,7 +870,7 @@ NTSTATUS dfs_redirect(TALLOC_CTX *ctx, return NT_STATUS_NO_MEMORY; } - status = parse_dfs_path(conn, path_in, false, + status = parse_dfs_path(conn, path_in, allow_broken_path, pdp); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(pdp); @@ -952,7 +928,7 @@ NTSTATUS dfs_redirect(TALLOC_CTX *ctx, pdp, ucf_flags, _twrp, /* twrp. */ - NULL, /* int *consumedcntp */ + NULL, /* size_t *consumedcntp */ NULL, /* struct referral **ppreflist */ NULL); /* size_t *preferral_count */ if (!NT_STATUS_IS_OK(status)) { @@ -989,7 +965,7 @@ NTSTATUS dfs_redirect(TALLOC_CTX *ctx, static NTSTATUS self_ref(TALLOC_CTX *ctx, const char *dfs_path, struct junction_map *jucn, - int *consumedcntp, + size_t *consumedcntp, bool *self_referralp) { struct referral *ref; @@ -1025,7 +1001,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx, const struct tsocket_address *local_address, bool allow_broken_path, struct junction_map *jucn, - int *consumedcntp, + size_t *consumedcntp, bool *self_referralp) { TALLOC_CTX *frame = talloc_stackframe(); @@ -1044,7 +1020,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx, *self_referralp = False; - status = parse_dfs_path(NULL, dfs_path, False, allow_broken_path, pdp); + status = parse_dfs_path(NULL, dfs_path, allow_broken_path, pdp); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(frame); return status; @@ -1293,7 +1269,7 @@ bool create_junction(TALLOC_CTX *ctx, if (!pdp) { return False; } - status = parse_dfs_path(NULL, dfs_path, False, allow_broken_path, pdp); + status = parse_dfs_path(NULL, dfs_path, allow_broken_path, pdp); if (!NT_STATUS_IS_OK(status)) { return False; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 8f3182a025e..daef19f13f7 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, uint32_t ucf_flags, NTTIME *twrp); +bool extract_snapshot_token(char *fname, NTTIME *twrp); NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname, uint32_t ucf_flags, NTTIME twrp); @@ -538,7 +538,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx, const struct tsocket_address *local_address, bool allow_broken_path, struct junction_map *jucn, - int *consumedcntp, + size_t *consumedcntp, bool *self_referralp); int setup_dfs_referral(connection_struct *orig_conn, const char *dfs_path, diff --git a/source3/smbd/smb1_nttrans.c b/source3/smbd/smb1_nttrans.c index 05f341ae505..4a0cfcc1133 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) { -- Samba Shared Repository