[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Sat Dec 10 00:08:02 UTC 2022


The branch, master has been updated
       via  4bb3e4df3e4 torture: test that a find with a mangled name works
       via  08997ac1a71 torture: convert mangling test to a suite
       via  0fa7c3f70c7 torture: add an interactive test that works out maximum name and path lenghts
       via  3ece2cb807a smbd: remove oplock paranoia check from file_find_dif()
       via  6e1f58ab7c6 torture: add a test veryfing timestamps across rename
       via  8d58174cdde lib/torture: fix tctx arg usage in torture_assert_nttime_equal() macro
       via  6c997c7fb5b torture: add another large directory enumeration performance test
       via  cac95c3bba9 torture: print duration of smb2.dir.test_large_files
       via  c0be0b68730 torture: increase find buffer to 1 MB in multiple_smb2_search()
       via  9e1c2fedb84 torture: add another simple DOS attributes test
       via  fba4b290856 s4:torture: remove remaining checks if alloc_size is 0 on empty files
       via  043ce404cae vfs_zfsacl: fix mixed declaration and code error
       via  09a844c69eb vfs_zfsacl: remove unused function
       via  8a2c763d264 lib/cmdline/tests: add missing includes
       via  8ccbbbd4ba4 s3:locking: split out del_share_mode_open_id()
       via  6cc866b5901 smbd: introduce 'delete_on_close' helper variables
       via  0db39fad9e7 g_lock: check for zero timeout in g_lock_lock()
       via  aa8b0ef8b93 smbd: debug in smbd_smb2_close_send()
       via  19a017496d6 s3/locking: Revert "s3:locking: Remove dead code"
       via  a9c6a329a25 s3:locking: re-add saved_errno handling to fd_close_posix()
       via  46ac8daa797 smbd: use fsp_getinfo_ask_sharemode() in open_file_ntcreate()
       via  f0e0fc17d3a smbd: use fsp_search_ask_sharemode() and fsp_getinfo_ask_sharemode()
       via  0226e0c31e6 smbd: add fsp_search_ask_sharemode() and fsp_getinfo_ask_sharemode()
       via  7f20625f982 smbd: use reference_smb_fname_fsp_link() in rename_internals_fsp()
       via  d1dd3f3d73f smbd: factor out reference_smb_fname_fsp_link() from parent_pathref()
       via  67042d95bb3 Fix memleak in _nss_winbind_initgroups_dyn
      from  70e8da42917 s3:libads: Fix debug message

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


- Log -----------------------------------------------------------------
commit 4bb3e4df3e44dc7935d3852c8f45b5e4652a4df3
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Dec 1 06:13:22 2022 +0100

    torture: test that a find with a mangled name works
    
    This was spawned by https://bugzilla.samba.org/show_bug.cgi?id=13472 back
    then. Samba implement this correctly, just add this test found in the attic.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Sat Dec 10 00:07:09 UTC 2022 on sn-devel-184

commit 08997ac1a711f4254603c7e5e90ee9309448f2a5
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Dec 1 06:09:09 2022 +0100

    torture: convert mangling test to a suite
    
    More tests to come...
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0fa7c3f70c70db1420cbb0971493fee328d70915
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Nov 29 18:30:35 2022 +0100

    torture: add an interactive test that works out maximum name and path lenghts
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 3ece2cb807a122b7684096f6fe5bcfa277a3844f
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Dec 1 21:38:32 2022 +0100

    smbd: remove oplock paranoia check from file_find_dif()
    
    Since 4.16 stat opens will have a real fd, the only case where currently the fd
    can still be -1 is a POSIX request on a symlink.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6e1f58ab7c68030a7cbc923cd22055636e233b42
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Nov 29 06:20:31 2022 +0100

    torture: add a test veryfing timestamps across rename
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8d58174cddeb2a5e62557ca23724b7acbb56e4c5
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Nov 29 12:07:19 2022 +0100

    lib/torture: fix tctx arg usage in torture_assert_nttime_equal() macro
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6c997c7fb5b114407566887a19e9b832d067b18b
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 17:05:26 2022 +0100

    torture: add another large directory enumeration performance test
    
    This one renames one file per iteration and can also be used to torture any
    directory caching the server may employ.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit cac95c3bba9f0fbd02f3e96691cd679e0cd2085e
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Nov 28 18:05:28 2022 +0100

    torture: print duration of smb2.dir.test_large_files
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c0be0b687301f5b613c917bc8f75248042fd32aa
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 17:03:37 2022 +0100

    torture: increase find buffer to 1 MB in multiple_smb2_search()
    
    This is used by performance tests that don't want to measure network latency but
    fileserver IO latency.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 9e1c2fedb8450703b4b18646d983a3c3f9df39e5
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 16:02:27 2022 +0100

    torture: add another simple DOS attributes test
    
    - create file with ARCHIVE
    - open file with ARCHIVE+HIDDEN+...
    - check DOS attrs are still only ARCHIVE from the initial create
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit fba4b290856faaf17305103efc65f6383ea4f61c
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 11:33:30 2022 +0100

    s4:torture: remove remaining checks if alloc_size is 0 on empty files
    
    commit 55b2f247f9ba56516efba52481418966a777343e already remove a few of these,
    but a few remained.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 043ce404caeb043b2d00e6842731e7c580d748fd
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jul 28 16:04:38 2022 +0200

    vfs_zfsacl: fix mixed declaration and code error
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 09a844c69ebf29b437199f43c1c5d81d5cacb2e4
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jul 28 16:04:26 2022 +0200

    vfs_zfsacl: remove unused function
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8a2c763d264c266eb00f31898b7bfa13916e97b4
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jul 28 16:04:09 2022 +0200

    lib/cmdline/tests: add missing includes
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8ccbbbd4ba4de405ce5bbf839e3aa0236aaf274b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Oct 11 17:42:18 2019 +0200

    s3:locking: split out del_share_mode_open_id()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6cc866b5901796aacb6fc6721e717058271daf32
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 06:26:52 2022 +0100

    smbd: introduce 'delete_on_close' helper variables
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0db39fad9e7a79145146d95a1eecfe1703abfdb9
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Mar 25 15:50:54 2022 +0100

    g_lock: check for zero timeout in g_lock_lock()
    
    If the record is already locked check if the requested timeout is zero
    and fail directly with NT_STATUS_LOCK_NOT_GRANTED.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit aa8b0ef8b93b9318b4182a6c52f4685c9bb7d8d8
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 25 06:02:31 2022 +0100

    smbd: debug in smbd_smb2_close_send()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 19a017496d65ba15d83ada8b9c98bf8d5f658e24
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Apr 7 11:10:15 2022 +0200

    s3/locking: Revert "s3:locking: Remove dead code"
    
    This reverts commit de493a3e3b5b8d54f62c45072e27f2fefd4af43a:
    
        s3:locking: Remove dead code
    
        Found by Coverity.
    
        Signed-off-by: Andreas Schneider <asn at samba.org>
        Reviewed-by: Isaac Boukris <iboukris at samba.org>
    
    dbwrap_do_locked() correctly returns saved_errno which is a possible
    errno returned by close() inside fd_close_posix_fn().
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a9c6a329a255d678b62f617649ffcb436e532d01
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Oct 11 17:57:29 2019 +0200

    s3:locking: re-add saved_errno handling to fd_close_posix()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 46ac8daa797748290cbc15c14774a5453f38befb
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 11 18:14:11 2022 +0200

    smbd: use fsp_getinfo_ask_sharemode() in open_file_ntcreate()
    
    Note: this is a behaviour change in the non-default case when the user
    has disabled "getinfo ask sharemode".
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f0e0fc17d3a455b7c5c5170b582d2d8ff53670bb
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 11 18:13:13 2022 +0200

    smbd: use fsp_search_ask_sharemode() and fsp_getinfo_ask_sharemode()
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0226e0c31e69aea03b7f73a648d02c9a4c28ec9d
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 11 18:09:10 2022 +0200

    smbd: add fsp_search_ask_sharemode() and fsp_getinfo_ask_sharemode()
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 7f20625f982cbb7f0ed05f4602dcedfa41278917
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Apr 8 11:54:01 2022 +0200

    smbd: use reference_smb_fname_fsp_link() in rename_internals_fsp()
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d1dd3f3d73fd283e4817ddc76d3687ed2e9933d0
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Apr 8 11:44:28 2022 +0200

    smbd: factor out reference_smb_fname_fsp_link() from parent_pathref()
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 67042d95bb39fe4b479fa952eec0ae1c1c82ebd6
Author: Sushmita Bhattacharya <sushmita.bhattacharya at oracle.com>
Date:   Fri Dec 9 10:55:53 2022 +0000

    Fix memleak in _nss_winbind_initgroups_dyn
    
    Free the response at the end of _nss_winbind_initgroups_dyn
    
    Signed-off-by: Sushmita Bhattacharya <sushmita.bhattacharya at oracle.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 lib/cmdline/tests/test_cmdline.c    |   2 +
 lib/torture/torture.h               |   2 +-
 nsswitch/winbind_nss_linux.c        |   1 +
 source3/lib/g_lock.c                |   4 +
 source3/locking/posix.c             |  20 +++-
 source3/locking/share_mode_lock.c   |  34 +++++--
 source3/locking/share_mode_lock.h   |   3 +
 source3/modules/vfs_zfsacl.c        |  38 +-------
 source3/smbd/files.c                | 101 ++++++++++++++------
 source3/smbd/open.c                 |   8 +-
 source3/smbd/proto.h                |   5 +
 source3/smbd/smb1_reply.c           |   8 +-
 source3/smbd/smb1_trans2.c          |  21 ++--
 source3/smbd/smb2_close.c           |  12 +++
 source3/smbd/smb2_getinfo.c         |   4 +-
 source3/smbd/smb2_query_directory.c |   2 +-
 source3/smbd/smb2_reply.c           |  12 +++
 source4/torture/raw/open.c          |   2 -
 source4/torture/smb2/attr.c         |  57 +++++++++++
 source4/torture/smb2/create.c       | 131 ++++++++++++++++++++++++-
 source4/torture/smb2/dir.c          | 185 +++++++++++++++++++++++++++++++++++-
 source4/torture/smb2/durable_open.c |   5 +-
 source4/torture/smb2/mangle.c       |  98 ++++++++++++++++++-
 source4/torture/smb2/multichannel.c |   1 -
 source4/torture/smb2/rename.c       | 137 ++++++++++++++++++++++++++
 source4/torture/smb2/smb2.c         |   3 +-
 source4/torture/smb2/timestamps.c   |   2 -
 27 files changed, 785 insertions(+), 113 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/cmdline/tests/test_cmdline.c b/lib/cmdline/tests/test_cmdline.c
index 5148243ccaa..16dd09c63fa 100644
--- a/lib/cmdline/tests/test_cmdline.c
+++ b/lib/cmdline/tests/test_cmdline.c
@@ -22,6 +22,8 @@
 #include <stdint.h>
 #include <setjmp.h>
 #include <cmocka.h>
+#include <time.h>
+#include <sys/time.h>
 
 #include "lib/cmdline/cmdline.h"
 
diff --git a/lib/torture/torture.h b/lib/torture/torture.h
index ea34c15e0e9..f6089684afd 100644
--- a/lib/torture/torture.h
+++ b/lib/torture/torture.h
@@ -685,7 +685,7 @@ static inline void torture_dump_data_str_cb(const char *buf, void *private_data)
 #define torture_assert_nttime_equal(torture_ctx,got,expected,cmt) \
 	do { NTTIME __got = got, __expected = expected; \
 	if (!nt_time_equal(&__got, &__expected)) { \
-		torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", nt_time_string(tctx, __got), nt_time_string(tctx, __expected), cmt); \
+		torture_result(torture_ctx, TORTURE_FAIL, __location__": "#got" was %s, expected %s: %s", nt_time_string(torture_ctx, __got), nt_time_string(torture_ctx, __expected), cmt); \
 		return false; \
 	}\
 	} while(0)
diff --git a/nsswitch/winbind_nss_linux.c b/nsswitch/winbind_nss_linux.c
index 1d647ca25e5..a19c86dcdcc 100644
--- a/nsswitch/winbind_nss_linux.c
+++ b/nsswitch/winbind_nss_linux.c
@@ -1165,6 +1165,7 @@ _nss_winbind_initgroups_dyn(const char *user, gid_t group, long int *start,
 	/* Back to your regularly scheduled programming */
 
  done:
+	winbindd_free_response(&response);
 #ifdef DEBUG_NSS
 	fprintf(stderr, "[%5d]: initgroups %s returns %s (%d)\n", getpid(),
 		user, nss_err_str(ret), ret);
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index 40687f47526..3c27a63d8d5 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -1292,6 +1292,10 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, TDB_DATA key,
 			return state.status;
 		}
 
+		if (timeval_is_zero(&timeout)) {
+			return NT_STATUS_LOCK_NOT_GRANTED;
+		}
+
 		/*
 		 * Fall back to the full g_lock_trylock logic,
 		 * g_lock_lock_simple_fn() called above only covers
diff --git a/source3/locking/posix.c b/source3/locking/posix.c
index 5aad427a218..ccc9d6276da 100644
--- a/source3/locking/posix.c
+++ b/source3/locking/posix.c
@@ -544,6 +544,7 @@ static void fd_close_posix_fn(
 	TDB_DATA data,
 	void *private_data)
 {
+	int *saved_errno = (int *)private_data;
 	size_t num_fds, i;
 
 	SMB_ASSERT((data.dsize % sizeof(int)) == 0);
@@ -551,8 +552,12 @@ static void fd_close_posix_fn(
 
 	for (i=0; i<num_fds; i++) {
 		int fd;
+		int ret;
 		memcpy(&fd, data.dptr, sizeof(int));
-		close(fd);
+		ret = close(fd);
+		if (ret == -1) {
+			*saved_errno = errno;
+		}
 		data.dptr += sizeof(int);
 	}
 	dbwrap_record_delete(rec);
@@ -566,6 +571,8 @@ static void fd_close_posix_fn(
 
 int fd_close_posix(const struct files_struct *fsp)
 {
+	int saved_errno = 0;
+	int ret;
 	NTSTATUS status;
 
 	if (!lp_locking(fsp->conn->params) ||
@@ -597,7 +604,7 @@ int fd_close_posix(const struct files_struct *fsp)
 		posix_pending_close_db,
 		fd_array_key_fsp(fsp),
 		fd_close_posix_fn,
-		NULL);
+		&saved_errno);
 	if (!NT_STATUS_IS_OK(status)) {
 		DBG_WARNING("dbwrap_do_locked failed: %s\n",
 			    nt_errstr(status));
@@ -610,7 +617,14 @@ int fd_close_posix(const struct files_struct *fsp)
 	 * Finally close the fd associated with this fsp.
 	 */
 
-	return close(fsp_get_pathref_fd(fsp));
+	ret = close(fsp_get_pathref_fd(fsp));
+
+	if (ret == 0 && saved_errno != 0) {
+		errno = saved_errno;
+		ret = -1;
+	}
+
+	return ret;
 }
 
 /****************************************************************************
diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c
index a30ab3921ee..909bfdfbcce 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -2495,7 +2495,9 @@ static void del_share_mode_fn(
 	state->ok = true;
 }
 
-bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
+bool del_share_mode_open_id(struct share_mode_lock *lck,
+			    struct server_id open_pid,
+			    uint64_t open_file_id)
 {
 	struct del_share_mode_state state = { .ok = false };
 	struct share_mode_data *d = NULL;
@@ -2504,21 +2506,14 @@ bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
 
 	status = share_mode_lock_access_private_data(lck, &d);
 	if (!NT_STATUS_IS_OK(status)) {
-		struct file_id id = share_mode_lock_file_id(lck);
-		struct file_id_buf id_buf;
 		/* Any error recovery possible here ? */
-		DBG_ERR("share_mode_lock_access_private_data() failed for "
-			"%s %s - %s\n",
-			file_id_str_buf(id, &id_buf),
-			fsp_str_dbg(fsp),
-			nt_errstr(status));
 		return false;
 	}
 
 	ok = share_mode_entry_do(
 		d,
-		messaging_server_id(fsp->conn->sconn->msg_ctx),
-		fh_get_gen_id(fsp->fh),
+		open_pid,
+		open_file_id,
 		del_share_mode_fn,
 		&state);
 	if (!ok) {
@@ -2532,6 +2527,25 @@ bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
 	return true;
 }
 
+bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
+{
+	struct server_id pid =
+		messaging_server_id(fsp->conn->sconn->msg_ctx);
+	bool ok;
+
+	ok = del_share_mode_open_id(lck, pid, fh_get_gen_id(fsp->fh));
+	if (!ok) {
+		struct file_id id = share_mode_lock_file_id(lck);
+		struct file_id_buf id_buf;
+		DBG_ERR("share_mode_lock_access_private_data() failed for "
+			"%s %s\n",
+			file_id_str_buf(id, &id_buf),
+			fsp_str_dbg(fsp));
+		return false;
+	}
+	return true;
+}
+
 struct remove_share_oplock_state {
 	bool ok;
 };
diff --git a/source3/locking/share_mode_lock.h b/source3/locking/share_mode_lock.h
index 0ce539229b5..eb74144a77d 100644
--- a/source3/locking/share_mode_lock.h
+++ b/source3/locking/share_mode_lock.h
@@ -37,6 +37,9 @@ struct file_id share_mode_lock_file_id(const struct share_mode_lock *lck);
 struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
 						     struct file_id id);
 
