[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Tue Nov 29 11:24:01 UTC 2022


The branch, master has been updated
       via  357bafe6258 smbd: Allow POSIX getinfo levels for smb3 unix extensions
       via  bbc82a5d425 s3: Test that store_smb2_posix_info hides info for '..'
       via  d0ad452fc81 s3: smbd: store_smb2_posix_info hide info for '..'
       via  bdb98c83974 smbd: Implement SMB2_FS_POSIX_INFORMATION_INTERNAL
       via  a73d9032388 tests/s3: Test file/dir permissions with SMB3 posix
       via  09c8426b95a tests/s3: Test case sensitive open with SMB3 posix
       via  160173ee064 tests/s3: Test delete on close with SMB3 posix
       via  f481cd4a60a libcli: Add client support for SMB2_FILE_POSIX_INFORMATION
       via  f0e1137425f tests/s3: Test reserved chars in posix filename
       via  08226d6c2e8 smbd: Implement SMB2_FILE_POSIX_INFORMATION in smbd_marshall_dir_entry
       via  7c2f08d564f tests/s3: Test SMB2_FIND_POSIX_INFORMATION dir query
       via  284787996d4 libsmb: Allow listing with posix context
       via  99de8d7cfa3 libsmb: Make info_level configurable in dir listing
       via  2c1a02d622c smbd: Plumb SMB2_FIND_POSIX_INFORMATION through the directory reading code.
       via  72004f8f948 s3: smbd: Add SMB2_FILE_POSIX_INFORMATION getinfo info level (100 on the wire).
      from  535a08dfc4c smbd: reject FILE_ATTRIBUTE_TEMPORARY on directories

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


- Log -----------------------------------------------------------------
commit 357bafe62584e2ca1bbf0dfaf6f949262daf59dc
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 22 16:00:53 2022 +0100

    smbd: Allow POSIX getinfo levels for smb3 unix extensions
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Tue Nov 29 11:23:58 UTC 2022 on sn-devel-184

commit bbc82a5d425ad51a269e1ab8e4db859943fcc4ff
Author: David Mulder <dmulder at samba.org>
Date:   Thu Nov 3 10:28:58 2022 -0600

    s3: Test that store_smb2_posix_info hides info for '..'
    
    Signed-off-by: David Mulder <dmulder at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit d0ad452fc81f65017d1f783e98a58117278d8289
Author: David Mulder <dmulder at samba.org>
Date:   Tue Oct 18 07:37:47 2022 -0600

    s3: smbd: store_smb2_posix_info hide info for '..'
    
    When receiving a query for '..', hide the owner
    and group sids, the inode, and the dev id.
    
    Signed-off-by: David Mulder <dmulder at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit bdb98c8397462805b4cdfaedeee24c5d2b294b86
Author: David Mulder <dmulder at samba.org>
Date:   Mon Sep 12 16:09:50 2022 -0700

    smbd: Implement SMB2_FS_POSIX_INFORMATION_INTERNAL
    
    Signed-off-by: David Mulder <dmulder at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit a73d903238807f0e53c70dc2ecb017093206b7e8
Author: David Mulder <dmulder at suse.com>
Date:   Fri Aug 5 14:00:30 2022 -0600

    tests/s3: Test file/dir permissions with SMB3 posix
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 09c8426b95a0f95e10e1c22a1f0a285ce81fb19f
Author: David Mulder <dmulder at suse.com>
Date:   Fri Aug 5 13:05:48 2022 -0600

    tests/s3: Test case sensitive open with SMB3 posix
    
    Disabled because we don't handle posix paths
    correctly yet.
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 160173ee0641c871981868ee100d84b4046710a6
Author: David Mulder <dmulder at suse.com>
Date:   Fri Aug 5 10:56:32 2022 -0600

    tests/s3: Test delete on close with SMB3 posix
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit f481cd4a60a55a30e78fe6da4aa5f5fe90fa433e
Author: David Mulder <dmulder at suse.com>
Date:   Fri Jul 8 13:15:51 2022 -0600

    libcli: Add client support for SMB2_FILE_POSIX_INFORMATION
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit f0e1137425f5ed1ff97c729e4b39be626602e6b7
Author: David Mulder <dmulder at suse.com>
Date:   Thu Jul 7 12:57:01 2022 -0600

    tests/s3: Test reserved chars in posix filename
    
    Disabled because we don't handle posix paths
    correctly yet.
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 08226d6c2e8ed1e1d8104afcfcea37a66de0a413
Author: David Mulder <dmulder at suse.com>
Date:   Fri Jun 17 15:06:29 2022 -0600

    smbd: Implement SMB2_FILE_POSIX_INFORMATION in smbd_marshall_dir_entry
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 7c2f08d564f74d8259d0ad8c3b25923eb3e5ece4
Author: David Mulder <dmulder at suse.com>
Date:   Wed Jun 15 15:39:00 2022 -0600

    tests/s3: Test SMB2_FIND_POSIX_INFORMATION dir query
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 284787996d45ee8e5848a5071b42f114c791a56a
Author: David Mulder <dmulder at samba.org>
Date:   Tue Sep 20 10:28:20 2022 -0600

    libsmb: Allow listing with posix context
    
    Signed-off-by: David Mulder <dmulder at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 99de8d7cfa390a06a0a7e5ac14843a3bea3c9365
Author: David Mulder <dmulder at suse.com>
Date:   Wed Jun 15 13:20:30 2022 -0600

    libsmb: Make info_level configurable in dir listing
    
    This was hard coded to SMB2_FIND_ID_BOTH_DIRECTORY_INFO
    
    Signed-off-by: David Mulder <dmulder at suse.com>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 2c1a02d622c710bb77d2142c9cdf09b921ddb888
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 18 13:27:06 2017 -0800

    smbd: Plumb SMB2_FIND_POSIX_INFORMATION through the directory reading code.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 72004f8f94824e00ed120d87893ec57c96c5f8f2
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Dec 14 15:18:21 2017 -0800

    s3: smbd: Add SMB2_FILE_POSIX_INFORMATION getinfo info level (100 on the wire).
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

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

Summary of changes:
 libcli/smb/smb_unix_ext.h           |   6 +-
 python/samba/tests/smb3unix.py      | 216 ++++++++++++++++++++++++++++++++++++
 selftest/knownfail.d/smb3unix       |   2 +
 selftest/target/Samba3.pm           |   8 ++
 source3/include/client.h            |   7 ++
 source3/include/trans2.h            |   1 +
 source3/libsmb/cli_smb2_fnum.c      | 156 ++++++++++++++++++++++++--
 source3/libsmb/cli_smb2_fnum.h      |   4 +-
 source3/libsmb/clilist.c            |  17 ++-
 source3/libsmb/proto.h              |   3 +-
 source3/libsmb/pylibsmb.c           |  85 +++++++++++++-
 source3/smbd/dir.c                  |   7 ++
 source3/smbd/smb2_getinfo.c         |   8 ++
 source3/smbd/smb2_posix.c           |  13 ++-
 source3/smbd/smb2_query_directory.c |   7 ++
 source3/smbd/smb2_trans2.c          | 151 ++++++++++++++++++++++++-
 16 files changed, 660 insertions(+), 31 deletions(-)
 create mode 100644 selftest/knownfail.d/smb3unix


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb_unix_ext.h b/libcli/smb/smb_unix_ext.h
index 6d5b76da613..2f2357d8acf 100644
--- a/libcli/smb/smb_unix_ext.h
+++ b/libcli/smb/smb_unix_ext.h
@@ -33,8 +33,6 @@
 #define MIN_UNIX_INFO_LEVEL 0x200
 #define MAX_UNIX_INFO_LEVEL 0x2FF
 
-#define INFO_LEVEL_IS_UNIX(level) (((level) >= MIN_UNIX_INFO_LEVEL) && ((level) <= MAX_UNIX_INFO_LEVEL))
-
 #define SMB_QUERY_FILE_UNIX_BASIC      0x200   /* UNIX File Info*/
 #define SMB_SET_FILE_UNIX_BASIC        0x200
 #define SMB_SET_FILE_UNIX_INFO2        0x20B   /* UNIX File Info2 */
@@ -453,4 +451,8 @@ enum smb_whoami_flags {
 #define SMB_POSIX_UNLINK_FILE_TARGET 0
 #define SMB_POSIX_UNLINK_DIRECTORY_TARGET 1
 
+#define INFO_LEVEL_IS_UNIX(level) ((((level) >= MIN_UNIX_INFO_LEVEL) && \
+			((level) <= MAX_UNIX_INFO_LEVEL)) || \
+			((level) == SMB2_FILE_POSIX_INFORMATION_INTERNAL))
+
 #endif /* __SMB_UNIX_EXT_H__ */
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index 514c245515f..3ad49af09fa 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -18,6 +18,11 @@
 from samba.samba3 import libsmb_samba_internal as libsmb
 from samba import NTSTATUSError,ntstatus
 import samba.tests.libsmb
