[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Sun Nov 5 19:36:01 UTC 2023


The branch, master has been updated
       via  273d48504e1 CI: smb3unix.py: check more attributes of test files (and dirs) in test_posix_perm_files()
       via  ab2d619f205 smbtorture3: also check test file and it's attributes in two POSIX tests
       via  95abd2f59fa smbd: allow setting ARCHIVE bit in POSIX context with "store dos attributes"
       via  cd858a2a239 smbtorture3: prepare POSIX tests for differentianting between client flavour in the list callback
       via  cad82600ef6 smbtorture3: remove unused initializers
       via  ddc9cb779f5 smbd: s/FILE_ATTRIBUTES_INVALID/FILE_ATTRIBUTE_INVALID/g
       via  4c91f8ac2a9 smbtorture3: reduce indentation in posix_ls_fn()
       via  ec143274c79 smbd: allow POSIX opens for file_set_dosmode() in rename_internals_fsp()
       via  17bb46abfe6 smbd: allow POSIX opens for file_set_dosmode() in mkdir_internal()
       via  f5604640e90 smbd: allow POSIX opens for file_set_dosmode() in mark_file_modified()
       via  4d1b4d893d2 smbd: move POSIX check from possibly_set_archive() to file_set_dosmode()
       via  b3c6c677a70 smbd: in file_set_dosmode() do an early exit if smb_fname->fsp is NULL
       via  7c7786a121c smbd: ignore symlinks in file_set_dosmode()
       via  9b3c085409a smbd: add and use helper function possibly_set_archive()
       via  19434fe06d1 smbd: remove call to fdos_mode() when setting DOS attrs
      from  cfec96d5e9f third_party/heimdal: Import lorikeet-heimdal-202311030123 (commit 2346a67fe25cbf16128501665db41f6840546e15)

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


- Log -----------------------------------------------------------------
commit 273d48504e1da726af21cc5b0517c1761e51e6f9
Author: Ralph Boehme <slow at samba.org>
Date:   Sun Oct 29 18:08:22 2023 +0100

    CI: smb3unix.py: check more attributes of test files (and dirs) in test_posix_perm_files()
    
    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): Sun Nov  5 19:35:51 UTC 2023 on atb-devel-224

commit ab2d619f205f854eddaecb47b6858a49953b291d
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 3 11:09:47 2023 +0100

    smbtorture3: also check test file and it's attributes in two POSIX tests
    
    Verifies that the correct DOS attribute, FILE_ATTRIBUTE_ARCHIVE in this case,
    are returned over SMB1 with UNIX extensions.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 95abd2f59fa98159a7dee2ca18da849631781275
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:25:38 2023 +0100

    smbd: allow setting ARCHIVE bit in POSIX context with "store dos attributes"
    
    Cf https://lists.samba.org/archive/samba-technical/2023-October/138504.html
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit cd858a2a239a687b96c3b0e7633ccd7b8b8edb0e
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 10:11:50 2023 +0100

    smbtorture3: prepare POSIX tests for differentianting between client flavour in the list callback
    
    No change in behaviour.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit cad82600ef6ab4caa3ad8a7255b9f3db616decc3
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:28:28 2023 +0100

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

commit ddc9cb779f56476aaa1a85c4008c0b848dff4cf7
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 10:05:30 2023 +0100

    smbd: s/FILE_ATTRIBUTES_INVALID/FILE_ATTRIBUTE_INVALID/g
    
    No idea what got me into having an "S" in the define when I added it.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4c91f8ac2a9943f4b58090faf8cb3dcdb2a19e5a
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 06:05:25 2023 +0100

    smbtorture3: reduce indentation in posix_ls_fn()
    
    Prepares for adding more logic in a later commit.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ec143274c7992f92337d0e4b2c6cc9163fa69f49
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:24:35 2023 +0100

    smbd: allow POSIX opens for file_set_dosmode() in rename_internals_fsp()
    
    As this check was previously added to file_set_dosmode() this is not yet a
    change in behaviour.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 17bb46abfe6c996676ff8dd33711f617e18ffa35
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:24:12 2023 +0100

    smbd: allow POSIX opens for file_set_dosmode() in mkdir_internal()
    
    As this check was previously added to file_set_dosmode() this is not yet a
    change in behaviour.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f5604640e90b522533abee16905361aa0ef9e48d
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:23:44 2023 +0100

    smbd: allow POSIX opens for file_set_dosmode() in mark_file_modified()
    
    As this check was previously added to file_set_dosmode() this is not yet a
    change in behaviour.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4d1b4d893d2fe297218309736ae63bac63404b5b
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:16:59 2023 +0100

    smbd: move POSIX check from possibly_set_archive() to file_set_dosmode()
    
    No change in behaviour. Move the check to the more low-level function
    file_set_dosmode() to ensure all callers use this consistently.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit b3c6c677a7031ad3a182a90c621a3f1ffb37e9fb
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 12:10:17 2023 +0100

    smbd: in file_set_dosmode() do an early exit if smb_fname->fsp is NULL
    
    No change in behaviour. Simplifies coming changes.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 7c7786a121cedd56c37c7b349912680780b151f6
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Oct 31 10:06:38 2023 +0100

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

