[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Wed Nov 15 06:11:01 UTC 2023


The branch, master has been updated
       via  4e585186f2b smbd: Get the symlink mode for posix through fdos_mode()
       via  aaa73cce1da smbd: Centralize fdos_mode() in smbd_dirptr_get_entry()
       via  80c98acbf05 smbd: Centralize wiping the ".." stat info
       via  c96010a2a9f smbd: Simplify smbd_dirptr_get_entry()
       via  6b0cfcdbc37 smbd: Remove a pointless NULL check
       via  5991f4e66b5 smbd: Slightly simplify smbd_dirptr_get_entry()
       via  901c7cc6aaf smbd: Move mask_match_search() to smb1_reply.c
       via  b1e5ed4490f smbd: Simplify smbd_dirptr_get_entry()
       via  47f36e0b1df smbd: Simplify smbd_dirptr_8_3_mode_fn()
       via  f905384f5df smbd: Rename "fsp" to "dirfsp" in smbd_smb2_query_directory_state
       via  f195df4e652 smbd: Directly print errno in openat_pathref_fsp_lcomp()
       via  46372997a09 smbd: Remove a NULL check that became obsolete
       via  15648b5da5d smbd: Modernize a DEBUG statement
      from  b6661e77de2 netcmd: docs: update docs for silo member grant + revoke

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4e585186f2b4905ab4504a464766b3fda1875cb3
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 14 12:12:22 2023 +0100

    smbd: Get the symlink mode for posix through fdos_mode()
    
    fdos_mode() has special code to deal with symlinks, so we don't have
    to replicate that logic here.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Wed Nov 15 06:10:38 UTC 2023 on atb-devel-224

commit aaa73cce1da0c9058615a9b3d91e926d445277de
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 14 12:11:17 2023 +0100

    smbd: Centralize fdos_mode() in smbd_dirptr_get_entry()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 80c98acbf0550c760dbc9de2cc7a3328c3c53bd6
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 14 12:09:54 2023 +0100

    smbd: Centralize wiping the ".." stat info
    
    Make sure this also happens for symlinks etc.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c96010a2a9ff59b3cc086fc3df15ce9408fe5986
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Nov 13 13:46:51 2023 +0100

    smbd: Simplify smbd_dirptr_get_entry()
    
    This uses the much simpler openat_pathef_fsp_lcomp, avoiding
    non_widelink_open where we don't need it. The only case where we still
    have to call openat_pathref_fsp() in its full capacity is to find out
    whether a symlink we found is dangling or not.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6b0cfcdbc3755709f928ac4bc010d130deb042fe
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Nov 13 13:48:42 2023 +0100

    smbd: Remove a pointless NULL check
    
    We've dereferenced smb_fname before, and talloc_move() never fails.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5991f4e66b59cda65142a68f9db4e0fa1b7b147d
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Nov 13 10:25:58 2023 +0100

    smbd: Slightly simplify smbd_dirptr_get_entry()
    
    Check for dirptr being toplevel just once.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 901c7cc6aafc98a91888e6ca7c9f7cb2ccdf8627
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 12 11:48:30 2023 +0100

    smbd: Move mask_match_search() to smb1_reply.c
    
    Only called there.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit b1e5ed4490ff92f001d9f0d282059c4cc17e19a7
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 12 11:30:11 2023 +0100

    smbd: Simplify smbd_dirptr_get_entry()
    
    Both mode_fn's are now the same. Fold them into smbd_dirptr_get_entry()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 47f36e0b1df028cf9abf1a88efaf0296c527e18b
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 11 19:12:16 2023 +0100

    smbd: Simplify smbd_dirptr_8_3_mode_fn()
    
    Do the smb1-specific code directly in smb1-code. Don't tunnel it
    through generic smb1/smb2 code.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f905384f5dfe8e297a54e3e3ad1d2ecd13e96713
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 9 12:50:07 2023 +0100

    smbd: Rename "fsp" to "dirfsp" in smbd_smb2_query_directory_state
    
    Makes it clearer to me what we have there.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f195df4e65257b8fe1175135fd1217dd9541cbff
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 14 10:53:30 2023 +0100

    smbd: Directly print errno in openat_pathref_fsp_lcomp()
    
    This is where the error came from.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 46372997a09c6c4cc213941d3d510cfebf500855
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 9 12:25:32 2023 +0100

    smbd: Remove a NULL check that became obsolete
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 15648b5da5d69f4c6ab614cf9288180d55ebc15d
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Nov 13 17:30:22 2023 +0100

    smbd: Modernize a DEBUG statement
    
    Avoid casts
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h             |   1 -
 source3/lib/util.c                  |  16 ---
 source3/smbd/dir.c                  | 271 ++++++++++++++----------------------
 source3/smbd/dosmode.c              |  10 --
 source3/smbd/durable.c              |  16 +--
 source3/smbd/files.c                |   2 +-
 source3/smbd/globals.h              |   6 -
 source3/smbd/smb1_reply.c           |  51 +++----
 source3/smbd/smb2_query_directory.c |  18 +--
 source3/smbd/smb2_trans2.c          |  18 ---
 10 files changed, 147 insertions(+), 262 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 06ad7fb508a..13152f7a10a 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -347,7 +347,6 @@ bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
 bool ms_has_wild(const char *s);
 bool ms_has_wild_w(const smb_ucs2_t *s);
 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive);
-bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive);
 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive);
 #include "lib/util/unix_match.h"
 bool name_to_fqdn(fstring fqdn, const char *name);
diff --git a/source3/lib/util.c b/source3/lib/util.c
index f891842a6b7..fa01f419d65 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -1481,22 +1481,6 @@ bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
 	return ms_fnmatch_protocol(pattern, string, Protocol, is_case_sensitive) == 0;
 }
 
-/*******************************************************************
- A wrapper that handles case sensitivity and the special handling
- of the ".." name. Variant that is only called by old search code which requires
- pattern translation.
-*******************************************************************/
-
-bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
-{
-	if (ISDOTDOT(string))
-		string = ".";
-	if (ISDOT(pattern))
-		return False;
-
-	return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
-}
-
 /*******************************************************************
  A wrapper that handles a list of patterns and calls mask_match()
  on each.  Returns True if any of the patterns match.
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 2fc364a42fd..d9e10b919d3 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -517,12 +517,6 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 					    const char *dname,
 					    const char *mask,
 					    char **_fname),
-			   bool (*mode_fn)(TALLOC_CTX *ctx,
-					   void *private_data,
-					   struct files_struct *dirfsp,
-					   struct smb_filename *smb_fname,
-					   bool get_dosmode,
-					   uint32_t *_mode),
 			   void *private_data,
 			   char **_fname,
 			   struct smb_filename **_smb_fname,
@@ -532,7 +526,7 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 	struct smb_Dir *dir_hnd = dirptr->dir_hnd;
 	struct smb_filename *dir_fname = dir_hnd->dir_smb_fname;
 	bool posix = (dir_fname->flags & SMB_FILENAME_POSIX_PATH);
-	const char *dpath = dir_fname->base_name;
+	const bool toplevel = ISDOT(dir_fname->base_name);
 	NTSTATUS status;
 
 	*_smb_fname = NULL;
@@ -557,9 +551,10 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 		char *dname = NULL;
 		char *fname = NULL;
 		struct smb_filename *smb_fname = NULL;
-		struct open_symlink_err *symlink_err = NULL;
 		uint32_t mode = 0;
 		bool get_dosmode = get_dosmode_in;
+		bool toplevel_dotdot;
+		bool visible;
 		bool ok;
 
 		dname = dptr_ReadDirName(ctx, dirptr);
@@ -592,183 +587,116 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 			continue;
 		}
 
-		if (ISDOT(dname) || ISDOTDOT(dname)) {
+		toplevel_dotdot = toplevel && ISDOTDOT(dname);
 
-			const char *dotname = dname;
-
-			if (ISDOTDOT(dname) && ISDOT(dpath)) {
-				/*
-				 * Handle ".." in toplevel like "." to not
-				 * leak info from outside the share.
-				 */
-				dotname = ".";
-			}
-
-			smb_fname = synthetic_smb_fname(talloc_tos(),
-							dotname,
-							NULL,
-							NULL,
-							dir_fname->twrp,
-							dir_fname->flags);
-			if (smb_fname == NULL) {
-				TALLOC_FREE(dname);
-				return false;
-			}
-
-			status = openat_pathref_fsp(dir_hnd->fsp, smb_fname);
-			if (!NT_STATUS_IS_OK(status)) {
-				DBG_INFO("Could not open \"..\": %s\n",
-					 nt_errstr(status));
-				TALLOC_FREE(smb_fname);
-				TALLOC_FREE(dname);
-				continue;
-			}
+		smb_fname = synthetic_smb_fname(talloc_tos(),
+						toplevel_dotdot ? "." : dname,
+						NULL,
+						NULL,
+						dir_fname->twrp,
+						dir_fname->flags);
+		if (smb_fname == NULL) {
+			TALLOC_FREE(dname);
+			return false;
+		}
 
