From c34b86a34e8ead6d52994b9b5b32f5553a8f90fd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 9 Mar 2021 23:49:19 +0100 Subject: [PATCH] libcli/smb: pass smb3_capabilities to smbXcli_conn_create() Passing NULL means use none. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14512 Signed-off-by: Stefan Metzmacher Reviewed-by: Jeremy Allison --- libcli/smb/smbXcli_base.c | 7 ++++++- libcli/smb/smbXcli_base.h | 4 +++- source3/libsmb/clientgen.c | 5 ++++- source3/torture/torture.c | 2 +- source4/libcli/raw/clitransport.c | 3 ++- source4/libcli/smb2/transport.c | 3 ++- source4/libcli/smb_composite/connect_nego.c | 3 ++- 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index 01a8e921156..8fa54d02ca9 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -115,6 +115,7 @@ struct smbXcli_conn { uint32_t capabilities; uint16_t security_mode; struct GUID guid; + struct smb311_capabilities smb3_capabilities; } client; struct { @@ -326,7 +327,8 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, enum smb_signing_setting signing_state, uint32_t smb1_capabilities, struct GUID *client_guid, - uint32_t smb2_capabilities) + uint32_t smb2_capabilities, + const struct smb311_capabilities *smb3_capabilities) { struct smbXcli_conn *conn = NULL; void *ss = NULL; @@ -429,6 +431,9 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, conn->smb2.client.guid = *client_guid; } conn->smb2.client.capabilities = smb2_capabilities; + if (smb3_capabilities != NULL) { + conn->smb2.client.smb3_capabilities = *smb3_capabilities; + } conn->smb2.cur_credits = 1; conn->smb2.max_credits = 0; diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index d9c3175bdf5..9a8c7272f91 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -31,6 +31,7 @@ struct GUID; struct iovec; struct smb2_create_blobs; struct smb_create_returns; +struct smb311_capabilities; struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, int fd, @@ -38,7 +39,8 @@ struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, enum smb_signing_setting signing_state, uint32_t smb1_capabilities, struct GUID *client_guid, - uint32_t smb2_capabilities); + uint32_t smb2_capabilities, + const struct smb311_capabilities *smb3_capabilities); bool smbXcli_conn_is_connected(struct smbXcli_conn *conn); void smbXcli_conn_disconnect(struct smbXcli_conn *conn, NTSTATUS status); diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index e86f52dac0d..2ab661b2c79 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -25,6 +25,7 @@ #include "../libcli/smb/smb_seal.h" #include "async_smb.h" #include "../libcli/smb/smbXcli_base.h" +#include "../libcli/smb/smb2_negotiate_context.h" #include "../librpc/ndr/libndr.h" #include "../include/client.h" @@ -69,6 +70,7 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx, bool use_level_II_oplocks = false; uint32_t smb1_capabilities = 0; uint32_t smb2_capabilities = 0; + struct smb311_capabilities smb3_capabilities = { }; struct GUID client_guid; if (!GUID_all_zero(&cli_state_client_guid)) { @@ -179,7 +181,8 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx, signing_state, smb1_capabilities, &client_guid, - smb2_capabilities); + smb2_capabilities, + &smb3_capabilities); if (cli->conn == NULL) { goto error; } diff --git a/source3/torture/torture.c b/source3/torture/torture.c index d1ea9b85a72..add58414f33 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -14572,7 +14572,7 @@ static bool run_ign_bad_negprot(int dummy) } conn = smbXcli_conn_create(talloc_tos(), fd, host, SMB_SIGNING_OFF, 0, - NULL, 0); + NULL, 0, NULL); if (conn == NULL) { d_fprintf(stderr, "smbXcli_conn_create failed\n"); return false; diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c index 26e9dee401d..573e98aecf0 100644 --- a/source4/libcli/raw/clitransport.c +++ b/source4/libcli/raw/clitransport.c @@ -99,7 +99,8 @@ struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock, options->signing, smb1_capabilities, NULL, /* client_guid */ - 0); /* smb2_capabilities */ + 0, /* smb2_capabilities */ + NULL); /* smb3_ciphers */ if (transport->conn == NULL) { TALLOC_FREE(sock); TALLOC_FREE(transport); diff --git a/source4/libcli/smb2/transport.c b/source4/libcli/smb2/transport.c index cb626d86215..292ca0f4afd 100644 --- a/source4/libcli/smb2/transport.c +++ b/source4/libcli/smb2/transport.c @@ -72,7 +72,8 @@ struct smb2_transport *smb2_transport_init(struct smbcli_socket *sock, options->signing, 0, /* smb1_capabilities */ &options->client_guid, - options->smb2_capabilities); + options->smb2_capabilities, + &options->smb3_capabilities); if (transport->conn == NULL) { talloc_free(transport); return NULL; diff --git a/source4/libcli/smb_composite/connect_nego.c b/source4/libcli/smb_composite/connect_nego.c index 39fef7f8f27..3bd5dbc59e8 100644 --- a/source4/libcli/smb_composite/connect_nego.c +++ b/source4/libcli/smb_composite/connect_nego.c @@ -153,7 +153,8 @@ static void smb_connect_nego_connect_done(struct composite_context *creq) state->options.signing, smb1_capabilities, &state->options.client_guid, - state->options.smb2_capabilities); + state->options.smb2_capabilities, + &state->options.smb3_capabilities); if (tevent_req_nomem(state->conn, req)) { return; } -- 2.47.3