[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Mon May 2 20:14:01 UTC 2022
The branch, master has been updated
via 54c6cf8666b libcli/smb: allow SMB2 Negotiate responses with security_offset = 0 and security_length = 0
via 8ca99c25bac lib/util: data_blob_append() should not fail if both parts have length=0
via bc22d5ebf92 lib/util: add tests for data_blob_append() with the resulting blob length=0
via 7e2cc5eda84 s4/dsdb/repl_meta_data: Receive function arguments in correct order
via 03894de3abb rpc_server/lsa: Match Windows security descriptor
via 1808e5c1334 smbd: optimize and streamline smbd_smb2_close()
via 4c7921e54d8 smbd: pass fsp as pointer-pointer to smbd_smb2_close()
via f661ef67ba2 smbd: add fstat_before_close fsp flag and logic
from 1dfa193232c s3:winbind: Remove unused functions
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 54c6cf8666b073818301d3a71a37453b44e57b5c
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 26 10:38:15 2022 +0200
libcli/smb: allow SMB2 Negotiate responses with security_offset = 0 and security_length = 0
This fixes connections against the Azure SMB3 server.
It's not possible to demonstrate the bug with a test and a knownfail
entry, because it fails to even startup the test environments,
but the following change to our server demonstrates the problem
and shows the fix works:
diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c
index da567951c0bf..25fdaea2df7b 100644
--- a/source3/smbd/smb2_negprot.c
+++ b/source3/smbd/smb2_negprot.c
@@ -711,6 +711,8 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
}
}
+ security_buffer = data_blob_null;
+
if (out_negotiate_context_blob.length != 0) {
static const uint8_t zeros[8];
size_t pad = 0;
@@ -759,6 +761,8 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
}
+ security_offset = 0;
+
SSVAL(outbody.data, 0x00, 0x40 + 1); /* struct size */
SSVAL(outbody.data, 0x02,
security_mode); /* security mode */
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15050
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Mon May 2 20:13:10 UTC 2022 on sn-devel-184
commit 8ca99c25bacb6d9b0e6e064b37d6b726d181a487
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Apr 28 16:08:42 2022 +0200
lib/util: data_blob_append() should not fail if both parts have length=0
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15050
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit bc22d5ebf928499e8f0b9540721e9a62db029195
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Apr 28 16:08:28 2022 +0200
lib/util: add tests for data_blob_append() with the resulting blob length=0
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15050
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7e2cc5eda84cc9fc7395b86e0908e88c72a320dc
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Wed Feb 16 12:10:19 2022 +1300
s4/dsdb/repl_meta_data: Receive function arguments in correct order
The incorrect ordering was introduced in commit
b9c5417b523c4c53cb275c12ec84bbc849705bec.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15007
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 03894de3abb02045a10886ba40f94bf9a4d8a530
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date: Tue Mar 29 10:03:55 2022 +1300
rpc_server/lsa: Match Windows security descriptor
Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1808e5c133474eabc9d3cf91c2a92ec4d92d9fdd
Author: Ralph Boehme <slow at samba.org>
Date: Mon May 2 16:29:49 2022 +0200
smbd: optimize and streamline smbd_smb2_close()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4c7921e54d835b3e3aae0526d9c6170bf7a92d8c
Author: Ralph Boehme <slow at samba.org>
Date: Fri Apr 1 12:19:34 2022 +0200
smbd: pass fsp as pointer-pointer to smbd_smb2_close()
Prepares for NULLing state->in_fsp in the next commit.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit f661ef67ba2f99572d89a14bf5af5f0d48255788
Author: Ralph Boehme <slow at samba.org>
Date: Fri Apr 29 18:55:31 2022 +0200
smbd: add fstat_before_close fsp flag and logic
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
lib/util/data_blob.c | 5 ++
lib/util/tests/data_blob.c | 26 +++++++++
libcli/smb/smbXcli_base.c | 15 +++++
source3/include/vfs.h | 2 +
source3/smbd/open.c | 8 +++
source3/smbd/smb2_close.c | 75 ++++++-------------------
source4/dsdb/samdb/ldb_modules/repl_meta_data.c | 2 +-
source4/rpc_server/lsa/lsa_init.c | 7 ++-
8 files changed, 77 insertions(+), 63 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/util/data_blob.c b/lib/util/data_blob.c
index 77b077f7ef9..da1730dccf5 100644
--- a/lib/util/data_blob.c
+++ b/lib/util/data_blob.c
@@ -229,6 +229,11 @@ _PUBLIC_ bool data_blob_append(TALLOC_CTX *mem_ctx, DATA_BLOB *blob,
{
size_t old_len = blob->length;
size_t new_len = old_len + length;
+
+ if (length == 0) {
+ return true;
+ }
+
if (new_len < length || new_len < old_len) {
return false;
}
diff --git a/lib/util/tests/data_blob.c b/lib/util/tests/data_blob.c
index d2999aba1e0..a3b2db6e604 100644
--- a/lib/util/tests/data_blob.c
+++ b/lib/util/tests/data_blob.c
@@ -84,6 +84,30 @@ static bool test_hex_string(struct torture_context *tctx)
return true;
}
+static bool test_append_NULL_0(struct torture_context *tctx)
+{
+ DATA_BLOB z = data_blob_talloc_zero(tctx, 0);
+ torture_assert_int_equal(tctx, z.length, 0, "length");
+ torture_assert(tctx, z.data == NULL, "data");
+ torture_assert(tctx, data_blob_append(NULL, &z, NULL, 0), "append NULL,0");
+ torture_assert(tctx, data_blob_append(NULL, &z, "", 0), "append '',0");
+ torture_assert_int_equal(tctx, z.length, 0, "length");
+ torture_assert(tctx, z.data == NULL, "data");
+ return true;
+}
+
+static bool test_append_empty_0(struct torture_context *tctx)
+{
+ DATA_BLOB e = data_blob_talloc(tctx, "", 0);
+ torture_assert_int_equal(tctx, e.length, 0, "length");
+ torture_assert(tctx, e.data != NULL, "data");
+ torture_assert(tctx, data_blob_append(NULL, &e, NULL, 0), "append NULL,0");
+ torture_assert(tctx, data_blob_append(NULL, &e, "", 0), "append '',0");
+ torture_assert_int_equal(tctx, e.length, 0, "length");
+ torture_assert(tctx, e.data != NULL, "data");
+ return true;
+}
+
struct torture_suite *torture_local_util_data_blob(TALLOC_CTX *mem_ctx)
{
struct torture_suite *suite = torture_suite_create(mem_ctx, "datablob");
@@ -94,6 +118,8 @@ struct torture_suite *torture_local_util_data_blob(TALLOC_CTX *mem_ctx)
torture_suite_add_simple_test(suite, "clear", test_clear);
torture_suite_add_simple_test(suite, "cmp", test_cmp);
torture_suite_add_simple_test(suite, "hex string", test_hex_string);
+ torture_suite_add_simple_test(suite, "append_NULL_0", test_append_NULL_0);
+ torture_suite_add_simple_test(suite, "append_empty_0", test_append_empty_0);
return suite;
}
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 0f3e4fa3f90..57d39d60fca 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -5083,6 +5083,21 @@ static void smbXcli_negprot_smb2_done(struct tevent_req *subreq)
security_offset = SVAL(body, 56);
security_length = SVAL(body, 58);
+ if (security_offset == 0) {
+ /*
+ * Azure sends security_offset = 0 and security_length = 0
+ *
+ * We just set security_offset to the expected value
+ * in order to allow the further logic to work
+ * as before.
+ */
+ if (security_length != 0) {
+ tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+ return;
+ }
+ security_offset = SMB2_HDR_BODY + iov[1].iov_len;
+ }
+
if (security_offset != SMB2_HDR_BODY + iov[1].iov_len) {
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
return;
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 841a930d309..ac6a3017f80 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -372,6 +372,7 @@
* Version 47 - Add SMB_VFS_GET_REAL_FILENAME_AT
* Version 47 - Replace SMB_VFS_GET_REAL_FILENAME with SMB_VFS_GET_REAL_FILENAME_AT
* Version 47 - Re-add dirfsp to CREATE_FILE
+ * Version 47 - Add fsp flag fstat_before_close
*/
#define SMB_VFS_INTERFACE_VERSION 47
@@ -445,6 +446,7 @@ typedef struct files_struct {
bool closing : 1;
bool lock_failure_seen : 1;
bool encryption_required : 1;
+ bool fstat_before_close : 1;
} fsp_flags;
struct tevent_timer *update_write_time_event;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index bee6cab6d42..8cb349d78b0 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -974,12 +974,20 @@ NTSTATUS fd_openat(const struct files_struct *dirfsp,
NTSTATUS fd_close(files_struct *fsp)
{
+ NTSTATUS status;
int ret;
if (fsp == fsp->conn->cwd_fsp) {
return NT_STATUS_OK;
}
+ if (fsp->fsp_flags.fstat_before_close) {
+ status = vfs_stat_fsp(fsp);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ }
+
if (fsp->dptr) {
dptr_CloseDir(fsp);
}
diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index b434d696c3f..cb494a3a4d9 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -159,24 +159,9 @@ static void setup_close_full_information(connection_struct *conn,
struct timespec *out_change_ts,
uint16_t *out_flags,
uint64_t *out_allocation_size,
- uint64_t *out_end_of_file,
- uint32_t *out_file_attributes)
+ uint64_t *out_end_of_file)
{
- NTSTATUS status;
-
- status = openat_pathref_fsp(conn->cwd_fsp, smb_fname);
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
- (smb_fname->flags & SMB_FILENAME_POSIX_PATH) &&
- S_ISLNK(smb_fname->st.st_ex_mode))
- {
- status = NT_STATUS_OK;
- }
- if (!NT_STATUS_IS_OK(status)) {
- return;
- }
-
*out_flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
- *out_file_attributes = fdos_mode(smb_fname->fsp);
*out_last_write_ts = smb_fname->st.st_ex_mtime;
*out_last_access_ts = smb_fname->st.st_ex_atime;
*out_creation_ts = get_create_timespec(conn, NULL, smb_fname);
@@ -188,7 +173,7 @@ static void setup_close_full_information(connection_struct *conn,
dos_filetime_timespec(out_last_access_ts);
dos_filetime_timespec(out_change_ts);
}
- if (!(*out_file_attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ if (!S_ISDIR(smb_fname->st.st_ex_mode)) {
*out_end_of_file = get_file_size_stat(&smb_fname->st);
}
@@ -196,7 +181,7 @@ static void setup_close_full_information(connection_struct *conn,
}
static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
- struct files_struct *fsp,
+ struct files_struct **_fsp,
uint16_t in_flags,
uint16_t *out_flags,
struct timespec *out_creation_ts,
@@ -210,11 +195,8 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
NTSTATUS status;
struct smb_request *smbreq;
connection_struct *conn = req->tcon->compat;
+ struct files_struct *fsp = *_fsp;
struct smb_filename *smb_fname = NULL;
- uint64_t allocation_size = 0;
- uint64_t file_size = 0;
- uint32_t dos_attrs = 0;
- uint16_t flags = 0;
*out_creation_ts = (struct timespec){0, SAMBA_UTIME_OMIT};
*out_last_access_ts = (struct timespec){0, SAMBA_UTIME_OMIT};
@@ -234,33 +216,12 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
return NT_STATUS_NO_MEMORY;
}
- smb_fname = cp_smb_filename(talloc_tos(), fsp->fsp_name);
- if (smb_fname == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- if ((in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) &&
- (fsp->fsp_flags.initial_delete_on_close ||
- fsp->fsp_flags.delete_on_close))
- {
- /*
- * We might be deleting the file. Ensure we
- * return valid data from before the file got
- * removed.
- */
- setup_close_full_information(conn,
- smb_fname,
- out_creation_ts,
- out_last_access_ts,
- out_last_write_ts,
- out_change_ts,
- &flags,
- &allocation_size,
- &file_size,
- &dos_attrs);
+ if (in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) {
+ *out_file_attributes = fdos_mode(fsp);
+ fsp->fsp_flags.fstat_before_close = true;
}
- status = close_file_free(smbreq, &fsp, NORMAL_CLOSE);
+ status = close_file_smb(smbreq, fsp, NORMAL_CLOSE);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",
smb_fname_str_dbg(smb_fname), nt_errstr(status)));
@@ -269,22 +230,18 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
if (in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) {
setup_close_full_information(conn,
- smb_fname,
+ fsp->fsp_name,
out_creation_ts,
out_last_access_ts,
out_last_write_ts,
out_change_ts,
- &flags,
- &allocation_size,
- &file_size,
- &dos_attrs);
+ out_flags,
+ out_allocation_size,
+ out_end_of_file);
}
- *out_flags = flags;
- *out_allocation_size = allocation_size;
- *out_end_of_file = file_size;
- *out_file_attributes = dos_attrs;
-
+ file_free(smbreq, fsp);
+ *_fsp = fsp = NULL;
return NT_STATUS_OK;
}
@@ -376,7 +333,7 @@ static struct tevent_req *smbd_smb2_close_send(TALLOC_CTX *mem_ctx,
}
status = smbd_smb2_close(smb2req,
- state->in_fsp,
+ &state->in_fsp,
state->in_flags,
&state->out_flags,
&state->out_creation_ts,
@@ -406,7 +363,7 @@ static void smbd_smb2_close_wait_done(struct tevent_req *subreq)
TALLOC_FREE(subreq);
status = smbd_smb2_close(state->smb2req,
- state->in_fsp,
+ &state->in_fsp,
state->in_flags,
&state->out_flags,
&state->out_creation_ts,
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 1aef120a123..4949e691a86 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -8152,8 +8152,8 @@ static int replmd_process_linked_attribute(struct ldb_module *module,
const struct dsdb_attribute *attr,
struct la_entry *la_entry,
struct ldb_request *parent,
- struct ldb_message_element *old_el,
TALLOC_CTX *element_ctx,
+ struct ldb_message_element *old_el,
struct parsed_dn *pdn_list,
replmd_link_changed *change)
{
diff --git a/source4/rpc_server/lsa/lsa_init.c b/source4/rpc_server/lsa/lsa_init.c
index cd4a1569aea..689634b9706 100644
--- a/source4/rpc_server/lsa/lsa_init.c
+++ b/source4/rpc_server/lsa/lsa_init.c
@@ -30,13 +30,14 @@
"O:BAG:SY" \
"D:" \
"(D;;0x00000800;;;AN)" \
- "(A;;GA;;;BA)" \
- "(A;;GX;;;WD)" \
+ "(A;;0x000f1fff;;;BA)" \
+ "(A;;0x00020801;;;WD)" \
"(A;;0x00000801;;;AN)" \
"(A;;0x00001000;;;LS)" \
"(A;;0x00001000;;;NS)" \
"(A;;0x00001000;;;S-1-5-17)" \
- "(A;;0x00000801;;;S-1-15-2-1)"
+ "(A;;0x00000801;;;AC)" \
+ "(A;;0x00000801;;;S-1-15-2-2)"
static const struct generic_mapping dcesrv_lsa_policy_mapping = {
LSA_POLICY_READ,
--
Samba Shared Repository
More information about the samba-cvs
mailing list