commit 9b3c085409a18298097b4bf015d8dba640ccc404
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Oct 30 19:15:53 2023 +0100

    smbd: add and use helper function possibly_set_archive()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 19434fe06d14a7fc2c9089cc880c93257eda5518
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Oct 30 19:04:56 2023 +0100

    smbd: remove call to fdos_mode() when setting DOS attrs
    
    This added in 49a754b82d33fb523cda4151a865584ae52a2e2f to work with stored
    itime based File-Ids. Since switching back to purely inode based File-Ids we
    can remove this call that primed itime from DOS xattr.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 libcli/smb/smb_constants.h     |   2 +-
 python/samba/tests/smb3unix.py |  32 +++++--
 source3/include/smb_macros.h   |   2 +-
 source3/smbd/dosmode.c         |  35 +++++---
 source3/smbd/fileio.c          |   3 -
 source3/smbd/files.c           |   8 +-
 source3/smbd/open.c            |  59 +++++++++----
 source3/smbd/smb2_reply.c      |   1 -
 source3/torture/test_posix.c   | 188 +++++++++++++++++++++++++++++------------
 9 files changed, 231 insertions(+), 99 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h
index ead047d924f..1d55a555157 100644
--- a/libcli/smb/smb_constants.h
+++ b/libcli/smb/smb_constants.h
@@ -329,7 +329,7 @@ enum csc_policy {
 #define FLAGS2_UNICODE_STRINGS         0x8000
 
 /* FileAttributes (search attributes) field */
-#define FILE_ATTRIBUTES_INVALID 	0x0000L
+#define FILE_ATTRIBUTE_INVALID 		0x0000L
 #define FILE_ATTRIBUTE_READONLY		0x0001L
 #define FILE_ATTRIBUTE_HIDDEN		0x0002L
 #define FILE_ATTRIBUTE_SYSTEM		0x0004L
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index a98109d096b..33a3d546f75 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -233,9 +233,11 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                 fname = 'testfile%04o' % perm
                 test_files[fname] = perm
                 f,_,cc_out = c.create_ex('\\%s' % fname,
-                                DesiredAccess=security.SEC_STD_ALL,
+                                DesiredAccess=security.SEC_FILE_ALL,
                                 CreateDisposition=libsmb.FILE_CREATE,
                                 CreateContexts=[posix_context(perm)])
+                if perm & 0o200 == 0o200:
+                    c.write(f, buffer=b"data", offset=0)
                 c.close(f)
 
                 dname = 'testdir%04o' % perm
@@ -248,13 +250,33 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                 c.close(f)
 
             res = c.list("", info_level=libsmb.SMB2_FIND_POSIX_INFORMATION)
-            found_files = {get_string(i['name']): i['perms'] for i in res}
-            for fname, perm in test_files.items():
+
+            found_files = {get_string(i['name']): i for i in res}
+            for fname,perm in test_files.items():
                 self.assertIn(get_string(fname), found_files.keys(),
                               'Test file not found')
-                self.assertEqual(test_files[fname], found_files[fname],
+                self.assertEqual(test_files[fname], found_files[fname]['perms'],
                                  'Requested %04o, Received %04o' % \
-                                         (test_files[fname], found_files[fname]))
+                                         (test_files[fname], found_files[fname]['perms']))
+
+                self.assertEqual(found_files[fname]['reparse_tag'],
+                                 libsmb.IO_REPARSE_TAG_RESERVED_ZERO)
+                self.assertEqual(found_files[fname]['perms'], perm)
+                self.assertEqual(found_files[fname]['owner_sid'],
+                                 self.samsid + "-1000")
+                self.assertTrue(found_files[fname]['group_sid'].startswith("S-1-22-2-"))
+
+                if fname.startswith("testfile"):
+                    self.assertEqual(found_files[fname]['nlink'], 1)
+                    self.assertEqual(found_files[fname]['size'], 4)
+                    self.assertEqual(found_files[fname]['allocaction_size'],
+                                     4096)
+                    self.assertEqual(found_files[fname]['attrib'],
+                                     libsmb.FILE_ATTRIBUTE_ARCHIVE)
+                else:
+                    self.assertEqual(found_files[fname]['nlink'], 2)
+                    self.assertEqual(found_files[fname]['attrib'],
+                                     libsmb.FILE_ATTRIBUTE_DIRECTORY)
 
         finally:
             if len(test_files) > 0:
diff --git a/source3/include/smb_macros.h b/source3/include/smb_macros.h
index f9aaf786ed3..3a942f9df11 100644
--- a/source3/include/smb_macros.h
+++ b/source3/include/smb_macros.h
@@ -103,7 +103,7 @@
 #define VALID_STAT_OF_DIR(st) (VALID_STAT(st) && S_ISDIR((st).st_ex_mode))
 #define SET_STAT_INVALID(st) { \
 		(st).st_ex_nlink = 0;					\
-		(st).cached_dos_attributes = FILE_ATTRIBUTES_INVALID;	\
+		(st).cached_dos_attributes = FILE_ATTRIBUTE_INVALID;	\
 };
 
 /* Macros to get at offsets within smb_lkrng and smb_unlkrng
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index 2eef953a9cb..c0fc468cdfb 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -710,7 +710,7 @@ uint32_t fdos_mode(struct files_struct *fsp)
 		return FILE_ATTRIBUTE_NORMAL;
 	}
 
-	if (fsp->fsp_name->st.cached_dos_attributes != FILE_ATTRIBUTES_INVALID) {
+	if (fsp->fsp_name->st.cached_dos_attributes != FILE_ATTRIBUTE_INVALID) {
 		return fsp->fsp_name->st.cached_dos_attributes;
 	}
 
@@ -903,6 +903,11 @@ int file_set_dosmode(connection_struct *conn,
 		return -1;
 	}
 
+	if (S_ISLNK(smb_fname->st.st_ex_mode)) {
+		/* A symlink in POSIX context, ignore */
+		return 0;
+	}
+
 	if ((S_ISDIR(smb_fname->st.st_ex_mode)) &&
 	    (dosmode & FILE_ATTRIBUTE_TEMPORARY))
 	{
@@ -915,26 +920,30 @@ int file_set_dosmode(connection_struct *conn,
 	DEBUG(10,("file_set_dosmode: setting dos mode 0x%x on file %s\n",
 		  dosmode, smb_fname_str_dbg(smb_fname)));
 
-	unixmode = smb_fname->st.st_ex_mode;
+	if (smb_fname->fsp == NULL) {
+		errno = ENOENT;
+		return -1;
+	}
 
-	if (smb_fname->fsp != NULL) {
-		get_acl_group_bits(
-			conn, smb_fname->fsp, &smb_fname->st.st_ex_mode);
+	if (smb_fname->fsp->posix_flags & FSP_POSIX_FLAGS_OPEN &&
+	    !lp_store_dos_attributes(SNUM(conn)))
+	{
+		return 0;
 	}
 
+	unixmode = smb_fname->st.st_ex_mode;
+
+	get_acl_group_bits(conn, smb_fname->fsp, &smb_fname->st.st_ex_mode);
+
 	if (S_ISDIR(smb_fname->st.st_ex_mode))
 		dosmode |= FILE_ATTRIBUTE_DIRECTORY;
 	else
 		dosmode &= ~FILE_ATTRIBUTE_DIRECTORY;
 
-	if (smb_fname->fsp != NULL) {
-		/* Store the DOS attributes in an EA by preference. */
-		status = SMB_VFS_FSET_DOS_ATTRIBUTES(
-			conn, metadata_fsp(smb_fname->fsp), dosmode);
-	} else {
-		status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
-	}
-
+	/* Store the DOS attributes in an EA by preference. */
+	status = SMB_VFS_FSET_DOS_ATTRIBUTES(conn,
+					     metadata_fsp(smb_fname->fsp),
+					     dosmode);
 	if (NT_STATUS_IS_OK(status)) {
 		smb_fname->st.cached_dos_attributes = dosmode;
 		ret = 0;
diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c
index 3b3d3a5fcd9..ed62159a495 100644
--- a/source3/smbd/fileio.c
+++ b/source3/smbd/fileio.c
@@ -237,9 +237,6 @@ void mark_file_modified(files_struct *fsp)
 
 	fsp->fsp_flags.modified = true;
 
-	if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
-		return;
-	}
 	if (!(lp_store_dos_attributes(SNUM(fsp->conn)) ||
 	      MAP_ARCHIVE(fsp->conn))) {
 		return;
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 1bbf822df28..0c54ca37468 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -2038,7 +2038,7 @@ files_struct *file_fsp(struct smb_request *req, uint16_t fid)
 	}
 
 	req->chain_fsp = fsp;
-	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTES_INVALID;
+	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTE_INVALID;
 	return fsp;
 }
 
@@ -2085,7 +2085,7 @@ struct files_struct *file_fsp_get(struct smbd_smb2_request *smb2req,
 		return NULL;
 	}
 
-	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTES_INVALID;
+	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTE_INVALID;
 
 	return fsp;
 }
@@ -2101,7 +2101,7 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
 			return NULL;
 		}
 		smb2req->compat_chain_fsp->fsp_name->st.cached_dos_attributes =
