From: Stefan Metzmacher Date: Wed, 15 Mar 2017 17:04:44 +0000 (+0000) Subject: cli_state_update_after_negprot source3/libsmb/cliconnect.c server_os... X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=4ae5baf931fa92e16f3658523ee50393b09622ee cli_state_update_after_negprot source3/libsmb/cliconnect.c server_os... --- diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 04d689cd9cb4..1d2a6b5fed6b 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -379,6 +379,59 @@ NTSTATUS cli_session_creds_prepare_krb5(struct cli_state *cli, return NT_STATUS_OK; } +NTSTATUS cli_state_update_after_negprot(struct cli_state *cli) +{ + static const struct { + enum protocol_types proto; + const char *name; + } protos[] = { + {PROTOCOL_SMB3_11, "SMB3_11"}, + {PROTOCOL_SMB3_10, "SMB3_10"}, + {PROTOCOL_SMB3_02, "SMB3_02"}, + {PROTOCOL_SMB3_00, "SMB3_00"}, + {PROTOCOL_SMB2_24, "SMB2_24"}, + {PROTOCOL_SMB2_22, "SMB2_22"}, + {PROTOCOL_SMB2_10, "SMB2_10"}, + {PROTOCOL_SMB2_02, "SMB2_02"}, + {PROTOCOL_NT1, "NT1"}, + {PROTOCOL_LANMAN2, "LANMAN2"}, + {PROTOCOL_LANMAN1, "LANMAN1"}, + {PROTOCOL_CORE, "CORE"}, + {PROTOCOL_COREPLUS, "COREPLUS"}, + {PROTOCOL_NONE, "NONE"}, + {PROTOCOL_DEFAULT, "DEFAULT"}, + }; + enum protocol_types protocol; + const char *proto_name = NULL; + size_t i; + + protocol = smbXcli_conn_protocol(cli->conn); + + if (protocol >= PROTOCOL_SMB2_02) { + /* Ensure we ask for some initial credits. */ + smb2cli_conn_set_max_credits(cli->conn, DEFAULT_SMB2_MAX_CREDITS); + } + + for (i=0; i < ARRAY_SIZE(protos); i++) { + if (protos[i].proto == protocol) { + proto_name = protos[i].name; + break; + } + } + + cli->server_os = talloc_asprintf(cli, "%s Server", proto_name); + if (cli->server_os == NULL) { + return NT_STATUS_NO_MEMORY; + } + cli->server_type = talloc_asprintf(cli, "%s", + smbXcli_conn_remote_name(cli->conn)); + if (cli->server_type == NULL) { + return NT_STATUS_NO_MEMORY; + } + + return NT_STATUS_OK; +} + static NTSTATUS cli_state_update_after_sesssetup(struct cli_state *cli, const char *native_os, const char *native_lm, @@ -2887,10 +2940,9 @@ static void cli_start_connection_done(struct tevent_req *subreq) return; } - if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) { - /* Ensure we ask for some initial credits. */ - smb2cli_conn_set_max_credits(state->cli->conn, - DEFAULT_SMB2_MAX_CREDITS); + status = cli_state_update_after_negprot(state->cli); + if (tevent_req_nterror(req, status)) { + return; } tevent_req_done(req); diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c index 2e9107866cbe..9e772423a602 100644 --- a/source3/libsmb/clidfs.c +++ b/source3/libsmb/clidfs.c @@ -228,6 +228,14 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx, smb_protocol_types_string(protocol), smbXcli_conn_remote_name(c->conn))); + status = cli_state_update_after_negprot(c); + if (!NT_STATUS_IS_OK(status)) { + d_printf("cli_state_update_after_negprot failed: %s\n", + nt_errstr(status)); + cli_shutdown(c); + return status; + } + if (protocol >= PROTOCOL_SMB2_02) { /* Ensure we ask for some initial credits. */ smb2cli_conn_set_max_credits(c->conn, DEFAULT_SMB2_MAX_CREDITS); diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c index 0067df48cac7..a5a30d94a1c9 100644 --- a/source3/libsmb/libsmb_server.c +++ b/source3/libsmb/libsmb_server.c @@ -508,9 +508,11 @@ SMBC_server_internal(TALLOC_CTX *ctx, return NULL; } - if (smbXcli_conn_protocol(c->conn) >= PROTOCOL_SMB2_02) { - /* Ensure we ask for some initial credits. */ - smb2cli_conn_set_max_credits(c->conn, DEFAULT_SMB2_MAX_CREDITS); + status = cli_state_update_after_negprot(c); + if (!NT_STATUS_IS_OK(status)) { + cli_shutdown(c); + errno = ENOMEM; + return NULL; } username_used = *pp_username; diff --git a/source3/libsmb/passchange.c b/source3/libsmb/passchange.c index f60e30799757..34a8df6acf1e 100644 --- a/source3/libsmb/passchange.c +++ b/source3/libsmb/passchange.c @@ -87,6 +87,16 @@ NTSTATUS remote_password_change(const char *remote_machine, return result; } + result = cli_state_update_after_negprot(cli); + if (!NT_STATUS_IS_OK(result)) { + if (asprintf(err_str, "cli_state_update_after_negprot failed: %s\n", + nt_errstr(result)) == -1) { + *err_str = NULL; + } + cli_shutdown(cli); + return result; + } + /* Given things like SMB signing, restrict anonymous and the like, try an authenticated connection first */ result = cli_session_setup_creds(cli, creds); diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index cdca2f5674ea..2f2f0afef668 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -87,6 +87,7 @@ NTSTATUS cli_tdis(struct cli_state *cli); NTSTATUS cli_connect_nb(const char *host, const struct sockaddr_storage *dest_ss, uint16_t port, int name_type, const char *myname, int signing_state, int flags, struct cli_state **pcli); +NTSTATUS cli_state_update_after_negprot(struct cli_state *cli); NTSTATUS cli_start_connection(struct cli_state **output_cli, const char *my_name, const char *dest_host,