-			mode = fdos_mode(smb_fname->fsp);
+		/*
+		 * UCF_POSIX_PATHNAMES to avoid the readdir fallback
+		 * if we get raced between readdir and unlink.
+		 */
+		status = openat_pathref_fsp_lcomp(dir_hnd->fsp,
+						  smb_fname,
+						  UCF_POSIX_PATHNAMES);
+		if (!NT_STATUS_IS_OK(status)) {
+			DBG_DEBUG("Could not open %s: %s\n",
+				  dname,
+				  nt_errstr(status));
+			TALLOC_FREE(smb_fname);
+			TALLOC_FREE(fname);
+			TALLOC_FREE(dname);
+			continue;
+		}
 
-			/*
-			 * Don't leak INO/DEV/User SID/Group SID about
-			 * the containing directory of the share.
-			 */
-			if (ISDOT(dpath) && ISDOTDOT(dname)) {
-				/*
-				 * Ensure posix fileid and sids are hidden
-				 */
-				smb_fname->st.st_ex_ino = 0;
-				smb_fname->st.st_ex_dev = 0;
-				smb_fname->st.st_ex_uid = -1;
-				smb_fname->st.st_ex_gid = -1;
-			}
+		visible = is_visible_fsp(smb_fname->fsp);
+		if (!visible) {
+			TALLOC_FREE(smb_fname);
+			TALLOC_FREE(fname);
+			TALLOC_FREE(dname);
+			continue;
+		}
 
+		if (!S_ISLNK(smb_fname->st.st_ex_mode)) {
 			goto done;
 		}
 