-			FILE_ATTRIBUTES_INVALID;
+			FILE_ATTRIBUTE_INVALID;
 		return smb2req->compat_chain_fsp;
 	}
 
@@ -2231,7 +2231,7 @@ static NTSTATUS fsp_attach_smb_fname(struct files_struct *fsp,
 
 	fsp->name_hash = name_hash;
 	fsp->fsp_name = smb_fname_new;
-	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTES_INVALID;
+	fsp->fsp_name->st.cached_dos_attributes = FILE_ATTRIBUTE_INVALID;
 	*_smb_fname = NULL;
 	return NT_STATUS_OK;
 }
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 9e5bf2f6731..4b1d5a4de65 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -3728,6 +3728,42 @@ static void open_ntcreate_lock_cleanup_entry(struct share_mode_lock *lck,
 	}
 }
 
+static void possibly_set_archive(struct connection_struct *conn,
+				 struct files_struct *fsp,
+				 struct smb_filename *smb_fname,
+				 struct smb_filename *parent_dir_fname,
+				 int info,
+				 uint32_t dosattrs,
+				 mode_t *unx_mode)
+{
+	bool set_archive = false;
+	int ret;
+
+	if (info == FILE_WAS_OPENED) {
+		return;
+	}
+
+	/* Overwritten files should be initially set as archive */
+	if ((info == FILE_WAS_OVERWRITTEN && lp_map_archive(SNUM(conn)))) {
+		set_archive = true;
+	} else if (lp_store_dos_attributes(SNUM(conn))) {
+		set_archive = true;
+	}
+	if (!set_archive) {
+		return;
+	}
+
+	ret = file_set_dosmode(conn,
+			       smb_fname,
+			       dosattrs | FILE_ATTRIBUTE_ARCHIVE,
+			       parent_dir_fname,
+			       true);
+	if (ret != 0) {
+		return;
+	}
+	*unx_mode = smb_fname->st.st_ex_mode;
+}
+
 /****************************************************************************
  Open a file with a share mode. Passed in an already created files_struct *.
 ****************************************************************************/