+bool del_share_mode_open_id(struct share_mode_lock *lck,
+			    struct server_id open_pid,
+			    uint64_t open_file_id);
 bool del_share_mode(struct share_mode_lock *lck,
 		    struct files_struct *fsp);
 bool downgrade_share_oplock(struct share_mode_lock *lck,
diff --git a/source3/modules/vfs_zfsacl.c b/source3/modules/vfs_zfsacl.c
index 69a1db59249..d69d7003110 100644
--- a/source3/modules/vfs_zfsacl.c
+++ b/source3/modules/vfs_zfsacl.c
@@ -278,41 +278,6 @@ static NTSTATUS zfs_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
 				zfs_process_smbacl);
 }
 
-static int get_zfsacl(TALLOC_CTX *mem_ctx,
-		      const struct smb_filename *smb_fname,
-		      ace_t **outbuf)
-{
-	int naces, rv;
-	ace_t *acebuf = NULL;
-
-	naces = acl(smb_fname->base_name, ACE_GETACLCNT, 0, NULL);
-	if (naces == -1) {
-		int dbg_level = 10;
-
-		if (errno == ENOSYS) {
-			dbg_level = 1;
-		}
-		DEBUG(dbg_level, ("acl(ACE_GETACLCNT, %s): %s ",
-				  smb_fname->base_name, strerror(errno)));
-		return naces;
-	}
-	acebuf = talloc_size(mem_ctx, sizeof(ace_t)*naces);
-	if (acebuf == NULL) {
-		errno = ENOMEM;
-		return -1;
-	}
-
-	rv = acl(smb_fname->base_name, ACE_GETACL, naces, acebuf);
-	if (rv == -1) {
-		DBG_DEBUG("acl(ACE_GETACL, %s) failed: %s ",
-			  smb_fname->base_name, strerror(errno));
-		return -1;
-	}
-
-	*outbuf = acebuf;
-	return naces;
-}
-
 static int fget_zfsacl(TALLOC_CTX *mem_ctx,
 		       struct files_struct *fsp,
 		       ace_t **outbuf)
