[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue May 14 23:30:01 UTC 2024


The branch, master has been updated
       via  b71f729698f smbd: Add reparse tag to smb3_posix_cc_info
       via  ecb17c12c54 smbd: Test reparse tag in smb3_posix_cc_info
       via  d0cdb4160b8 smbd: Use fsctl_get_reparse_tag in fsctl_del_reparse_point
       via  7b6dc319b53 smbd: Use fsctl_get_reparse_tag in fsctl_set_reparse_point
       via  3a387673662 smbd: Add fsctl_get_reparse_tag() helper function
       via  2743127a6e3 smbd: Modernize a few DEBUGs
       via  a85b1e57542 libsmb: Cap max_rdata at UINT16_MAX
       via  1776918c5bf libsmb: Use the direct FSCC_FILE_ALL_INFORMATION define
       via  5e0fe4d91ce smbd: Add DEBUG message got get_reparse_point
       via  ee653577630 smbd: Return reparse tag as of MS-FSCC 2.4.6
       via  d884c2fb0d5 smbd: Fix a DBG
       via  44b3eadacb3 tests: get TAG_INFORMATION
       via  ba40d97087b pylibsmb: Add py_cli_qfileinfo
       via  c13ac1f1a76 pylibsmb: Add FSCC QUERY_INFO levels
       via  291a353b16a libsmb: Remove smb2 branch from cli_qfileinfo_basic_send
       via  893e4f6ebf6 libsmb: Add smb2 branch to cli_qfileinfo
       via  6e9c18ed821 libsmb: Add a tevent_req_received() where appropriate
       via  bec5920ec91 libsmb: Convert cli_qfileinfo to use FSCC levels
       via  af4bb5f75f7 libsmb: Use SMB2_0_INFO_FILE instead of the raw "1"
       via  4eac4014c03 libsmb: Use SMB2_0_INFO_SECURITY instead of the raw "3"
       via  072e4d030ae smbd: Modernize a DEBUG
       via  7c59f110560 test: Align integer types
      from  1092d4b0a8e s3:winbindd: Update non cache entries keys (non_centry_keys)

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


- Log -----------------------------------------------------------------
commit b71f729698fba58543645e9ec40e95d57ea19e3b
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 15:44:52 2024 +0200

    smbd: Add reparse tag to smb3_posix_cc_info
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue May 14 23:29:46 UTC 2024 on atb-devel-224

commit ecb17c12c54214694ecc240ae290646d341cd9a5
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 15:44:14 2024 +0200

    smbd: Test reparse tag in smb3_posix_cc_info
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d0cdb4160b84a5f4e9c120c951beb55ac41cf1b3
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 14:30:30 2024 +0200

    smbd: Use fsctl_get_reparse_tag in fsctl_del_reparse_point
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 7b6dc319b53ad6df109517ae425d770b62136f7a
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 14:28:55 2024 +0200

    smbd: Use fsctl_get_reparse_tag in fsctl_set_reparse_point
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 3a3876736627a5c218661ffc6845e96b97322dca
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 14:26:22 2024 +0200

    smbd: Add fsctl_get_reparse_tag() helper function
    
    There's a few places where we only care about the tag
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 2743127a6e3092e292f74e2b851dc41b8b67f825
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 14:16:48 2024 +0200

    smbd: Modernize a few DEBUGs
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a85b1e57542831bd26afc985c9add740a063f856
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 13 11:16:21 2024 +0200

    libsmb: Cap max_rdata at UINT16_MAX
    
    The caller does not necessarily query max values for smb1 and smb2+.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 1776918c5bf2e6db4ab9072e09326b91fa211322
Author: Volker Lendecke <vl at samba.org>
Date:   Wed May 8 16:05:40 2024 +0200

    libsmb: Use the direct FSCC_FILE_ALL_INFORMATION define
    
    (SMB_FILE_ALL_INFORMATION - 1000) looks a bit silly if you look at the
    definition of SMB_FILE_ALL_INFORMATION...
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5e0fe4d91cee3cc687b2b4bbfc778a7bf8f58d5e
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 22 11:36:21 2022 +0100

    smbd: Add DEBUG message got get_reparse_point
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ee653577630d4f68f82fa93c03e0a33b7b6ccdc1
Author: Volker Lendecke <vl at samba.org>
Date:   Wed May 8 16:03:29 2024 +0200

    smbd: Return reparse tag as of MS-FSCC 2.4.6
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d884c2fb0d5a3b72d550d72c2f263f7d80a5dc8a
Author: Volker Lendecke <vl at samba.org>
Date:   Wed May 8 15:48:11 2024 +0200

    smbd: Fix a DBG
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 44b3eadacb3df92238b30c38abe4abf48c60a971
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 11:54:31 2024 +0200

    tests: get TAG_INFORMATION
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ba40d97087bed742eb6178b2e5e03a77e040f343
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 11:59:20 2024 +0200

    pylibsmb: Add py_cli_qfileinfo
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c13ac1f1a7606bd78b3527ea931910929adc0c05
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 12:00:00 2024 +0200

    pylibsmb: Add FSCC QUERY_INFO levels
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 291a353b16a77dd29b4a2be559b9c2c311c698e9
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 10:37:49 2024 +0200

    libsmb: Remove smb2 branch from cli_qfileinfo_basic_send
    
    cli_qfileinfo_send now does it
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 893e4f6ebf624d1f87fd320b4bbe833fbda4cc2b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 10:35:26 2024 +0200

    libsmb: Add smb2 branch to cli_qfileinfo
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6e9c18ed821d5c9563ec3ffef612656d87bebb3b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 10:34:13 2024 +0200

    libsmb: Add a tevent_req_received() where appropriate
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit bec5920ec9115a35b49828338ddb6fbbf9608ca4
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 10:12:14 2024 +0200

    libsmb: Convert cli_qfileinfo to use FSCC levels
    
    This will enable this routine to be used for SMB2 as well. The
    translation table is from [MS-CIFS] 2.2.8.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit af4bb5f75f74eea5f635bc0a019e1b3865ab533f
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 10:27:48 2024 +0200

    libsmb: Use SMB2_0_INFO_FILE instead of the raw "1"
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4eac4014c0358681aedf6deb0accd2f9860ef882
Author: Volker Lendecke <vl at samba.org>
Date:   Thu May 9 09:37:51 2024 +0200

    libsmb: Use SMB2_0_INFO_SECURITY instead of the raw "3"
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 072e4d030aee486e5749dff93ab1be98f931163b
Author: Volker Lendecke <vl at samba.org>
Date:   Wed May 8 14:17:34 2024 +0200

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

commit 7c59f1105607310e4a54488e5f40893ebb796a50
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 7 17:22:01 2024 +0200

    test: Align integer types
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 libcli/auth/tests/test_schannel.c   |   4 +-
 python/samba/tests/reparsepoints.py |  24 ++++++++
 python/samba/tests/smb3unix.py      |  41 ++++++++++++++
 source3/libsmb/cli_smb2_fnum.c      |   1 +
 source3/libsmb/clifile.c            | 108 ++++++++++++++++++++++++++++++++---
 source3/libsmb/clirap.c             |  70 +++--------------------
 source3/libsmb/clirap.h             |  19 +++++--
 source3/libsmb/clisecdesc.c         |  20 +++----
 source3/libsmb/pylibsmb.c           | 109 ++++++++++++++++++++++++++++++++++++
 source3/modules/util_reparse.c      |  54 +++++++++---------
 source3/modules/util_reparse.h      |   2 +
 source3/smbd/smb1_reply.c           |   5 +-
 source3/smbd/smb2_create.c          |   3 +
 source3/smbd/smb2_reply.c           |  36 ++++++------
 source3/smbd/smb2_trans2.c          |  55 ++++++++++++------
 source3/torture/test_smb2.c         |  29 +++++-----
 source3/torture/torture.c           |  13 +++--
 17 files changed, 421 insertions(+), 172 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/auth/tests/test_schannel.c b/libcli/auth/tests/test_schannel.c
index b1c88fdf667..e249ff00751 100644
--- a/libcli/auth/tests/test_schannel.c
+++ b/libcli/auth/tests/test_schannel.c
@@ -167,7 +167,7 @@ static void torture_schannel_seal_rc4(void **state)
 	int buffer_sizes[] = {
 		0, 1, 3, 7, 8, 9, 15, 16, 17
 	};
-	int i;
+	size_t i;
 
 	torture_schannel_seal_flags(state, 0,
 				    session_key,
@@ -259,7 +259,7 @@ static void torture_schannel_seal_aes(void **state)
 	int buffer_sizes[] = {
 		0, 1, 3, 7, 8, 9, 15, 16, 17
 	};
-	int i;
+	size_t i;
 
 	torture_schannel_seal_flags(state, NETLOGON_NEG_SUPPORTS_AES,
 				    session_key,
diff --git a/python/samba/tests/reparsepoints.py b/python/samba/tests/reparsepoints.py
index 96ca6eefdd5..1f74c61bc64 100644
--- a/python/samba/tests/reparsepoints.py
+++ b/python/samba/tests/reparsepoints.py
@@ -118,6 +118,30 @@ class ReparsePoints(samba.tests.libsmb.LibsmbTests):
         self.assertEqual(e.exception.args[0],
                          ntstatus.NT_STATUS_IO_REPARSE_TAG_MISMATCH)
 
+    def test_query_reparse_tag(self):
+        conn = self.connection()
+        filename = 'reparse'
+        self.clean_file(conn, filename)
+
+        fd = conn.create(
+            filename,
+            DesiredAccess=sec.SEC_FILE_READ_ATTRIBUTE |
+                sec.SEC_FILE_WRITE_ATTRIBUTE |
+                sec.SEC_STD_DELETE,
+            CreateDisposition=libsmb.FILE_CREATE)
+
+        conn.delete_on_close(fd, 1)
+
+        info = conn.qfileinfo(fd, libsmb.FSCC_FILE_ATTRIBUTE_TAG_INFORMATION);
+        self.assertEqual(info['tag'], 0)
+
+        b = reparse_symlink.put(0x80000026, 0, b'asdf')
+        conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0)
+
+        info = conn.qfileinfo(fd, libsmb.FSCC_FILE_ATTRIBUTE_TAG_INFORMATION);
+        self.assertEqual(info['tag'], 0x80000026)
+
+
     # Show that we can write to a reparse point when opened properly
     def test_write_reparse(self):
         conn = self.connection()
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index 1962852349c..66aa98b5aa9 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -23,6 +23,7 @@ from samba.common import get_string
 from samba.dcerpc import smb3posix
 from samba.ndr import ndr_unpack
 from samba.dcerpc.security import dom_sid
+from samba import reparse_symlink
 import os
 import subprocess
 
@@ -391,6 +392,46 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
             self.delete_test_file(c, '\\test_create_context_basic1_file')
             self.delete_test_file(c, '\\test_create_context_basic1_dir')
 
+    def test_create_context_reparse(self):
+        """
+        Check reparse tag in posix create context response
+        """
+        try:
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            tag = 0x80000025
+
+            f,_,cc_out = c.create_ex('\\reparse',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_CREATE,
+                                     CreateContexts=[posix_context(0o600)])
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+            self.assertEqual(cc.reparse_tag, libsmb.IO_REPARSE_TAG_RESERVED_ZERO)
+
+            b = reparse_symlink.put(tag, 0, b'asdf')
+            c.fsctl(f, libsmb.FSCTL_SET_REPARSE_POINT, b, 0)
+
+            c.close(f)
+
+            f,_,cc_out = c.create_ex('\\reparse',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_OPEN,
+                                     CreateContexts=[posix_context(0o600)])
+            c.close(f)
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+            self.assertEqual(cc.reparse_tag, tag)
+
+        finally:
+            self.delete_test_file(c, '\\reparse')
+
     def test_delete_on_close(self):
         """
         Test two opens with delete-on-close:
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 08d95cf3579..cea27444b97 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1923,6 +1923,7 @@ NTSTATUS cli_smb2_query_info_fnum_recv(
 		.data = talloc_move(mem_ctx, &state->outbuf.data),
 		.length = state->outbuf.length,
 	};
+	tevent_req_received(req);
 	return NT_STATUS_OK;
 }
 
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 1ff3973bb39..354d8960dd8 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -6961,24 +6961,84 @@ struct cli_qfileinfo_state {
 	uint32_t num_rdata;
 };
 
+static void cli_qfileinfo_done2(struct tevent_req *subreq);
 static void cli_qfileinfo_done(struct tevent_req *subreq);
 
 struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx,
 				      struct tevent_context *ev,
-				      struct cli_state *cli, uint16_t fnum,
-				      uint16_t level, uint32_t min_rdata,
+				      struct cli_state *cli,
+				      uint16_t fnum,
+				      uint16_t fscc_level,
+				      uint32_t min_rdata,
 				      uint32_t max_rdata)
 {
 	struct tevent_req *req, *subreq;
 	struct cli_qfileinfo_state *state;
+	uint16_t smb_level;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_qfileinfo_state);
 	if (req == NULL) {
 		return NULL;
 	}
+
+	if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+		max_rdata = MIN(max_rdata,
+				smb2cli_conn_max_trans_size(cli->conn));
+
+		subreq = cli_smb2_query_info_fnum_send(
+			state,		  /* mem_ctx */
+			ev,		  /* ev */
+			cli,		  /* cli */
+			fnum,		  /* fnum */
+			SMB2_0_INFO_FILE, /* in_info_type */
+			fscc_level,	  /* in_file_info_class */
+			max_rdata,	  /* in_max_output_length */
+			NULL,		  /* in_input_buffer */
+			0,		  /* in_additional_info */
+			0);		  /* in_flags */
+		if (tevent_req_nomem(subreq, req)) {
+			return tevent_req_post(req, ev);
+		}
+		tevent_req_set_callback(subreq, cli_qfileinfo_done2, req);
+		return req;
+	}
+
+	max_rdata = MIN(max_rdata, UINT16_MAX);
+
+	switch (fscc_level) {
+	case FSCC_FILE_BASIC_INFORMATION:
+		smb_level = SMB_QUERY_FILE_BASIC_INFO;
+		break;
+	case FSCC_FILE_STANDARD_INFORMATION:
+		smb_level = SMB_QUERY_FILE_STANDARD_INFO;
+		break;
+	case FSCC_FILE_EA_INFORMATION:
+		smb_level = SMB_QUERY_FILE_EA_INFO;
+		break;
+	case FSCC_FILE_NAME_INFORMATION:
+		smb_level = SMB_QUERY_FILE_NAME_INFO;
+		break;
+	case FSCC_FILE_ALL_INFORMATION:
+		smb_level = SMB_QUERY_FILE_ALL_INFO;
+		break;
+	case FSCC_FILE_ALTERNATE_NAME_INFORMATION:
+		smb_level = SMB_QUERY_FILE_ALT_NAME_INFO;
+		break;
+	case FSCC_FILE_STREAM_INFORMATION:
+		smb_level = SMB_QUERY_FILE_STREAM_INFO;
+		break;
+	case FSCC_FILE_COMPRESSION_INFORMATION:
+		smb_level = SMB_QUERY_COMPRESSION_INFO;
+		break;
+	default:
+		/* Probably wrong, but the server will tell us */
+		smb_level = fscc_level;
+		break;
+	}
+
 	state->min_rdata = min_rdata;
 	SSVAL(state->param, 0, fnum);
-	SSVAL(state->param, 2, level);
+	SSVAL(state->param, 2, smb_level);
 	SSVAL(state->setup, 0, TRANSACT2_QFILEINFO);
 
 	subreq = cli_trans_send(
@@ -7008,6 +7068,31 @@ struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx,
 	return req;
 }
 
+static void cli_qfileinfo_done2(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(subreq,
+							  struct tevent_req);
+	struct cli_qfileinfo_state *state = tevent_req_data(
+		req, struct cli_qfileinfo_state);
+	DATA_BLOB outbuf = {};
+	NTSTATUS status;
+
+	status = cli_smb2_query_info_fnum_recv(subreq, state, &outbuf);
+	TALLOC_FREE(subreq);
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	if (outbuf.length < state->min_rdata) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+		return;
+	}
+
+	state->rdata = outbuf.data;
+	state->num_rdata = outbuf.length;
+	tevent_req_done(req);
+}
+
 static void cli_qfileinfo_done(struct tevent_req *subreq)
 {
 	struct tevent_req *req = tevent_req_callback_data(
@@ -7054,10 +7139,15 @@ NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
 	return NT_STATUS_OK;
 }
 
-NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
-		       uint16_t fnum, uint16_t level, uint32_t min_rdata,
-		       uint32_t max_rdata, uint16_t *recv_flags2,
-		       uint8_t **rdata, uint32_t *num_rdata)
+NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx,
+		       struct cli_state *cli,
+		       uint16_t fnum,
+		       uint16_t fscc_level,
+		       uint32_t min_rdata,
+		       uint32_t max_rdata,
+		       uint16_t *recv_flags2,
+		       uint8_t **rdata,
+		       uint32_t *num_rdata)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct tevent_context *ev;
@@ -7075,8 +7165,8 @@ NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
 	if (ev == NULL) {
 		goto fail;
 	}
-	req = cli_qfileinfo_send(frame, ev, cli, fnum, level, min_rdata,
-				 max_rdata);
+	req = cli_qfileinfo_send(
+		frame, ev, cli, fnum, fscc_level, min_rdata, max_rdata);
 	if (req == NULL) {
 		goto fail;
 	}
diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c
index 21ee346e0aa..9897b5a3072 100644
--- a/source3/libsmb/clirap.c
+++ b/source3/libsmb/clirap.c
@@ -1307,7 +1307,6 @@ struct cli_qfileinfo_basic_state {
 
 static void cli_qfileinfo_basic_done(struct tevent_req *subreq);
 static void cli_qfileinfo_basic_doneE(struct tevent_req *subreq);
-static void cli_qfileinfo_basic_done2(struct tevent_req *subreq);
 
 struct tevent_req *cli_qfileinfo_basic_send(
 	TALLOC_CTX *mem_ctx,
@@ -1349,34 +1348,13 @@ struct tevent_req *cli_qfileinfo_basic_send(
 		return req;
 	}
 
-	if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
-		subreq = cli_smb2_query_info_fnum_send(
-			state,	/* mem_ctx */
-			ev,	/* ev */
-			cli,	/* cli */
-			fnum,	/* fnum */
-			1,	/* in_info_type */
-			(SMB_FILE_ALL_INFORMATION - 1000), /* in_file_info_class */
-			0xFFFF, /* in_max_output_length */
-			NULL,	/* in_input_buffer */
-			0,	/* in_additional_info */
-			0);	/* in_flags */
-		if (tevent_req_nomem(subreq, req)) {
-			return tevent_req_post(req, ev);
-		}
-		tevent_req_set_callback(
-			subreq, cli_qfileinfo_basic_done2, req);
-		return req;
-	}
-
-	subreq = cli_qfileinfo_send(
-		state,
-		ev,
-		cli,
-		fnum,
-		SMB_QUERY_FILE_ALL_INFO, /* level */
-		68,			 /* min_rdata */
-		CLI_BUFFER_SIZE);	 /* max_rdata */
+	subreq = cli_qfileinfo_send(state,
+				    ev,
+				    cli,
+				    fnum,
+				    FSCC_FILE_ALL_INFORMATION, /* level */
+				    68,			       /* min_rdata */
+				    CLI_BUFFER_SIZE);	       /* max_rdata */
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1435,40 +1413,6 @@ static void cli_qfileinfo_basic_doneE(struct tevent_req *subreq)
 	tevent_req_done(req);
 }
 
-static void cli_qfileinfo_basic_done2(struct tevent_req *subreq)
-{
-	struct tevent_req *req = tevent_req_callback_data(
-		subreq, struct tevent_req);
-	struct cli_qfileinfo_basic_state *state = tevent_req_data(
-		req, struct cli_qfileinfo_basic_state);
-	DATA_BLOB outbuf = {0};
-	NTSTATUS status;
-
-	status = cli_smb2_query_info_fnum_recv(subreq, state, &outbuf);
-	TALLOC_FREE(subreq);
-	if (tevent_req_nterror(req, status)) {
-		return;
-	}
-
-	/* Parse the reply. */
-	if (outbuf.length < 0x60) {
-		tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
-		return;
-	}
-
-	state->create_time = interpret_long_date(BVAL(outbuf.data, 0x0));
-	state->access_time = interpret_long_date(BVAL(outbuf.data, 0x8));
-	state->write_time = interpret_long_date(BVAL(outbuf.data, 0x10));
-	state->change_time = interpret_long_date(BVAL(outbuf.data, 0x18));
-	state->attr = IVAL(outbuf.data, 0x20);
-	state->size = BVAL(outbuf.data, 0x30);
-	state->ino = BVAL(outbuf.data, 0x40);
-
-	data_blob_free(&outbuf);
-
-	tevent_req_done(req);
-}
-
 NTSTATUS cli_qfileinfo_basic_recv(
 	struct tevent_req *req,
 	uint32_t *attr,
diff --git a/source3/libsmb/clirap.h b/source3/libsmb/clirap.h
index 4dc0441cc5b..5181ef22290 100644
--- a/source3/libsmb/clirap.h
+++ b/source3/libsmb/clirap.h
@@ -162,16 +162,23 @@ NTSTATUS cli_qpathinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
 
 struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx,
 				      struct tevent_context *ev,
-				      struct cli_state *cli, uint16_t fnum,
-				      uint16_t level, uint32_t min_rdata,
+				      struct cli_state *cli,
+				      uint16_t fnum,
+				      uint16_t fscc_level,
+				      uint32_t min_rdata,
 				      uint32_t max_rdata);
 NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
 			    uint16_t *recv_flags2,
 			    uint8_t **rdata, uint32_t *num_rdata);
-NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
-		       uint16_t fnum, uint16_t level, uint32_t min_rdata,
-		       uint32_t max_rdata, uint16_t *recv_flags2,
-		       uint8_t **rdata, uint32_t *num_rdata);
+NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx,
+		       struct cli_state *cli,
+		       uint16_t fnum,
+		       uint16_t fscc_level,
+		       uint32_t min_rdata,
+		       uint32_t max_rdata,
+		       uint16_t *recv_flags2,
+		       uint8_t **rdata,
+		       uint32_t *num_rdata);
 
 struct tevent_req *cli_flush_send(TALLOC_CTX *mem_ctx,
 				  struct tevent_context *ev,
diff --git a/source3/libsmb/clisecdesc.c b/source3/libsmb/clisecdesc.c
index d6a266191ab..e42ca7bc592 100644
--- a/source3/libsmb/clisecdesc.c
+++ b/source3/libsmb/clisecdesc.c
@@ -49,16 +49,16 @@ struct tevent_req *cli_query_security_descriptor_send(
 
 	if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
 		subreq = cli_smb2_query_info_fnum_send(
-			state,		/* mem_ctx */
-			ev,		/* ev */
-			cli,		/* cli */
-			fnum,		/* fnum */
-			3,		/* in_info_type */
-			0,		/* in_info_class */
-			0xFFFF,		/* in_max_output_length */
-			NULL,		/* in_input_buffer */
-			sec_info,	/* in_additional_info */
-			0);		/* in_flags */
+			state,		      /* mem_ctx */
+			ev,		      /* ev */
+			cli,		      /* cli */
+			fnum,		      /* fnum */
+			SMB2_0_INFO_SECURITY, /* in_info_type */
+			0,		      /* in_info_class */
+			0xFFFF,		      /* in_max_output_length */
+			NULL,		      /* in_input_buffer */
+			sec_info,	      /* in_additional_info */
+			0);		      /* in_flags */
 		if (tevent_req_nomem(subreq, req)) {
 			return tevent_req_post(req, ev);
 		}
diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
index 767187913f6..091cfee76bd 100644
--- a/source3/libsmb/pylibsmb.c
+++ b/source3/libsmb/pylibsmb.c
@@ -1263,6 +1263,61 @@ static PyObject *py_cli_close(struct py_cli_state *self, PyObject *args)
 	Py_RETURN_NONE;
 }
 
+static PyObject *py_cli_qfileinfo(struct py_cli_state *self, PyObject *args)
+{
+	struct tevent_req *req = NULL;
+	int fnum, level;
+	uint16_t recv_flags2;
+	uint8_t *rdata = NULL;
+	uint32_t num_rdata;
+	PyObject *result = NULL;
+	NTSTATUS status;
+
+	if (!PyArg_ParseTuple(args, "ii", &fnum, &level)) {
+		return NULL;
+	}
+
+	req = cli_qfileinfo_send(
+		NULL, self->ev, self->cli, fnum, level, 0, UINT32_MAX);
+	if (!py_tevent_req_wait_exc(self, req)) {
+		return NULL;
+	}
+	status = cli_qfileinfo_recv(
+		req, NULL, &recv_flags2, &rdata, &num_rdata);
+	TALLOC_FREE(req);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		return NULL;
+	}
+
+	switch (level) {
+	case FSCC_FILE_ATTRIBUTE_TAG_INFORMATION: {
+		uint32_t mode = PULL_LE_U32(rdata, 0);
+		uint32_t tag = PULL_LE_U32(rdata, 4);
+
+		if (num_rdata != 8) {
+			PyErr_SetNTSTATUS(NT_STATUS_INVALID_NETWORK_RESPONSE);
+			return NULL;
+		}
+
+		result = Py_BuildValue("{s:K,s:K}",
+				       "mode",
+				       (unsigned long long)mode,
+				       "tag",
+				       (unsigned long long)tag);
+		break;
+	}
+	default:
+		result = PyBytes_FromStringAndSize((char *)rdata, num_rdata);
+		break;
+	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list