@@ -4410,20 +4446,13 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		fsp->fsp_flags.initial_delete_on_close = true;
 	}
 
-	if (info != FILE_WAS_OPENED) {
-		/* Overwritten files should be initially set as archive */
-		if ((info == FILE_WAS_OVERWRITTEN && lp_map_archive(SNUM(conn))) ||
-		    lp_store_dos_attributes(SNUM(conn))) {
-			(void)fdos_mode(fsp);
-			if (!posix_open) {
-				if (file_set_dosmode(conn, smb_fname,
-					    new_dos_attributes | FILE_ATTRIBUTE_ARCHIVE,
-					    parent_dir_fname, true) == 0) {
-					unx_mode = smb_fname->st.st_ex_mode;
-				}
-			}
-		}
-	}
+	possibly_set_archive(conn,
+			     fsp,
+			     smb_fname,
+			     parent_dir_fname,
+			     info,
+			     new_dos_attributes,
+			     &smb_fname->st.st_ex_mode);
 
 	/* Determine sparse flag. */
 	if (posix_open) {
@@ -4595,7 +4624,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
 		return NT_STATUS_NOT_A_DIRECTORY;
 	}
 
-	if (lp_store_dos_attributes(SNUM(conn)) && !posix_open) {
+	if (lp_store_dos_attributes(SNUM(conn))) {
 		file_set_dosmode(conn,
 				 smb_dname,
 				 file_attributes | FILE_ATTRIBUTE_DIRECTORY,
diff --git a/source3/smbd/smb2_reply.c b/source3/smbd/smb2_reply.c
index ce66e9b869f..269482f11ec 100644
--- a/source3/smbd/smb2_reply.c
+++ b/source3/smbd/smb2_reply.c
@@ -1762,7 +1762,6 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
 				  smb_fname_dst);
 
 		if (!fsp->fsp_flags.is_directory &&
-		    !(fsp->posix_flags & FSP_POSIX_FLAGS_PATHNAMES) &&
 		    (lp_map_archive(SNUM(conn)) ||
 		     lp_store_dos_attributes(SNUM(conn))))
 		{
diff --git a/source3/torture/test_posix.c b/source3/torture/test_posix.c
index dbf72db7b03..ac4c1a1cb34 100644
--- a/source3/torture/test_posix.c
+++ b/source3/torture/test_posix.c
@@ -33,54 +33,73 @@ struct posix_test_entry {
 	const char *name;
 	const char *target;
 	const char *expected;
-	uint32_t attr;
+	uint32_t attr_win;
+	uint32_t attr_lin;
 	uint64_t returned_size;
 	bool ok;
 };
 
+enum client_flavour { WINDOWS, POSIX };
+
+struct posix_test_state {
+	enum client_flavour flavour;
+	struct posix_test_entry *entries;
+};
+
 static NTSTATUS posix_ls_fn(struct file_info *finfo,
 			    const char *name,
 			    void *_state)
 {
-	struct posix_test_entry *state =
-		(struct posix_test_entry *)_state;
-
-	for (; state->name != NULL; state++) {
-		if (strequal(finfo->name, state->expected)) {
-			if (state->attr != finfo->attr) {
-				break;
-			}
-			state->ok = true;
-			state->returned_size = finfo->size;
+	struct posix_test_state *state =
+		(struct posix_test_state *)_state;
+	struct posix_test_entry *e = state->entries;
+
+	for (; e->name != NULL; e++) {
+		uint32_t attr;
+		if (!strequal(finfo->name, e->expected)) {
+			continue;
+		}
+		if (state->flavour == WINDOWS) {
+			attr = e->attr_win;
+		} else {
+			attr = e->attr_lin;
+		}
+		if (attr != finfo->attr) {
 			break;
 		}
+		e->ok = true;
+		e->returned_size = finfo->size;
+		break;
 	}
 
 	return NT_STATUS_OK;
 }
 
-static void posix_test_entries_reset(struct posix_test_entry *state)
+static void posix_test_entries_reset(struct posix_test_state *state)
 {
-	for (; state->name != NULL; state++) {
-		state->ok = false;
-		state->returned_size = 0;
+	struct posix_test_entry *e = state->entries;
+
+	for (; e->name != NULL; e++) {
+		e->ok = false;
+		e->returned_size = 0;
 	}
 }
 
-static bool posix_test_entry_check(struct posix_test_entry *state,
+static bool posix_test_entry_check(struct posix_test_state *state,
 				   const char *name,
 				   bool expected,
 				   uint64_t expected_size)
 {
+	struct posix_test_entry *e = state->entries;
 	bool result = false;
 
-	for (; state->name != NULL; state++) {
-		if (strequal(name, state->name)) {
-			result = state->ok;
+	for (; e->name != NULL; e++) {
+		if (strequal(name, e->name)) {
+			result = e->ok;
 			break;
 		}
 	}
-	if (state->name == NULL) {
+	if (e->name == NULL) {
 		printf("test failed, unknown name: %s\n", name);
 		return false;
 	}
@@ -113,26 +132,39 @@ bool run_posix_ls_wildcard_test(int dummy)
 	const char *symlnk_dst_in_share = file;
 	const char *symlnk_outside_share = "symlnk_outside_share";
 	const char *symlnk_dst_outside_share = "/etc/passwd";
-	struct posix_test_entry state[] = {
+	struct posix_test_entry entries[] = {
 		{
+			.name = file,
+			.target = NULL,
+			.expected = file,
+			.attr_win = FILE_ATTRIBUTE_ARCHIVE,
+			.attr_lin = FILE_ATTRIBUTE_ARCHIVE,
+		}, {
 			.name = symlnk_dangling,
 			.target = symlnk_dst_dangling,
 			.expected = symlnk_dangling,
-			.attr = FILE_ATTRIBUTE_NORMAL,
+			.attr_win = FILE_ATTRIBUTE_INVALID,
+			.attr_lin = FILE_ATTRIBUTE_NORMAL,
 		}, {
 			.name = symlnk_in_share,
 			.target = symlnk_dst_in_share,
 			.expected = symlnk_in_share,
-			.attr = FILE_ATTRIBUTE_NORMAL,
+			.attr_win = FILE_ATTRIBUTE_ARCHIVE,
+			.attr_lin = FILE_ATTRIBUTE_NORMAL,
 		}, {
 			.name = symlnk_outside_share,
 			.target = symlnk_dst_outside_share,
 			.expected = symlnk_outside_share,
-			.attr = FILE_ATTRIBUTE_NORMAL,
+			.attr_win = FILE_ATTRIBUTE_INVALID,
+			.attr_lin = FILE_ATTRIBUTE_NORMAL,
 		}, {
 			.name = NULL,
 		}
 	};
+	struct posix_test_state _state = {
+		.entries = entries,
+	};
+	struct posix_test_state *state = &_state;
 	int i;
 	bool correct = false;
 
@@ -183,10 +215,13 @@ bool run_posix_ls_wildcard_test(int dummy)
 	}
 	fnum = (uint16_t)-1;
 
-	for (i = 0; state[i].name != NULL; i++) {
+	for (i = 0; entries[i].name != NULL; i++) {
+		if (entries[i].target == NULL) {
+			continue;
+		}
 		status = cli_posix_symlink(cli_unix,
-					   state[i].target,
-					   state[i].name);
+					   entries[i].target,
+					   entries[i].name);
 		if (!NT_STATUS_IS_OK(status)) {
 			printf("POSIX symlink of %s failed (%s)\n",
 			       symlnk_dangling, nt_errstr(status));
@@ -195,6 +230,7 @@ bool run_posix_ls_wildcard_test(int dummy)
 	}
 
 	printf("Doing Windows ls *\n");
+	state->flavour = WINDOWS;
 
 	status = cli_list(cli_win, "*", 0, posix_ls_fn, state);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -202,6 +238,9 @@ bool run_posix_ls_wildcard_test(int dummy)
 		goto out;
 	}
 
+	if (!posix_test_entry_check(state, file, true, 0)) {
+		goto out;
+	}
 	if (!posix_test_entry_check(state, symlnk_dangling, false, 0)) {
 		goto out;
 	}
@@ -215,6 +254,7 @@ bool run_posix_ls_wildcard_test(int dummy)
 	posix_test_entries_reset(state);
 
 	printf("Doing POSIX ls *\n");
+	state->flavour = LINUX;
 
 	status = cli_list(cli_unix, "*", 0, posix_ls_fn, state);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -222,6 +262,9 @@ bool run_posix_ls_wildcard_test(int dummy)
 		goto out;
 	}
 
+	if (!posix_test_entry_check(state, file, true, 0)) {
+		goto out;
+	}
 	if (!posix_test_entry_check(state,
 				    symlnk_dangling,
 				    true,
@@ -280,26 +323,39 @@ bool run_posix_ls_single_test(int dummy)
 	const char *symlnk_dst_in_share = file;
 	const char *symlnk_outside_share = "symlnk_outside_share";
 	const char *symlnk_dst_outside_share = "/etc/passwd";
-	struct posix_test_entry state[] = {
+	struct posix_test_entry entries[] = {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list