-		status = openat_pathref_fsp_nosymlink(talloc_tos(),
-						      conn,
-						      dir_hnd->fsp,
-						      dname,
-						      dir_fname->twrp,
-						      posix,
-						      &smb_fname,
-						      &symlink_err);
-
-		if (NT_STATUS_IS_OK(status)) {
-			bool visible = is_visible_fsp(smb_fname->fsp);
-			if (!visible) {
-				TALLOC_FREE(smb_fname);
-				TALLOC_FREE(dname);
-				TALLOC_FREE(fname);
-				continue;
-			}
-		} else if (NT_STATUS_EQUAL(status,
-					   NT_STATUS_STOPPED_ON_SYMLINK)) {
-			struct symlink_reparse_struct *reparse =
-				symlink_err->reparse;
-			const char *target = reparse->substitute_name;
-			bool is_msdfs_link;
-
-			is_msdfs_link = lp_host_msdfs();
-			is_msdfs_link &= lp_msdfs_root(SNUM(conn));
-			is_msdfs_link &= (strncmp(target, "msdfs:", 6) == 0);
-
-			if (is_msdfs_link) {
-				char *path = NULL;
-
-				path = full_path_from_dirfsp_at_basename(
-					talloc_tos(),
-					dir_hnd->fsp,
-					dname);
-				if (path == NULL) {
-					return false;
-				}
-
-				smb_fname =
-					synthetic_smb_fname(talloc_tos(),
-							    path,
-							    NULL,
-							    &symlink_err->st,
-							    dir_fname->twrp,
-							    dir_fname->flags);
-				TALLOC_FREE(path);
-				if (smb_fname == NULL) {
-					return false;
-				}
-
-				DBG_INFO("Masquerading msdfs link %s as a"
-					 "directory\n",
-					 smb_fname->base_name);
-
-				smb_fname->st.st_ex_mode =
-					(smb_fname->st.st_ex_mode & ~S_IFMT) |
-					S_IFDIR;
-
-				mode = dos_mode_msdfs(conn,
-						      dname,
-						      &smb_fname->st);
-				get_dosmode = false;
-				ask_sharemode = false;
-				goto done;
-			}
+		if (lp_host_msdfs() && lp_msdfs_root(SNUM(conn)) &&
+		    is_msdfs_link(dir_hnd->fsp, smb_fname))
+		{
+			DBG_INFO("Masquerading msdfs link %s as a directory\n",
+				 smb_fname->base_name);
 
-			smb_fname = synthetic_smb_fname(talloc_tos(),
-							dname,
-							NULL,
-							&symlink_err->st,
-							dir_fname->twrp,
-							dir_fname->flags);
-			if (smb_fname == NULL) {
-				return false;
-			}
+			smb_fname->st.st_ex_mode = (smb_fname->st.st_ex_mode &
+						    ~S_IFMT) |
+						   S_IFDIR;
 
-			status = openat_pathref_fsp(dir_hnd->fsp, smb_fname);
+			mode = dos_mode_msdfs(conn, dname, &smb_fname->st);
+			get_dosmode = false;
+			ask_sharemode = false;
+			goto done;
+		}
 
-			if (posix) {
-				/*
-				 * Posix always wants to see symlinks,
-				 * dangling or not. We've done the
-				 * openat_pathref_fsp() to fill in
-				 * smb_fname->fsp just in case it's
-				 * not dangling.
-				 */
-				mode = FILE_ATTRIBUTE_NORMAL;
-				get_dosmode = false;
-				ask_sharemode = false;
-				goto done;
-			}
+		if (posix) {
+			/*
+			 * Posix always wants to see symlinks,
+			 * dangling or not. We've done the
+			 * openat_pathref_fsp() to fill in
+			 * smb_fname->fsp just in case it's not
+			 * dangling.
+			 */
+			ask_sharemode = false;
+			goto done;
+		}
 
-			if (!NT_STATUS_IS_OK(status)) {
-				/*
-				 * Dangling symlink. Hide.
-				 */
-				TALLOC_FREE(smb_fname);
-				TALLOC_FREE(fname);
-				TALLOC_FREE(dname);
-				continue;
-			}
-		} else {
-			DBG_NOTICE("Could not open %s: %s\n",
-				   dname,
-				   nt_errstr(status));
-			TALLOC_FREE(dname);
-			TALLOC_FREE(fname);
+		if (!lp_follow_symlinks(SNUM(conn))) {
+			/*
+			 * Hide symlinks not followed
+			 */
 			TALLOC_FREE(smb_fname);
+			TALLOC_FREE(fname);
+			TALLOC_FREE(dname);
 			continue;
 		}
 
-		ok = mode_fn(ctx,
-			     private_data,
-			     dir_hnd->fsp,
-			     smb_fname,
-			     get_dosmode,
-			     &mode);
-		if (!ok) {
+		/*
+		 * We have to find out if it's a dangling
+		 * symlink. Use the fat logic behind
+		 * openat_pathref_fsp().
+		 */
+
+		{
+			struct files_struct *fsp = smb_fname->fsp;
+			smb_fname_fsp_unlink(smb_fname);
+			fd_close(fsp);
+			file_free(NULL, fsp);
+		}
+
+		status = openat_pathref_fsp(dir_hnd->fsp, smb_fname);
+
+		if (!NT_STATUS_IS_OK(status)) {
+			/*
+			 * Dangling symlink. Hide.
+			 */
 			TALLOC_FREE(smb_fname);
-			TALLOC_FREE(dname);
 			TALLOC_FREE(fname);
+			TALLOC_FREE(dname);
 			continue;
 		}
 
-	done:
+done:
+		if (get_dosmode) {
+			mode = fdos_mode(smb_fname->fsp);
+			smb_fname->st = smb_fname->fsp->fsp_name->st;
+		}
 
 		if (!dir_check_ftype(mode, dirtype)) {
 			DBG_INFO("[%s] attribs 0x%" PRIx32 " didn't match "
@@ -795,6 +723,16 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 			}
 		}
 
+		if (toplevel_dotdot) {
+			/*
+			 * Ensure posix fileid and sids are hidden
+			 */
+			smb_fname->st.st_ex_ino = 0;
+			smb_fname->st.st_ex_dev = 0;
+			smb_fname->st.st_ex_uid = -1;
+			smb_fname->st.st_ex_gid = -1;
+		}
+
 		DBG_NOTICE("mask=[%s] found %s fname=%s (%s)\n",
 			   mask,
 			   smb_fname_str_dbg(smb_fname),
@@ -804,9 +742,6 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 		TALLOC_FREE(dname);
 
 		*_smb_fname = talloc_move(ctx, &smb_fname);
-		if (*_smb_fname == NULL) {
-			return false;
-		}
 		*_fname = fname;
 		*_mode = mode;
 
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index 229a85a9171..41241fd2bfc 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -686,16 +686,6 @@ uint32_t fdos_mode(struct files_struct *fsp)
 	uint32_t result = 0;
 	NTSTATUS status = NT_STATUS_OK;
 
-	if (fsp == NULL) {
-		/*
-		 * The pathological case where a caller does
-		 * fdos_mode(smb_fname->fsp) passing a pathref fsp. But as
-		 * smb_fname points at a symlink in POSIX context smb_fname->fsp
-		 * is NULL.
-		 */
-		return FILE_ATTRIBUTE_NORMAL;
-	}
-
 	DBG_DEBUG("%s\n", fsp_str_dbg(fsp));
 
 	if (fsp->fake_file_handle != NULL) {
diff --git a/source3/smbd/durable.c b/source3/smbd/durable.c
index b21c223b2e4..5f55ff658bb 100644
--- a/source3/smbd/durable.c
+++ b/source3/smbd/durable.c
@@ -486,14 +486,14 @@ static bool vfs_default_durable_reconnect_check_stat(
 	}
 
 	if (cookie_st->st_ex_flags != fsp_st->st_ex_flags) {
-		DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-			  "stat_ex.%s differs: "
-			  "cookie:%llu != stat:%llu, "
-			  "denying durable reconnect\n",
-			  name,
-			  "st_ex_flags",
-			  (unsigned long long)cookie_st->st_ex_flags,
-			  (unsigned long long)fsp_st->st_ex_flags));
+		DBG_WARNING(" (%s): "
+			    "stat_ex.%s differs: "
+			    "cookie:%"PRIu32" != stat:%"PRIu32", "
+			    "denying durable reconnect\n",
+			    name,
+			    "st_ex_flags",
+			    cookie_st->st_ex_flags,
+			    fsp_st->st_ex_flags);
 		return false;
 	}
 
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 28a741c8b54..5da90480a67 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -1576,7 +1576,7 @@ NTSTATUS openat_pathref_fsp_lcomp(struct files_struct *dirfsp,
 			  (fd >= 0) ? "F" : "",
 			  dirfsp->fsp_name->base_name,
 			  smb_fname_rel->base_name,
-			  nt_errstr(status));
+			  strerror(errno));
 		fd_close(fsp);
 		file_free(NULL, fsp);
 		return status;
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index f58e3176f31..0c7e791711f 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -171,12 +171,6 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 					    const char *dname,
 					    const char *mask,
 					    char **_fname),
