From: Stefan Metzmacher Date: Sun, 6 Apr 2025 17:05:19 +0000 (+0200) Subject: s3:libsmb: pass struct smb_transports to cli_connect_nb() X-Git-Tag: tevent-0.17.0~271 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=425d3ce7b54c52c81a5cf00da753596a0f48bd8c;p=thirdparty%2Fsamba.git s3:libsmb: pass struct smb_transports to cli_connect_nb() Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- diff --git a/source3/client/client.c b/source3/client/client.c index c15d9a9eb69..797535024d5 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -6367,6 +6367,8 @@ static int do_tar_op(const char *base_directory) static int do_message_op(struct cli_credentials *creds) { NTSTATUS status; + struct smb_transports ts = + smbsock_transports_from_port(port ? port : NBT_SMB_PORT); if (lp_disable_netbios()) { d_printf("NetBIOS over TCP disabled.\n"); @@ -6375,7 +6377,8 @@ static int do_message_op(struct cli_credentials *creds) status = cli_connect_nb(talloc_tos(), desthost, have_ip ? &dest_ss : NULL, - port ? port : NBT_SMB_PORT, name_type, + &ts, + name_type, lp_netbios_name(), SMB_SIGNING_OFF, 0, diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 52c02d06465..7df07e8489b 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -2620,7 +2620,7 @@ static NTSTATUS cli_connect_nb_recv(struct tevent_req *req, NTSTATUS cli_connect_nb(TALLOC_CTX *mem_ctx, const char *host, const struct sockaddr_storage *dest_ss, - uint16_t port, + const struct smb_transports *transports, int name_type, const char *myname, enum smb_signing_setting signing_state, @@ -2630,13 +2630,12 @@ NTSTATUS cli_connect_nb(TALLOC_CTX *mem_ctx, struct tevent_context *ev; struct tevent_req *req; NTSTATUS status = NT_STATUS_NO_MEMORY; - struct smb_transports ts = smbsock_transports_from_port(port); ev = samba_tevent_context_init(mem_ctx); if (ev == NULL) { goto fail; } - req = cli_connect_nb_send(ev, ev, host, dest_ss, &ts, name_type, + req = cli_connect_nb_send(ev, ev, host, dest_ss, transports, name_type, myname, signing_state, flags); if (req == NULL) { goto fail; diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c index de8ac4dc1ea..dc0dc405b87 100644 --- a/source3/libsmb/clidfs.c +++ b/source3/libsmb/clidfs.c @@ -151,6 +151,7 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx, cli_credentials_get_smb_encryption(creds); struct smb2_negotiate_contexts *in_contexts = NULL; struct smb2_negotiate_contexts *out_contexts = NULL; + struct smb_transports ts = smbsock_transports_from_port(port); if (encryption_state >= SMB_ENCRYPTION_DESIRED) { signing_state = SMB_SIGNING_REQUIRED; @@ -186,7 +187,7 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx, status = cli_connect_nb(NULL, server, dest_ss, - port, + &ts, name_type, NULL, signing_state, diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c index 8808781d410..043f640601f 100644 --- a/source3/libsmb/libsmb_server.c +++ b/source3/libsmb/libsmb_server.c @@ -369,6 +369,11 @@ SMBC_server_internal(TALLOC_CTX *ctx, struct smbXcli_tcon *tcon = NULL; int signing_state = SMB_SIGNING_DEFAULT; struct cli_credentials *creds = NULL; + struct smb_transports ats = smbsock_transports_from_port(port); + uint8_t ati; + const struct smb_transports *ts = &ats; + struct smb_transports ots = { .num_transports = 0, }; + struct smb_transports nts = { .num_transports = 0, }; *in_cache = false; @@ -377,6 +382,23 @@ SMBC_server_internal(TALLOC_CTX *ctx, return NULL; } + for (ati = 0; ati < ats.num_transports; ati++) { + const struct smb_transport *at = + &ats.transports[ati]; + + if (at->type == SMB_TRANSPORT_TYPE_NBT) { + struct smb_transport *nt = + &nts.transports[nts.num_transports]; + *nt = *at; + nts.num_transports += 1; + } else { + struct smb_transport *ot = + &ots.transports[ots.num_transports]; + *ot = *at; + ots.num_transports += 1; + } + } + /* Look for a cached connection */ srv = SMBC_find_server(ctx, context, server, share, pp_workgroup, pp_username, pp_password); @@ -524,15 +546,17 @@ SMBC_server_internal(TALLOC_CTX *ctx, signing_state = SMB_SIGNING_REQUIRED; } - if (port == 0) { + if (nts.num_transports != 0 && ots.num_transports != 0) { if (share == NULL || *share == '\0' || is_ipc) { /* * Try 139 first for IPC$ */ + ts = &ots; + status = cli_connect_nb(NULL, server_n, NULL, - NBT_SMB_PORT, + &nts, 0x20, smbc_getNetbiosName(context), signing_state, @@ -548,7 +572,7 @@ SMBC_server_internal(TALLOC_CTX *ctx, status = cli_connect_nb(NULL, server_n, NULL, - port, + ts, 0x20, smbc_getNetbiosName(context), signing_state, diff --git a/source3/libsmb/passchange.c b/source3/libsmb/passchange.c index c4a82bfcd23..eafad9a0423 100644 --- a/source3/libsmb/passchange.c +++ b/source3/libsmb/passchange.c @@ -41,13 +41,16 @@ NTSTATUS remote_password_change(const char *remote_machine, NTSTATUS status; NTSTATUS result; bool pass_must_change = False; + struct smb_transports ts = + smb_transports_parse("client smb transports", + lp_client_smb_transports()); *err_str = NULL; result = cli_connect_nb(talloc_tos(), remote_machine, NULL, - 0, + &ts, 0x20, NULL, SMB_SIGNING_IPC_DEFAULT, diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index 947afca9501..e3e92e6fcb5 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -85,12 +85,13 @@ NTSTATUS cli_tdis(struct cli_state *cli); NTSTATUS cli_connect_nb(TALLOC_CTX *mem_ctx, const char *host, const struct sockaddr_storage *dest_ss, - uint16_t port, + const struct smb_transports *transports, int name_type, const char *myname, enum smb_signing_setting signing_state, int flags, - struct cli_state **pcli); + struct cli_state **pcli) + NONNULL(4) NONNULL(9); NTSTATUS cli_start_connection(TALLOC_CTX *mem_ctx, struct cli_state **output_cli, const char *my_name, diff --git a/source3/nmbd/nmbd_synclists.c b/source3/nmbd/nmbd_synclists.c index 773ba7b3d2c..0523a902af2 100644 --- a/source3/nmbd/nmbd_synclists.c +++ b/source3/nmbd/nmbd_synclists.c @@ -76,6 +76,8 @@ static void sync_child(char *name, int nm_type, struct cli_state *cli; uint32_t local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0; struct sockaddr_storage ss; + const char *nbt[] = { "nbt", NULL, }; + struct smb_transports ts = smb_transports_parse("forced-nbt", nbt); NTSTATUS status; /* W2K DMB's return empty browse lists on port 445. Use 139. @@ -87,7 +89,7 @@ static void sync_child(char *name, int nm_type, status = cli_connect_nb(talloc_tos(), name, &ss, - NBT_SMB_PORT, + &ts, nm_type, get_local_machine_name(), SMB_SIGNING_DEFAULT, diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 8bc4320eb43..83198eeed3c 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -142,6 +142,9 @@ static struct cli_state *open_nbt_connection(void) struct cli_state *c; NTSTATUS status; int flags = 0; + struct smb_transports ts = + smb_transports_parse("client smb transports", + lp_client_smb_transports()); if (disable_spnego) { flags |= CLI_FULL_CONNECTION_DONT_SPNEGO; @@ -162,7 +165,7 @@ static struct cli_state *open_nbt_connection(void) status = cli_connect_nb(NULL, host, NULL, - port_to_use, + &ts, 0x20, myname, signing_state, @@ -16487,6 +16490,7 @@ static void usage(void) switch (opt) { case 'p': port_to_use = atoi(optarg); + lpcfg_set_cmdline(lp_ctx, "client smb transports", optarg); break; case 's': seed = atoi(optarg); diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c index 4afb22385af..e2bf574f250 100644 --- a/source3/utils/net_rpc.c +++ b/source3/utils/net_rpc.c @@ -7485,6 +7485,9 @@ bool net_rpc_check(struct net_context *c, unsigned flags) bool ret = false; struct sockaddr_storage server_ss; char *server_name = NULL; + struct smb_transports ts = + smb_transports_parse("client smb transports", + lp_client_smb_transports()); NTSTATUS status; /* flags (i.e. server type) may depend on command */ @@ -7494,7 +7497,7 @@ bool net_rpc_check(struct net_context *c, unsigned flags) status = cli_connect_nb(c, server_name, &server_ss, - 0, + &ts, 0x20, lp_netbios_name(), SMB_SIGNING_IPC_DEFAULT, diff --git a/source3/utils/net_time.c b/source3/utils/net_time.c index 91614a11dc2..5923c78cd29 100644 --- a/source3/utils/net_time.c +++ b/source3/utils/net_time.c @@ -32,12 +32,15 @@ static time_t cli_servertime(const char *host, { time_t ret = 0; struct cli_state *cli = NULL; + struct smb_transports ts = + smb_transports_parse("client smb transports", + lp_client_smb_transports()); NTSTATUS status; status = cli_connect_nb(talloc_tos(), host, dest_ss, - 0, + &ts, 0x20, lp_netbios_name(), SMB_SIGNING_DEFAULT,