+from samba.dcerpc import security
+from samba.common import get_string
+
+def posix_context(mode):
+    return (libsmb.SMB2_CREATE_TAG_POSIX, mode.to_bytes(4, 'little'))
 
 class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
@@ -144,3 +149,214 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
         finally:
             self.disable_smb3unix()
+
+    def delete_test_file(self, c, fname, mode=0):
+        f,_,cc_out = c.create_ex(fname,
+                        DesiredAccess=security.SEC_STD_ALL,
+                        CreateDisposition=libsmb.FILE_OPEN,
+                        CreateContexts=[posix_context(mode)])
+        c.delete_on_close(f, True)
+        c.close(f)
+
+    def test_posix_query_dir(self):
+        test_files = []
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            for i in range(10):
+                fname = '\\test%d' % i
+                f,_,cc_out = c.create_ex(fname,
+                                CreateDisposition=libsmb.FILE_OPEN_IF,
+                                CreateContexts=[posix_context(0o744)])
+                c.close(f)
+                test_files.append(fname)
+
+            expected_count = len(c.list(''))
+            self.assertNotEqual(expected_count, 0, 'No files were found')
+
+            actual_count = len(c.list('',
+                                info_level=libsmb.SMB2_FIND_POSIX_INFORMATION,
+                                posix=True))
+            self.assertEqual(actual_count-2, expected_count,
+                             'SMB2_FIND_POSIX_INFORMATION failed to list contents')
+
+        finally:
+            for fname in test_files:
+                self.delete_test_file(c, fname)
+
+            self.disable_smb3unix()
+
+    def test_posix_reserved_char(self):
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            test_files = ['a ', 'a  ', '. ', '.  ', 'a.',
+                          '.a', ' \\ ', '>', '<' '?']
+
+            for fname in test_files:
+                try:
+                    f,_,cc_out = c.create_ex('\\%s' % fname,
+                                    CreateDisposition=libsmb.FILE_CREATE,
+                                    DesiredAccess=security.SEC_STD_DELETE,
+                                    CreateContexts=[posix_context(0o744)])
+                except NTSTATUSError as e:
+                    self.fail(e)
+                c.delete_on_close(f, True)
+                c.close(f)
+
+        finally:
+            self.disable_smb3unix()
+
+    def test_posix_delete_on_close(self):
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            f,_,cc_out = c.create_ex('\\TESTING999',
+                            DesiredAccess=security.SEC_STD_ALL,
+                            CreateDisposition=libsmb.FILE_CREATE,
+                            CreateContexts=[posix_context(0o744)])
+            c.delete_on_close(f, True)
+            c.close(f)
+
+        finally:
+            self.disable_smb3unix()
+
+    def test_posix_case_sensitive(self):
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            f,_,cc_out = c.create_ex('\\xx',
+                            DesiredAccess=security.SEC_STD_ALL,
+                            CreateDisposition=libsmb.FILE_CREATE,
+                            CreateContexts=[posix_context(0o644)])
+            c.close(f)
+
+            fail = False
+            try:
+                f,_,cc_out = c.create_ex('\\XX',
+                                DesiredAccess=security.SEC_STD_ALL,
+                                CreateDisposition=libsmb.FILE_OPEN,
+                                CreateContexts=[posix_context(0)])
+            except NTSTATUSError:
+                pass
+            else:
+                fail = True
+                c.close(f)
+
+            self.assertFalse(fail, "Opening uppercase file didn't fail")
+
+        finally:
+            self.delete_test_file(c, '\\xx')
+
+            self.disable_smb3unix()
+
+    def test_posix_perm_files(self):
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            test_files = {}
+            for perm in range(0o600, 0o7777+1):
+                # Owner write permission is required or cleanup will fail, and
+                # owner read is required to list the file if O_PATH is disabled
+                if perm & 0o600 != 0o600:
+                    continue
+
+                # Don't create with setuid or setgid.
+                if perm & 0o6000 != 0:
+                    continue
+
+                fname = 'testfile%04o' % perm
+                test_files[fname] = perm
+                f,_,cc_out = c.create_ex('\\%s' % fname,
+                                DesiredAccess=security.SEC_STD_ALL,
+                                CreateDisposition=libsmb.FILE_CREATE,
+                                CreateContexts=[posix_context(perm)])
+                c.close(f)
+
+                dname = 'testdir%04o' % perm
+                test_files[dname] = perm
+                f,_,cc_out = c.create_ex('\\%s' % dname,
+                                DesiredAccess=security.SEC_STD_ALL,
+                                CreateDisposition=libsmb.FILE_CREATE,
+                                CreateOptions=libsmb.FILE_DIRECTORY_FILE,
+                                CreateContexts=[posix_context(perm)])
+                c.close(f)
+
+            res = c.list("", info_level=100, posix=True)
+            found_files = {get_string(i['name']): i['perms'] 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],
+                                 'Requested %04o, Received %04o' % \
+                                         (test_files[fname], found_files[fname]))
+
+        finally:
+            for fname in test_files.keys():
+                self.delete_test_file(c, '\\%s' % fname)
+
+            self.disable_smb3unix()
+
+    def test_share_root_null_sids_fid(self):
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            res = c.list("", info_level=100, posix=True)
+            found_files = {get_string(i['name']): i for i in res}
+            dotdot = found_files['..']
+            self.assertEqual('S-1-0-0', dotdot['owner_sid'],
+                             'The owner sid for .. was not NULL')
+            self.assertEqual('S-1-0-0', dotdot['group_sid'],
+                             'The group sid for .. was not NULL')
+            self.assertEqual(0, dotdot['ino'], 'The ino for .. was not 0')
+            self.assertEqual(0, dotdot['dev'], 'The dev for .. was not 0')
+        finally:
+            self.disable_smb3unix()
diff --git a/selftest/knownfail.d/smb3unix b/selftest/knownfail.d/smb3unix
new file mode 100644
index 00000000000..2ab886ae75e
--- /dev/null
+++ b/selftest/knownfail.d/smb3unix
@@ -0,0 +1,2 @@
+^samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests.test_posix_reserved_char\(fileserver\)
+^samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests.test_posix_case_sensitive\(fileserver\)
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index a2808ffbce8..3ec0776e654 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -3078,6 +3078,14 @@ sub provision($$)
 	directory mask = 0777
 	force directory mode = 0
 	vfs objects = xattr_tdb streams_depot