-			   bool (*mode_fn)(TALLOC_CTX *ctx,
-					   void *private_data,
-					   struct files_struct *dirfsp,
-					   struct smb_filename *smb_fname,
-					   bool get_dosmode,
-					   uint32_t *_mode),
 			   void *private_data,
 			   char **_fname,
 			   struct smb_filename **_smb_fname,
diff --git a/source3/smbd/smb1_reply.c b/source3/smbd/smb1_reply.c
index addca927c74..ed6a1737485 100644
--- a/source3/smbd/smb1_reply.c
+++ b/source3/smbd/smb1_reply.c
@@ -1125,6 +1125,25 @@ static void make_dir_struct(TALLOC_CTX *ctx,
 	DEBUG(8,("put name [%s] from [%s] into dir struct\n",buf+30, fname));
 }
 
+/*******************************************************************
+ A wrapper that handles case sensitivity and the special handling
+ of the ".." name.
+*******************************************************************/
+
+static bool mask_match_search(const char *string,
+			      const char *pattern,
+			      bool is_case_sensitive)
+{
+	if (ISDOTDOT(string)) {
+		string = ".";
+	}
+	if (ISDOT(pattern)) {
+		return False;
+	}
+
+	return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
+}
+
 static bool mangle_mask_match(connection_struct *conn,
 			      const char *filename,
 			      const char *mask)
@@ -1199,30 +1218,6 @@ static bool smbd_dirptr_8_3_match_fn(TALLOC_CTX *ctx,
 	return false;
 }
 
-static bool smbd_dirptr_8_3_mode_fn(TALLOC_CTX *ctx,
-				    void *private_data,
-				    struct files_struct *dirfsp,
-				    struct smb_filename *smb_fname,
-				    bool get_dosmode,
-				    uint32_t *_mode)
-{
-	if (*_mode & FILE_ATTRIBUTE_REPARSE_POINT) {
-		/*
-		 * Don't show symlinks/special files to old clients


-- 
Samba Shared Repository



More information about the samba-cvs mailing list