@@ -361,6 +326,7 @@ static NTSTATUS zfsacl_fget_nt_acl(struct vfs_handle_struct *handle,
 				   TALLOC_CTX *mem_ctx,
 				   struct security_descriptor **ppdesc)
 {
+	TALLOC_CTX *frame = NULL;
 	struct SMB4ACL_T *pacl;
 	NTSTATUS status;
 	struct zfsacl_config_data *config = NULL;
@@ -371,7 +337,7 @@ static NTSTATUS zfsacl_fget_nt_acl(struct vfs_handle_struct *handle,
 				struct zfsacl_config_data,
 				return NT_STATUS_INTERNAL_ERROR);
 
-	TALLOC_CTX *frame = talloc_stackframe();
+	frame = talloc_stackframe();
 
 	naces = fget_zfsacl(talloc_tos(), fsp, &acebuf);
 	if (naces == -1) {
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 1b486757506..ea1c31f4e85 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -1172,6 +1172,39 @@ NTSTATUS move_smb_fname_fsp_link(struct smb_filename *smb_fname_dst,
 	return NT_STATUS_OK;
 }
 
+static int fsp_ref_no_close_destructor(struct smb_filename *smb_fname)
+{
+	destroy_fsp_smb_fname_link(&smb_fname->fsp_link);
+	return 0;
+}
+
+NTSTATUS reference_smb_fname_fsp_link(struct smb_filename *smb_fname_dst,
+				      const struct smb_filename *smb_fname_src)
+{
+	NTSTATUS status;
+
+	/*
+	 * The target should always not be linked yet!
+	 */
+	SMB_ASSERT(smb_fname_dst->fsp == NULL);
+	SMB_ASSERT(smb_fname_dst->fsp_link == NULL);
+
+	if (smb_fname_src->fsp == NULL) {
+		return NT_STATUS_OK;
+	}
+
+	status = fsp_smb_fname_link(smb_fname_src->fsp,
+				    &smb_fname_dst->fsp_link,
+				    &smb_fname_dst->fsp);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	talloc_set_destructor(smb_fname_dst, fsp_ref_no_close_destructor);
+
+	return NT_STATUS_OK;
+}
+
 /**
  * Create an smb_fname and open smb_fname->fsp pathref
  **/
@@ -1209,12 +1242,6 @@ NTSTATUS synthetic_pathref(TALLOC_CTX *mem_ctx,
 	return NT_STATUS_OK;
 }
 
-static int atname_destructor(struct smb_filename *smb_fname)
-{
-	destroy_fsp_smb_fname_link(&smb_fname->fsp_link);
-	return 0;
-}
-
 /**
  * Turn a path into a parent pathref and atname
  *
@@ -1258,16 +1285,12 @@ NTSTATUS parent_pathref(TALLOC_CTX *mem_ctx,
 		return status;
 	}
 
-	if (smb_fname->fsp != NULL) {
-		status = fsp_smb_fname_link(smb_fname->fsp,
-					    &atname->fsp_link,
-					    &atname->fsp);
-		if (!NT_STATUS_IS_OK(status)) {
-			TALLOC_FREE(parent);
-			return status;
-		}
-		talloc_set_destructor(atname, atname_destructor);
+	status = reference_smb_fname_fsp_link(atname, smb_fname);
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(parent);
+		return status;
 	}
+
 	*_parent = parent;
 	*_atname = atname;
 	return NT_STATUS_OK;
@@ -1541,22 +1564,6 @@ files_struct *file_find_dif(struct smbd_server_connection *sconn,
 		if (count > 10) {
 			DLIST_PROMOTE(sconn->files, fsp);
 		}
-		/* Paranoia check. */
-		if ((fsp_get_pathref_fd(fsp) == -1) &&
-		    (fsp->oplock_type != NO_OPLOCK &&
-		     fsp->oplock_type != LEASE_OPLOCK))
-		{
-			struct file_id_buf idbuf;
-
-			DBG_ERR("file %s file_id = "
-				"%s, gen = %u oplock_type = %u is a "
-				"stat open with oplock type !\n",
-				fsp_str_dbg(fsp),
-				file_id_str_buf(fsp->file_id, &idbuf),
-				(unsigned int)fh_get_gen_id(fsp->fh),
-				(unsigned int)fsp->oplock_type);
-			smb_panic("file_find_dif");
-		}
 		return fsp;
 	}
 
@@ -2135,3 +2142,35 @@ struct files_struct *metadata_fsp(struct files_struct *fsp)
 	}
 	return fsp;
 }