+[smb3_posix_share]
+	vfs objects = fake_acls xattr_tdb streams_depot time_audit full_audit
+	create mask = 07777
+	directory mask = 07777
+	mangled names = no
+	path = $shrdir
+	read only = no
+	guest ok = yes
 [aio]
 	copy = durable
 	aio read size = 1
diff --git a/source3/include/client.h b/source3/include/client.h
index 4939e1879cf..5ac9d649142 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -108,6 +108,13 @@ struct file_info {
 	struct timespec ctime_ts;
 	char *name;
 	char *short_name;
+	uint32_t mode;
+	uint32_t reparse_tag;
+	dev_t st_ex_dev;
+	mode_t st_ex_mode;
+	nlink_t st_ex_nlink;
+	struct dom_sid owner_sid;
+	struct dom_sid group_sid;
 };
 
 #define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
diff --git a/source3/include/trans2.h b/source3/include/trans2.h
index dfc59800846..3ed42a3f0b9 100644
--- a/source3/include/trans2.h
+++ b/source3/include/trans2.h
@@ -412,6 +412,7 @@ Byte offset   Type     name                description
 #define SMB2_FILE_FULL_EA_INFORMATION			(FSCC_FILE_FULL_EA_INFORMATION + SMB2_INFO_SPECIAL)
 #define SMB2_FILE_ALL_INFORMATION			(FSCC_FILE_ALL_INFORMATION + SMB2_INFO_SPECIAL)
 #define SMB2_FILE_POSIX_INFORMATION_INTERNAL		(SMB2_FILE_POSIX_INFORMATION + SMB2_INFO_SPECIAL)
