[SCM] Samba Shared Repository - branch master updated

Ralph Böhme slow at samba.org
Tue Nov 16 21:07:02 UTC 2021


The branch, master has been updated
       via  1c8ea2448ea s3: smbd: In SMB1 call_trans2findnext() add and use a helper variable to ensure we don't call mangle_is_mangled() with a posix name.
       via  761c9190454 s3: smbd: In unlink_internals() ensure we never call mangle_is_mangled for a posix path.
       via  e2c45a09263 s3: smbd: SMB1 reply_copy(). Posix pathnames always means case_sensitive = true.
       via  e3c40250fb1 s3: smbd: SMB1 reply_copy(). Posix pathnames should never call into mangle_is_mangled().
       via  d0d8f32d8f7 s3: smbd: In SMB1 reply_copy(), make req->posix_pathnames a helper variable.
       via  826ae5c8069 s3: smbd: Add and use helper variables for case_sensitive, case_preserve, short_case_preserve to rename_internals().
       via  395acac7b46 s3: smbd: Ensure we never call mangle_is_mangled() for a posix path.
       via  23be0565dc7 s3: smbd: Add and use helper variable posix_pathname in rename_internals().
       via  026b4318967 s3: smbd: Add and use helper variables case_sensitive, case_preserve in rename_internals_fsp().
       via  836d6f8a226 s3: smbd: Add and use case_sensitive helper variable to unlink_internals().
       via  89d986ec130 s3: smbd: Use a helper variable in smbd_smb2_query_directory_send().
       via  db6902a3c58 s3: smbd: In open_file() use the helper variable to select correct case_sensitive setting to is_in_path().
       via  51b582546b5 s3: smbd: In open_file(), use a helper variable instead of always checking sp->posix_flags & FSP_POSIX_FLAGS_OPEN.
       via  df8abb5aa76 s3: smbd: Use dptr_case_sensitive() in directory listing code.
       via  e163f22e81d s3: smbd: Add dptr_case_sensitive(). Not yet used.
       via  ab1e97f87b1 s3: smbd: In OpenDir_fsp(), set dir_hnd->case_sensitive to true if FSP_POSIX_FLAGS_OPEN is set.
       via  ede3a45dfca s3: smbd: Use dir_hnd->case_sensitive instead of conn->case_sensitive.
       via  af35c684a39 s3: smbd: Add case_sensitive to struct smb_Dir.
       via  1b130decc2b s3: smbd: Use state->case_sensitive instead of state->conn->case_sensitive.
       via  1240f741e66 s3: smbd: Add 'bool case_sensitive' to struct smbd_dirptr_lanman2_state.
       via  1cc5a394209 s3: smbd: In unix_convert() component_was_mangled is always false for posix.
       via  3911ca59f48 s3: smbd: In unix_convert_step_search_fail() ensure posix names don't call into name mangling functions.
       via  d650d9ad8ae s3: smbd: Add comment to unix_convert() explaining why posix never calls into mangle_is_mangled() here.
       via  77f54fc14f2 s3: smbd: Turn on case sensitivity for a posix filename lookup.
       via  f4354571d61 s3: smbd: Use state->short_case_preserve instead of state->conn->short_case_preserve.
       via  598c07b106e s3: smbd: Use state->case_preserve instead of state->conn->case_preserve.
       via  2910657694e s3: smbd: Use state->case_sensitive instead of state->conn->case_sensitive.
       via  35ee8a7b6c7 s3: smbd: Add case_sensitive, case_preserve, short_case_preserve to state struct.
       via  b460c534272 s3: smbd: Ensure normalize_filename_case() doesn't modify posix names.
       via  86e42fb4841 s3: smbd: Add ucf_flags parameter to normalize_filename_case().
       via  3f0935b369e s3: smbd: get_real_filename() is actually static to filename.c
      from  a8c0c2c9e3a smbd: get rid of get_file_handle_for_metadata()

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