+
+static bool fsp_generic_ask_sharemode(struct files_struct *fsp)
+{
+	if (fsp == NULL) {
+		return false;
+	}
+
+	if (fsp->posix_flags & FSP_POSIX_FLAGS_PATHNAMES) {
+		/* Always use filesystem for UNIX mtime query. */
+		return false;
+	}
+
+	return true;
+}
+
+bool fsp_search_ask_sharemode(struct files_struct *fsp)
+{
+	if (!fsp_generic_ask_sharemode(fsp)) {
+		return false;
+	}
+
+	return lp_smbd_search_ask_sharemode(SNUM(fsp->conn));
+}
+
+bool fsp_getinfo_ask_sharemode(struct files_struct *fsp)
+{
+	if (!fsp_generic_ask_sharemode(fsp)) {
+		return false;
+	}
+
+	return lp_smbd_getinfo_ask_sharemode(SNUM(fsp->conn));
+}
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 5c26ea190ff..3ad6b205116 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -3348,6 +3348,7 @@ static NTSTATUS check_and_store_share_mode(
 	int oplock_type = NO_OPLOCK;
 	uint32_t granted_lease = 0;
 	const struct smb2_lease_key *lease_key = NULL;
+	bool delete_on_close;
 	bool ok;
 
 	/* Get the types we need to examine. */
@@ -3355,7 +3356,8 @@ static NTSTATUS check_and_store_share_mode(
 		smb_panic("validate_oplock_types failed");
 	}
 
-	if (has_delete_on_close(lck, fsp->name_hash)) {
+	delete_on_close = has_delete_on_close(lck, fsp->name_hash);
+	if (delete_on_close) {
 		return NT_STATUS_DELETE_PENDING;
 	}
 
@@ -4505,7 +4507,9 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 	/*
 	 * Deal with other opens having a modified write time.
 	 */
-	if (!is_omit_timespec(&lck_state.write_time)) {
+	if (fsp_getinfo_ask_sharemode(fsp) &&
+	    !is_omit_timespec(&lck_state.write_time))
+	{
 		update_stat_ex_mtime(&fsp->fsp_name->st, lck_state.write_time);
 	}
 
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 9335ae476f7..a9060aeafc1 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -424,6 +424,8 @@ size_t fsp_fullbasepath(struct files_struct *fsp, char *buf, size_t buflen);
 void fsp_set_base_fsp(struct files_struct *fsp, struct files_struct *base_fsp);
 bool fsp_is_alternate_stream(const struct files_struct *fsp);
 struct files_struct *metadata_fsp(struct files_struct *fsp);
+bool fsp_search_ask_sharemode(struct files_struct *fsp);
+bool fsp_getinfo_ask_sharemode(struct files_struct *fsp);
 
 NTSTATUS create_internal_fsp(connection_struct *conn,
 			     const struct smb_filename *smb_fname,
@@ -465,6 +467,9 @@ void smb_fname_fsp_unlink(struct smb_filename *smb_fname);
 NTSTATUS move_smb_fname_fsp_link(struct smb_filename *smb_fname_dst,
 				 struct smb_filename *smb_fname_src);
 
+NTSTATUS reference_smb_fname_fsp_link(struct smb_filename *smb_fname_dst,
+				      const struct smb_filename *smb_fname_src);
+
 NTSTATUS synthetic_pathref(TALLOC_CTX *mem_ctx,
 			   struct files_struct *dirfsp,
 			   const char *base_name,
diff --git a/source3/smbd/smb1_reply.c b/source3/smbd/smb1_reply.c
index 343b7ee2b49..d53f5902da4 100644
--- a/source3/smbd/smb1_reply.c
+++ b/source3/smbd/smb1_reply.c
@@ -659,7 +659,6 @@ void reply_getatr(struct smb_request *req)
 	const char *p;
 	NTSTATUS status;
 	TALLOC_CTX *ctx = talloc_tos();
-	bool ask_sharemode = lp_smbd_search_ask_sharemode(SNUM(conn));
 
 	START_PROFILE(SMBgetatr);
 
@@ -685,6 +684,8 @@ void reply_getatr(struct smb_request *req)
 		struct files_struct *dirfsp = NULL;
 		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
 		NTTIME twrp = 0;
+		bool ask_sharemode;
+
 		if (ucf_flags & UCF_GMT_PATHNAME) {
 			extract_snapshot_token(fname, &twrp);
 		}
@@ -716,6 +717,7 @@ void reply_getatr(struct smb_request *req)
 		mode = fdos_mode(smb_fname->fsp);
 		size = smb_fname->st.st_ex_size;
 
+		ask_sharemode = fsp_search_ask_sharemode(smb_fname->fsp);
 		if (ask_sharemode) {
 			struct timespec write_time_ts;
 			struct file_id fileid;
@@ -1029,7 +1031,6 @@ void reply_search(struct smb_request *req)
 	bool mask_contains_wcard = False;
 	bool allow_long_path_components = (req->flags2 & FLAGS2_LONG_PATH_COMPONENTS) ? True : False;
 	TALLOC_CTX *ctx = talloc_tos();
-	bool ask_sharemode = lp_smbd_search_ask_sharemode(SNUM(conn));
 	struct smbXsrv_connection *xconn = req->xconn;
 	struct smbd_server_connection *sconn = req->sconn;
 	files_struct *fsp = NULL;
@@ -1226,6 +1227,7 @@ void reply_search(struct smb_request *req)
 		unsigned int i;
 		size_t hdr_size = ((uint8_t *)smb_buf(req->outbuf) + 3 - req->outbuf);
 		size_t available_space = xconn->smb1.sessions.max_send - hdr_size;
+		bool ask_sharemode;
 
 		maxentries = MIN(maxentries, available_space/DIR_STRUCT_SIZE);
 
@@ -1235,6 +1237,8 @@ void reply_search(struct smb_request *req)
 			check_descend = True;
 		}
 
+		ask_sharemode = fsp_search_ask_sharemode(fsp);
+


-- 
Samba Shared Repository



More information about the samba-cvs mailing list