[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