- Log -----------------------------------------------------------------
commit 1c8ea2448eaacb84c1c134e9597a5f873779b0a4
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 9 14:57:18 2021 -0800

    s3: smbd: In SMB1 call_trans2findnext() add and use a helper variable to ensure we don't call mangle_is_mangled() with a posix name.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Ralph Böhme <slow at samba.org>
    Autobuild-Date(master): Tue Nov 16 21:06:38 UTC 2021 on sn-devel-184

commit 761c9190454ce1704a041275723e23025bf62cf3
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 9 14:55:05 2021 -0800

    s3: smbd: In unlink_internals() ensure we never call mangle_is_mangled for a posix path.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e2c45a092639c56d4a6b615fecef6d85f13b87eb
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 9 14:28:34 2021 -0800

    s3: smbd: SMB1 reply_copy(). Posix pathnames always means case_sensitive = true.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e3c40250fb1afafe833a02ff65474a76ea6e41eb
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 9 14:23:22 2021 -0800

    s3: smbd: SMB1 reply_copy(). Posix pathnames should never call into mangle_is_mangled().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit d0d8f32d8f764bb2c9c00a3eda36367a7cd5a08f
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 9 14:21:41 2021 -0800

    s3: smbd: In SMB1 reply_copy(), make req->posix_pathnames a helper variable.
    
    I need to use it elsewhere in here.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 826ae5c80694093f65809b314c72fd5e1cb45b47
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 16:37:26 2021 -0800

    s3: smbd: Add and use helper variables for case_sensitive, case_preserve, short_case_preserve to rename_internals().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 395acac7b465c5b8e9461d42f50e860003a98bad
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 16:31:40 2021 -0800

    s3: smbd: Ensure we never call mangle_is_mangled() for a posix path.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 23be0565dc738e98d1619435dffb716726b62214
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 16:30:27 2021 -0800

    s3: smbd: Add and use helper variable posix_pathname in rename_internals().
    
    We're going to re-use it inside this function.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 026b4318967eb923b8b5666e7b8e977b43b2dbcc
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 16:27:19 2021 -0800

    s3: smbd: Add and use helper variables case_sensitive, case_preserve in rename_internals_fsp().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 836d6f8a22696e1de4009dbde46bf355261f8e7a
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 16:22:50 2021 -0800

    s3: smbd: Add and use case_sensitive helper variable to unlink_internals().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 89d986ec13085f416e24276375cc1d2353077010
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 15:59:51 2021 -0800

    s3: smbd: Use a helper variable in smbd_smb2_query_directory_send().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit db6902a3c5889112b5349b28b10df813fc747525
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 14:10:59 2021 -0800

    s3: smbd: In open_file() use the helper variable to select correct case_sensitive setting to is_in_path().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 51b582546b5d613a108f8b5a3ef4b7a1cd99df86
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 14:09:53 2021 -0800

    s3: smbd: In open_file(), use a helper variable instead of always checking sp->posix_flags & FSP_POSIX_FLAGS_OPEN.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit df8abb5aa760363391edd2def3f2edb667d66ba2
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 11:25:26 2021 -0800

    s3: smbd: Use dptr_case_sensitive() in directory listing code.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e163f22e81d082e2ca161ee032eb14083154b70f
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Nov 8 11:21:03 2021 -0800

    s3: smbd: Add dptr_case_sensitive(). Not yet used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit ab1e97f87b10596a83794579ac0bfb4be39eded2
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Nov 5 16:43:14 2021 -0700

    s3: smbd: In OpenDir_fsp(), set dir_hnd->case_sensitive to true if FSP_POSIX_FLAGS_OPEN is set.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit ede3a45dfcaa91bbf8c64683ec51eeba9054cfbb
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 16:52:10 2021 -0700

    s3: smbd: Use dir_hnd->case_sensitive instead of conn->case_sensitive.
    
    No logic change.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit af35c684a39ed59a750a03b71ef78522fc14ce13
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 16:48:03 2021 -0700

    s3: smbd: Add case_sensitive to struct smb_Dir.
    
    Not yet used.
    
    This allows it to be independent of conn settings on
    a per-handle-basis for SMB2 posix.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 1b130decc2bb17b058d57bbcd46babb5b2b939a6
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Nov 5 16:55:06 2021 -0700

    s3: smbd: Use state->case_sensitive instead of state->conn->case_sensitive.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 1240f741e6672a0bef036c8d1b1f89507ec0b599
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Nov 5 16:53:26 2021 -0700

    s3: smbd: Add 'bool case_sensitive' to struct smbd_dirptr_lanman2_state.
    
    Initialize from conn->case_sensitive. Not yet used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 1cc5a394209f018f4c41d07bc0c790fb2bd5b29e
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 16:26:24 2021 -0700

    s3: smbd: In unix_convert() component_was_mangled is always false for posix.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 3911ca59f48f5d7445195b09ba61f97374370f85
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 16:20:34 2021 -0700

    s3: smbd: In unix_convert_step_search_fail() ensure posix names don't call into name mangling functions.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit d650d9ad8aef9d39ed8eb960ec6d5fe409c3f6b3
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 15:03:16 2021 -0700

    s3: smbd: Add comment to unix_convert() explaining why posix never calls into mangle_is_mangled() here.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 77f54fc14f2dcf9da6a68dd8880f0d31ac33c860
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 13:32:27 2021 -0700

    s3: smbd: Turn on case sensitivity for a posix filename lookup.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit f4354571d615c5b6ea64ed20cb880049c1b49053
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 12:08:25 2021 -0700

    s3: smbd: Use state->short_case_preserve instead of state->conn->short_case_preserve.
    
    No logic changes.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 598c07b106edf47febc2319f923931542fa1c519
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 12:07:05 2021 -0700

    s3: smbd: Use state->case_preserve instead of state->conn->case_preserve.
    
    No logic change.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 2910657694ed6843702b1f901674e0568e64846e
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 12:02:33 2021 -0700

    s3: smbd: Use state->case_sensitive instead of state->conn->case_sensitive.
    
    No logic change.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 35ee8a7b6c7e68a6a48e2ecafae78d9f6f901040
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 11:59:56 2021 -0700

    s3: smbd: Add case_sensitive, case_preserve, short_case_preserve to state struct.
    
    Not yet used.
    
    This allows them to be independent of conn settings on
    a handle-basis for posix.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit b460c534272271b3f6c673ef544b7a5549ad11bb
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 11:54:38 2021 -0700

    s3: smbd: Ensure normalize_filename_case() doesn't modify posix names.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 86e42fb484147ed687086cf3fcf8cd8eb07b7164
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Sep 17 17:02:06 2021 -0700

    s3: smbd: Add ucf_flags parameter to normalize_filename_case().
    
    Not yet used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 3f0935b369e79d67f7a42b9531b2c123f2410ccc
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 15 14:04:07 2021 -0700

    s3: smbd: get_real_filename() is actually static to filename.c
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

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