+#define SMB2_FS_POSIX_INFORMATION_INTERNAL		1100
 
 /* NT passthrough levels for qfsinfo. */
 
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index a0323d701c3..5cf6f5baf7b 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1187,6 +1187,109 @@ NTSTATUS cli_smb2_unlink_recv(struct tevent_req *req)
 	return tevent_req_simple_recv_ntstatus(req);
 }
 
+static ssize_t sid_parse_wire(TALLOC_CTX *mem_ctx, const uint8_t *data,
+			      struct dom_sid *sid, size_t num_rdata)
+{
+	size_t sid_size;
+	enum ndr_err_code ndr_err;
+	DATA_BLOB in = data_blob_const(data, num_rdata);
+
+	ndr_err = ndr_pull_struct_blob(&in,
+				       mem_ctx,
+				       sid,
+				       (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return 0;
+	}
+
+	sid_size = ndr_size_dom_sid(sid, 0);
+	if (sid_size > num_rdata) {
+		return 0;
+	}
+
+	return sid_size;
+}
+
+/***************************************************************
+ Utility function to parse a SMB2_FIND_POSIX_INFORMATION reply.
+***************************************************************/
+
+static NTSTATUS parse_finfo_posix_info(const uint8_t *dir_data,
+				       uint32_t dir_data_length,
+				       struct file_info *finfo,
+				       uint32_t *next_offset)
+{
+	size_t namelen = 0;
+	size_t slen = 0, slen2 = 0;
+	size_t ret = 0;
+	uint32_t _next_offset = 0;
+
+	if (dir_data_length < 4) {
+		return NT_STATUS_INFO_LENGTH_MISMATCH;
+	}
+
+	_next_offset = IVAL(dir_data, 0);
+
+	if (_next_offset > dir_data_length) {
+		return NT_STATUS_INFO_LENGTH_MISMATCH;
+	}
+
+	if (_next_offset != 0) {
+		/* Ensure we only read what in this record. */
+		dir_data_length = _next_offset;
+	}
+
+	if (dir_data_length < 92) {
+		return NT_STATUS_INFO_LENGTH_MISMATCH;
+	}
+
+	finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
+	finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
+	finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
+	finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+	finfo->allocated_size = PULL_LE_U64(dir_data, 40);
+	finfo->size = PULL_LE_U64(dir_data, 48);
+	finfo->mode = PULL_LE_U32(dir_data, 56);
+	finfo->ino = PULL_LE_U64(dir_data, 60);
+	finfo->st_ex_dev = PULL_LE_U32(dir_data, 68);
+	finfo->st_ex_nlink = PULL_LE_U32(dir_data, 76);
+	finfo->reparse_tag = PULL_LE_U32(dir_data, 80);
+	finfo->st_ex_mode = wire_perms_to_unix(PULL_LE_U32(dir_data, 84));
+
+	slen = sid_parse_wire(finfo, dir_data+88, &finfo->owner_sid,
+			      dir_data_length-88);
+	if (slen == 0) {
+		return NT_STATUS_INVALID_NETWORK_RESPONSE;
+	}
+	slen2 = sid_parse_wire(finfo, dir_data+88+slen, &finfo->group_sid,
+			       dir_data_length-88-slen);
+	if (slen2 == 0) {
+		return NT_STATUS_INVALID_NETWORK_RESPONSE;
+	}
+	slen += slen2;
+
+	namelen = PULL_LE_U32(dir_data, 88+slen);
+	ret = pull_string_talloc(finfo,
+				dir_data,
+				FLAGS2_UNICODE_STRINGS,
+				&finfo->name,
+				dir_data+92+slen,
+				namelen,
+				STR_UNICODE);
+	if (ret == (size_t)-1) {
+		/* Bad conversion. */
+		return NT_STATUS_INVALID_NETWORK_RESPONSE;
+	}
+
+	if (finfo->name == NULL) {
+		/* Bad conversion. */
+		return NT_STATUS_INVALID_NETWORK_RESPONSE;
+	}
+
+	*next_offset = _next_offset;
+	return NT_STATUS_OK;
+}
+
 /***************************************************************
  Utility function to parse a SMB2_FIND_ID_BOTH_DIRECTORY_INFO reply.
 ***************************************************************/
@@ -1319,6 +1422,7 @@ struct cli_smb2_list_state {
 	NTSTATUS status;
 	struct cli_smb2_list_dir_data *response;
 	uint32_t offset;
+	unsigned int info_level;
 };
 
 static void cli_smb2_list_opened(struct tevent_req *subreq);
@@ -1329,12 +1433,15 @@ struct tevent_req *cli_smb2_list_send(
 	TALLOC_CTX *mem_ctx,
 	struct tevent_context *ev,
 	struct cli_state *cli,
-	const char *pathname)
+	const char *pathname,
+	unsigned int info_level,
+	bool posix)
 {
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_smb2_list_state *state = NULL;
 	char *parent = NULL;
 	bool ok;
+	struct smb2_create_blobs *in_cblobs = NULL;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_smb2_list_state);
 	if (req == NULL) {
@@ -1343,6 +1450,7 @@ struct tevent_req *cli_smb2_list_send(
 	state->ev = ev;
 	state->cli = cli;
 	state->status = NT_STATUS_OK;
+	state->info_level = info_level;
 
 	ok = windows_parent_dirname(state, pathname, &parent, &state->mask);
 	if (!ok) {
@@ -1350,6 +1458,29 @@ struct tevent_req *cli_smb2_list_send(
 		return tevent_req_post(req, ev);
 	}
 
+	if (smbXcli_conn_have_posix(cli->conn) && posix) {
+		NTSTATUS status;
+
+		/* The mode MUST be 0 when opening an existing file/dir, and
+		 * will be ignored by the server.
+		 */
+		uint8_t linear_mode[4] = { 0 };
+		DATA_BLOB blob = { .data=linear_mode,
+				   .length=sizeof(linear_mode) };
+
+		in_cblobs = talloc_zero(mem_ctx, struct smb2_create_blobs);
+		if (in_cblobs == NULL) {
+			return NULL;
+		}
+
+		status = smb2_create_blob_add(in_cblobs, in_cblobs,
+					      SMB2_CREATE_TAG_POSIX, blob);
+		if (!NT_STATUS_IS_OK(status)) {
+			tevent_req_nterror(req, status);
+			return tevent_req_post(req, ev);
+		}
+	}
+
 	subreq = cli_smb2_create_fnum_send(
 		state,					/* mem_ctx */
 		ev,					/* ev */
@@ -1362,7 +1493,8 @@ struct tevent_req *cli_smb2_list_send(
 		FILE_SHARE_READ|FILE_SHARE_WRITE,	/* share_access */
 		FILE_OPEN,				/* create_disposition */
 		FILE_DIRECTORY_FILE,			/* create_options */
-		NULL);					/* in_cblobs */
+		in_cblobs);				/* in_cblobs */
+	TALLOC_FREE(in_cblobs);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1499,7 +1631,7 @@ NTSTATUS cli_smb2_list_recv(
 			cli->timeout,			/* timeout_msec */
 			cli->smb2.session,		/* session */


-- 
Samba Shared Repository



More information about the samba-cvs mailing list