cli_state_update_after_negprot source3/libsmb/cliconnect.c server_os...
authorStefan Metzmacher <metze@samba.org>
Wed, 15 Mar 2017 17:04:44 +0000 (17:04 +0000)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:47:34 +0000 (12:47 +0100)
source3/libsmb/cliconnect.c
source3/libsmb/clidfs.c
source3/libsmb/libsmb_server.c
source3/libsmb/passchange.c
source3/libsmb/proto.h

index 04d689cd9cb473150b8284873eb079934a615e5e..1d2a6b5fed6bd9fc8c9937ae72e50a04cd27ba05 100644 (file)
@@ -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);
index 2e9107866cbe953e97a9e2bdba368b50efea2646..9e772423a6020dcd2abce0299b7eca7f09ada0c4 100644 (file)
@@ -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);
index 0067df48cac7bffd866e94d14787eafd47ef68b5..a5a30d94a1c99d4d70e7d234f6d5af24f963b1e0 100644 (file)
@@ -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;
index f60e307997574303dc20dcaae3ed3fe90c37eb2e..34a8df6acf1e7ed13fcb1f64c0bb75f9abe19edc 100644 (file)
@@ -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);
index cdca2f5674ea2b979cfb1d3d7aebff244f06a756..2f2f0afef668aab25c3f37f51415421e63603c58 100644 (file)
@@ -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,