Summary of changes:
 source3/smbd/dir.c                  | 19 +++++++--
 source3/smbd/filename.c             | 79 +++++++++++++++++++++++++++++--------
 source3/smbd/open.c                 |  7 ++--
 source3/smbd/proto.h                |  6 +--
 source3/smbd/reply.c                | 34 ++++++++++++----
 source3/smbd/smb2_query_directory.c |  3 +-
 source3/smbd/trans2.c               | 19 +++++----
 7 files changed, 123 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 856a3625a75..3bf2f79f3fa 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -59,6 +59,7 @@ struct smb_Dir {
 	struct name_cache_entry *name_cache;
 	unsigned int name_cache_index;
 	unsigned int file_number;
+	bool case_sensitive;
 	files_struct *fsp; /* Back pointer to containing fsp, only
 			      set from OpenDir_fsp(). */
 };
@@ -396,6 +397,11 @@ void dptr_set_priv(struct dptr_struct *dptr)
 	dptr->priv = true;
 }
 
+bool dptr_case_sensitive(struct dptr_struct *dptr)
+{
+	return dptr->dir_hnd->case_sensitive;
+}
+
 /****************************************************************************
  Return the next visible file name, skipping veto'd and invisible files.
 ****************************************************************************/
@@ -476,7 +482,7 @@ static char *dptr_ReadDirName(TALLOC_CTX *ctx,
 	 * providing case sensitive semantics or the underlying
 	 * filesystem is case sensitive.
 	 */
-	if (dptr->conn->case_sensitive ||
+	if (dptr->dir_hnd->case_sensitive ||
 	    !(dptr->conn->fs_capabilities & FILE_CASE_SENSITIVE_SEARCH))
 	{
 		goto clean;
@@ -1549,6 +1555,11 @@ static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
 		goto fail;
 	}
 	dir_hnd->fsp = fsp;
+	if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+		dir_hnd->case_sensitive = true;
+	} else {
+		dir_hnd->case_sensitive = conn->case_sensitive;
+	}
 
 	talloc_set_destructor(dir_hnd, smb_Dir_destructor);
 
@@ -1715,7 +1726,7 @@ static bool SearchDir(struct smb_Dir *dir_hnd, const char *name, long *poffset)
 	if (dir_hnd->name_cache_size && dir_hnd->name_cache) {
 		for (i = dir_hnd->name_cache_index; i >= 0; i--) {
 			struct name_cache_entry *e = &dir_hnd->name_cache[i];
-			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+			if (e->name && (dir_hnd->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
 				*poffset = e->offset;
 				SeekDir(dir_hnd, e->offset);
 				return True;
@@ -1724,7 +1735,7 @@ static bool SearchDir(struct smb_Dir *dir_hnd, const char *name, long *poffset)
 		for (i = dir_hnd->name_cache_size - 1;
 				i > dir_hnd->name_cache_index; i--) {
 			struct name_cache_entry *e = &dir_hnd->name_cache[i];
-			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+			if (e->name && (dir_hnd->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
 				*poffset = e->offset;
 				SeekDir(dir_hnd, e->offset);
 				return True;
@@ -1737,7 +1748,7 @@ static bool SearchDir(struct smb_Dir *dir_hnd, const char *name, long *poffset)
 	dir_hnd->file_number = 0;
 	*poffset = START_OF_DIRECTORY_OFFSET;
 	while ((entry = ReadDirName(dir_hnd, poffset, NULL, &talloced))) {
-		if (conn->case_sensitive ? (strcmp(entry, name) == 0) : strequal(entry, name)) {
+		if (dir_hnd->case_sensitive ? (strcmp(entry, name) == 0) : strequal(entry, name)) {
 			TALLOC_FREE(talloced);
 			return True;
 		}
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index eec7877b38b..6ea0687d763 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -30,6 +30,12 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 
+static int get_real_filename(connection_struct *conn,
+			     struct smb_filename *path,
+			     const char *name,
+			     TALLOC_CTX *mem_ctx,
+			     char **found_name);
+
 uint32_t ucf_flags_from_smb_request(struct smb_request *req)
 {
 	uint32_t ucf_flags = 0;
@@ -458,10 +464,18 @@ NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname,
  * Performs an in-place case conversion guaranteed to stay the same size.
  */
 
-static NTSTATUS normalize_filename_case(connection_struct *conn, char *filename)
+static NTSTATUS normalize_filename_case(connection_struct *conn,
+					char *filename,
+					uint32_t ucf_flags)
 {
 	bool ok;
 
+	if (ucf_flags & UCF_POSIX_PATHNAMES) {
+		/*
+		 * POSIX never normalizes filename case.
+		 */
+		return NT_STATUS_OK;
+	}
 	if (!conn->case_sensitive) {
 		return NT_STATUS_OK;
 	}
@@ -526,6 +540,9 @@ struct uc_state {
 	bool posix_pathnames;
 	bool allow_wcard_last_component;
 	bool done;
+	bool case_sensitive;
+	bool case_preserve;
+	bool short_case_preserve;
 };
 
 static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
@@ -602,6 +619,13 @@ static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
 		return map_nt_error_from_unix(errno);
 	}
 
+	/*
+	 * POSIX pathnames must never call into mangling.
+	 */
+	if (state->posix_pathnames) {
+		goto done;
+	}
+
 	/*
 	 * Just the last part of the name doesn't exist.
 	 * We need to strupper() or strlower() it as
@@ -609,10 +633,10 @@ static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
 	 * purposes. Fix inspired by
 	 * Thomas Neumann <t.neumann at iku-ag.de>.
 	 */
-	if (!state->conn->case_preserve ||
+	if (!state->case_preserve ||
 	    (mangle_is_8_3(state->name, false,
 			   state->conn->params) &&
-	     !state->conn->short_case_preserve)) {
+	     !state->short_case_preserve)) {
 		if (!strnorm(state->name,
 			     lp_default_case(SNUM(state->conn)))) {
 			DBG_DEBUG("strnorm %s failed\n",
@@ -655,6 +679,8 @@ static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
 		state->end = state->name + strlen(state->name);
 	}
 
+  done:
+
 	DBG_DEBUG("New file [%s]\n", state->name);
 	state->done = true;
 	return NT_STATUS_OK;
@@ -931,7 +957,7 @@ static NTSTATUS unix_convert_step(struct uc_state *state)
 		stat_cache_add(state->orig_path,
 			       state->dirpath,
 			       state->smb_fname->twrp,
-			       state->conn->case_sensitive);
+			       state->case_sensitive);
 	}
 
 	/*
@@ -963,10 +989,20 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 		.ucf_flags = ucf_flags,
 		.posix_pathnames = (ucf_flags & UCF_POSIX_PATHNAMES),
 		.allow_wcard_last_component = (ucf_flags & UCF_ALWAYS_ALLOW_WCARD_LCOMP),
+		.case_sensitive = conn->case_sensitive,
+		.case_preserve = conn->case_preserve,
+		.short_case_preserve = conn->short_case_preserve,
 	};
 
 	*smb_fname_out = NULL;
 
+	if (state->posix_pathnames) {
+		/* POSIX means ignore case settings on share. */
+		state->case_sensitive = true;
+		state->case_preserve = true;
+		state->short_case_preserve = true;
+	}
+
 	state->smb_fname = talloc_zero(state->mem_ctx, struct smb_filename);
 	if (state->smb_fname == NULL) {
 		return NT_STATUS_NO_MEMORY;
@@ -1053,7 +1089,9 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 	 * the man page. Thanks to jht at samba.org for finding this. JRA.
 	 */
 
-	status = normalize_filename_case(state->conn, state->smb_fname->base_name);
+	status = normalize_filename_case(state->conn,
+					 state->smb_fname->base_name,
+					 ucf_flags);
 	if (!NT_STATUS_IS_OK(status)) {
 		DBG_ERR("normalize_filename_case %s failed\n",
 				state->smb_fname->base_name);
@@ -1123,7 +1161,7 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 	 * added and verified in build_stream_path().
 	 */
 
-	if (!state->conn->case_sensitive ||
+	if (!state->case_sensitive ||
 	    !(state->conn->fs_capabilities & FILE_CASE_SENSITIVE_SEARCH))
 	{
 		bool found;
@@ -1191,7 +1229,7 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 			stat_cache_add(state->orig_path,
 				       state->smb_fname->base_name,
 				       state->smb_fname->twrp,
-				       state->conn->case_sensitive);
+				       state->case_sensitive);
 			DBG_DEBUG("Conversion of base_name finished "
 				  "[%s] -> [%s]\n",
 				  state->orig_path, state->smb_fname->base_name);
@@ -1231,9 +1269,12 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 		 * A special case - if we don't have any wildcards or mangling chars and are case
 		 * sensitive or the underlying filesystem is case insensitive then searching
 		 * won't help.
+		 *
+		 * NB. As POSIX sets state->case_sensitive as
+		 * true we will never call into mangle_is_mangled() here.
 		 */
 
-		if ((state->conn->case_sensitive || !(state->conn->fs_capabilities &
+		if ((state->case_sensitive || !(state->conn->fs_capabilities &
 					FILE_CASE_SENSITIVE_SEARCH)) &&
 				!mangle_is_mangled(state->smb_fname->base_name, state->conn->params)) {
 
@@ -1315,7 +1356,13 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 	 * just a component. JRA.
 	 */
 
-	if (mangle_is_mangled(state->name, state->conn->params)) {
+	if (state->posix_pathnames) {
+		/*
+		 * POSIX names are never mangled and we must not
+		 * call into mangling functions.
+		 */
+		state->component_was_mangled = false;
+	} else if (mangle_is_mangled(state->name, state->conn->params)) {
 		state->component_was_mangled = true;
 	}
 
@@ -1351,7 +1398,7 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 		stat_cache_add(state->orig_path,
 			       state->smb_fname->base_name,
 			       state->smb_fname->twrp,
-			       state->conn->case_sensitive);
+			       state->case_sensitive);
 	}
 
 	/*
@@ -1685,11 +1732,11 @@ int get_real_filename_full_scan(connection_struct *conn,
  fallback.
 ****************************************************************************/
 
-int get_real_filename(connection_struct *conn,
-		      struct smb_filename *path,
-		      const char *name,
-		      TALLOC_CTX *mem_ctx,
-		      char **found_name)
+static int get_real_filename(connection_struct *conn,
+			     struct smb_filename *path,
+			     const char *name,
+			     TALLOC_CTX *mem_ctx,
+			     char **found_name)
 {
 	int ret;
 	bool mangled;
@@ -1907,7 +1954,7 @@ char *get_original_lcomp(TALLOC_CTX *ctx,
 	if (orig_lcomp == NULL) {
 		return NULL;
 	}
-	status = normalize_filename_case(conn, orig_lcomp);
+	status = normalize_filename_case(conn, orig_lcomp, ucf_flags);
 	if (!NT_STATUS_IS_OK(status)) {
 		TALLOC_FREE(orig_lcomp);
 		return NULL;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index df24f8d1b0e..7f1aedbd1fb 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -1283,6 +1283,7 @@ static NTSTATUS open_file(files_struct *fsp,
 	bool creating = !file_existed && (flags & O_CREAT);
 	bool truncating = (flags & O_TRUNC);
 	bool open_fd = false;
+	bool posix_open = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
 
 	/*
 	 * Catch early an attempt to open an existing
@@ -1531,7 +1532,7 @@ static NTSTATUS open_file(files_struct *fsp,
 		}
 
 		if (S_ISLNK(smb_fname->st.st_ex_mode) &&
-		    !(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN))
+		    !posix_open)
 		{
 			/*
 			 * Don't allow stat opens on symlinks directly unless
@@ -1573,7 +1574,7 @@ static NTSTATUS open_file(files_struct *fsp,
 						      access_mask);
 
 		if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
-				(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
+				posix_open &&
 				S_ISLNK(smb_fname->st.st_ex_mode)) {
 			/* This is a POSIX stat open for delete
 			 * or rename on a symlink that points
@@ -1607,7 +1608,7 @@ static NTSTATUS open_file(files_struct *fsp,
 	fsp->fsp_flags.is_directory = false;
 	if (conn->aio_write_behind_list &&
 	    is_in_path(smb_fname->base_name, conn->aio_write_behind_list,
-		       conn->case_sensitive)) {
+		       posix_open ? true: conn->case_sensitive)) {
 		fsp->fsp_flags.aio_write_behind = true;
 	}
 
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index bf7401f5191..ea86515a925 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -208,6 +208,7 @@ bool dptr_has_wild(struct dptr_struct *dptr);
 int dptr_dnum(struct dptr_struct *dptr);
 bool dptr_get_priv(struct dptr_struct *dptr);
 void dptr_set_priv(struct dptr_struct *dptr);
+bool dptr_case_sensitive(struct dptr_struct *dptr);
 bool dptr_SearchDir(struct dptr_struct *dptr, const char *name, long *poffset, SMB_STRUCT_STAT *pst);
 bool dptr_fill(struct smbd_server_connection *sconn,
 	       char *buf1,unsigned int key);
@@ -363,11 +364,6 @@ NTSTATUS check_name(connection_struct *conn,
 NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname,
 				    uint32_t ucf_flags,
 				    NTTIME twrp);
-int get_real_filename(connection_struct *conn,
-		      struct smb_filename *path,
-		      const char *name,
-		      TALLOC_CTX *mem_ctx,
-		      char **found_name);
 int get_real_filename_full_scan(connection_struct *conn,
 				const char *path,
 				const char *name,
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 6e576552fcd..b0101f667a8 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -3289,6 +3289,7 @@ NTSTATUS unlink_internals(connection_struct *conn,
 	struct smb_filename *smb_fname_dir = NULL;
 	TALLOC_CTX *ctx = talloc_tos();
 	int ret;
+	bool posix_pathname = (smb_fname->flags & SMB_FILENAME_POSIX_PATH);
 
 	/* Split up the directory from the filename/mask. */
 	status = split_fname_dir_mask(ctx, smb_fname->base_name,
@@ -3307,6 +3308,7 @@ NTSTATUS unlink_internals(connection_struct *conn,
 	 */
 
 	if (!VALID_STAT(smb_fname->st) &&
+	    !posix_pathname &&
 	    mangle_is_mangled(fname_mask, conn->params)) {
 		char *new_mask = NULL;
 		mangle_lookup_name_from_8_3(ctx, fname_mask,
@@ -3359,6 +3361,9 @@ NTSTATUS unlink_internals(connection_struct *conn,
 		long offset = 0;
 		const char *dname = NULL;
 		char *talloced = NULL;
+		bool case_sensitive =
+			(smb_fname->flags & SMB_FILENAME_POSIX_PATH) ?
+			true : conn->case_sensitive;
 
 		if ((dirtype & SAMBA_ATTRIBUTES_MASK) == FILE_ATTRIBUTE_DIRECTORY) {
 			status = NT_STATUS_OBJECT_NAME_INVALID;
@@ -3427,7 +3432,7 @@ NTSTATUS unlink_internals(connection_struct *conn,
 			}
 
 			if(!mask_match(dname, fname_mask,
-				       conn->case_sensitive)) {
+				       case_sensitive)) {
 				TALLOC_FREE(frame);
 				TALLOC_FREE(talloced);
 				continue;
@@ -7579,6 +7584,10 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
 	uint32_t access_mask = SEC_DIR_ADD_FILE;
 	bool dst_exists, old_is_stream, new_is_stream;
 	int ret;
+	bool case_sensitive = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+				true : conn->case_sensitive;
+	bool case_preserve = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+				true : conn->case_preserve;
 
 	status = check_name(conn, smb_fname_dst_in);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -7609,7 +7618,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
 	 * the rename (user is trying to change the case of the
 	 * filename).
 	 */
-	if (!conn->case_sensitive && conn->case_preserve &&
+	if (!case_sensitive && case_preserve &&
 	    strequal(fsp->fsp_name->base_name, smb_fname_dst->base_name) &&
 	    strequal(fsp->fsp_name->stream_name, smb_fname_dst->stream_name)) {
 		char *fname_dst_parent = NULL;
@@ -8033,6 +8042,11 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 	int rc;
 	bool src_has_wild = false;
 	bool dest_has_wild = false;
+	bool posix_pathname = (smb_fname_src->flags & SMB_FILENAME_POSIX_PATH);
+	bool case_sensitive = posix_pathname ? true : conn->case_sensitive;
+	bool case_preserve = posix_pathname ? true : conn->case_preserve;
+	bool short_case_preserve = posix_pathname ? true :
+					conn->short_case_preserve;
 
 	/*
 	 * Split the old name into directory and last component
@@ -8075,6 +8089,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 	 */
 
 	if (!VALID_STAT(smb_fname_src->st) &&
+	    !posix_pathname &&
 	    mangle_is_mangled(fname_src_mask, conn->params)) {
 		char *new_mask = NULL;
 		mangle_lookup_name_from_8_3(ctx, fname_src_mask, &new_mask,
@@ -8085,7 +8100,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 		}
 	}
 
-	if (smb_fname_src->flags & SMB_FILENAME_POSIX_PATH) {
+	if (posix_pathname) {
 		status = make_smb2_posix_create_ctx(talloc_tos(), &posx, 0777);
 		if (!NT_STATUS_IS_OK(status)) {
 			DBG_WARNING("make_smb2_posix_create_ctx failed: %s\n",
@@ -8122,8 +8137,8 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 			  "case_preserve = %d, short case preserve = %d, "
 			  "directory = %s, newname = %s, "
 			  "last_component_dest = %s\n",
-			  conn->case_sensitive, conn->case_preserve,
-			  conn->short_case_preserve,
+			  case_sensitive, case_preserve,
+			  short_case_preserve,
 			  smb_fname_str_dbg(smb_fname_src),
 			  smb_fname_str_dbg(smb_fname_dst),
 			  dst_original_lcomp));
@@ -8276,7 +8291,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 			}
 		}
 
-		if(!mask_match(dname, fname_src_mask, conn->case_sensitive)) {
+		if(!mask_match(dname, fname_src_mask, case_sensitive)) {
 			TALLOC_FREE(talloced);
 			continue;
 		}
@@ -8793,6 +8808,7 @@ void reply_copy(struct smb_request *req)
 		ucf_flags_from_smb_request(req);
 	uint32_t ucf_flags_dst = UCF_ALWAYS_ALLOW_WCARD_LCOMP |
 		ucf_flags_from_smb_request(req);
+	bool posix_pathnames = req->posix_pathnames;
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBcopy);
@@ -8886,7 +8902,7 @@ void reply_copy(struct smb_request *req)
 		goto out;
 	}
 
-	if (!req->posix_pathnames) {
+	if (!posix_pathnames) {
 		char *orig_src_lcomp = NULL;
 		char *orig_dst_lcomp = NULL;
 		/*
@@ -8927,6 +8943,7 @@ void reply_copy(struct smb_request *req)
 	 * Tine Smukavec <valentin.smukavec at hermes.si>.
 	 */
 	if (!VALID_STAT(smb_fname_src->st) &&
+	    !posix_pathnames &&
 	    mangle_is_mangled(fname_src_mask, conn->params)) {
 		char *new_mask = NULL;
 		mangle_lookup_name_from_8_3(ctx, fname_src_mask,
@@ -9069,7 +9086,8 @@ void reply_copy(struct smb_request *req)
 			}
 
 			if(!mask_match(dname, fname_src_mask,
-				       conn->case_sensitive)) {
+				       posix_pathnames ?
+					true : conn->case_sensitive)) {
 				TALLOC_FREE(talloced);
 				continue;
 			}
diff --git a/source3/smbd/smb2_query_directory.c b/source3/smbd/smb2_query_directory.c
index 1eb2b395d4c..794041df7e8 100644
--- a/source3/smbd/smb2_query_directory.c
+++ b/source3/smbd/smb2_query_directory.c
@@ -272,6 +272,7 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
 	char *p;
 	bool stop = false;
 	bool ok;
+	bool posix_dir_handle = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct smbd_smb2_query_directory_state);
@@ -467,7 +468,7 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
 		 fsp->fsp_name->base_name, lp_dont_descend(talloc_tos(), lp_sub, SNUM(conn)),
 		(unsigned int)in_output_buffer_length ));
 	if (in_list(fsp->fsp_name->base_name,lp_dont_descend(talloc_tos(), lp_sub, SNUM(conn)),


-- 
Samba Shared Repository



More information about the samba-cvs mailing list