From: Stefan Metzmacher Date: Wed, 7 May 2025 13:44:28 +0000 (+0200) Subject: s3:libsmb: let smbsock_any_connect() return smbXcli_transport X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6288ff2d460653c7459381f8cf2eac4a91cc4ade;p=thirdparty%2Fsamba.git s3:libsmb: let smbsock_any_connect() return smbXcli_transport Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- diff --git a/source3/libsmb/smbsock_connect.c b/source3/libsmb/smbsock_connect.c index 473d02ef329..0f2af01d5ad 100644 --- a/source3/libsmb/smbsock_connect.c +++ b/source3/libsmb/smbsock_connect.c @@ -22,6 +22,7 @@ #include "../lib/util/tevent_ntstatus.h" #include "../lib/util/tevent_unix.h" #include "client.h" +#include "../libcli/smb/smbXcli_base.h" #include "async_smb.h" #include "../libcli/smb/read_smb.h" #include "libsmb/nmblib.h" @@ -1042,13 +1043,16 @@ NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs, struct loadparm_context *lp_ctx, const struct smb_transports *transports, int sec_timeout, - int *pfd, size_t *chosen_index, - uint16_t *chosen_port) + TALLOC_CTX *mem_ctx, + struct smbXcli_transport **ptransport, + size_t *chosen_index) { TALLOC_CTX *frame = talloc_stackframe(); struct tevent_context *ev; struct tevent_req *req; NTSTATUS status = NT_STATUS_NO_MEMORY; + uint16_t chosen_port = 0; + int fd = -1; ev = samba_tevent_context_init(frame); if (ev == NULL) { @@ -1069,7 +1073,21 @@ NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs, if (!tevent_req_poll_ntstatus(req, ev, &status)) { goto fail; } - status = smbsock_any_connect_recv(req, pfd, chosen_index, chosen_port); + status = smbsock_any_connect_recv(req, &fd, chosen_index, &chosen_port); + if (NT_STATUS_IS_OK(status)) { + struct smb_transport tp = { + .type = SMB_TRANSPORT_TYPE_UNKNOWN, + .port = chosen_port, + }; + + set_socket_options(fd, lp_socket_options()); + *ptransport = smbXcli_transport_bsd(mem_ctx, fd, &tp); + if (*ptransport == NULL) { + close(fd); + status = NT_STATUS_NO_MEMORY; + goto fail; + } + } fail: TALLOC_FREE(frame); return status; diff --git a/source3/libsmb/smbsock_connect.h b/source3/libsmb/smbsock_connect.h index 7f45f6a08c1..45024115267 100644 --- a/source3/libsmb/smbsock_connect.h +++ b/source3/libsmb/smbsock_connect.h @@ -20,6 +20,8 @@ #ifndef _LIBSMB_SMBSOCK_CONNECT_H_ #define _LIBSMB_SMBSOCK_CONNECT_H_ +struct smbXcli_transport; + /* The following definitions come from libsmb/smbsock_connect.c */ struct smb_transports smbsock_transports_from_port(uint16_t port); @@ -66,8 +68,9 @@ NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs, struct loadparm_context *lp_ctx, const struct smb_transports *transports, int sec_timeout, - int *pfd, size_t *chosen_index, - uint16_t *chosen_port) - NONNULL(1) NONNULL(7) NONNULL(8) NONNULL(10); + TALLOC_CTX *mem_ctx, + struct smbXcli_transport **ptransport, + size_t *chosen_index) + NONNULL(1) NONNULL(7) NONNULL(8) NONNULL(11); #endif /* _LIBSMB_SMBSOCK_CONNECT_H_ */ diff --git a/source3/torture/test_smbsock_any_connect.c b/source3/torture/test_smbsock_any_connect.c index 6cdad1149fc..d127f48a2a5 100644 --- a/source3/torture/test_smbsock_any_connect.c +++ b/source3/torture/test_smbsock_any_connect.c @@ -25,7 +25,6 @@ bool run_smb_any_connect(int dummy) { - int fd; NTSTATUS status; struct sockaddr_storage addrs[5]; struct smb_transports ts = @@ -33,7 +32,7 @@ bool run_smb_any_connect(int dummy) lp_client_smb_transports()); size_t chosen_index; struct loadparm_context *lp_ctx = NULL; - uint16_t port; + struct smbXcli_transport *xtp = NULL; lp_ctx = loadparm_init_s3(NULL, loadparm_s3_helpers()); if (lp_ctx == NULL) { @@ -48,13 +47,13 @@ bool run_smb_any_connect(int dummy) status = smbsock_any_connect(addrs, NULL, NULL, NULL, NULL, ARRAY_SIZE(addrs), lp_ctx, &ts, 0, - &fd, &chosen_index, &port); + NULL, &xtp, &chosen_index); TALLOC_FREE(lp_ctx); - d_printf("smbsock_any_connect returned %s (fd %d)\n", - nt_errstr(status), NT_STATUS_IS_OK(status) ? fd : -1); + d_printf("smbsock_any_connect returned %s\n", + nt_errstr(status)); if (NT_STATUS_IS_OK(status)) { - close(fd); + TALLOC_FREE(xtp); } return true; } diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index 5af3f7a506f..e8b28a0478b 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -1556,6 +1556,7 @@ static bool find_dc(TALLOC_CTX *mem_ctx, int fd = -1; size_t fd_index; struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, }; + struct smbXcli_transport *xtp = NULL; NTSTATUS status; bool ok; @@ -1609,7 +1610,7 @@ static bool find_dc(TALLOC_CTX *mem_ctx, num_dcs); status = smbsock_any_connect(addrs, dcnames, NULL, NULL, NULL, num_addrs, lp_ctx, &ts, - 10, &fd, &fd_index, NULL); + 10, NULL, &xtp, &fd_index); if (!NT_STATUS_IS_OK(status)) { for (i=0; idcaddr = addrs[fd_index]; @@ -1665,6 +1667,7 @@ static bool find_dc(TALLOC_CTX *mem_ctx, close(fd); fd = -1; } + TALLOC_FREE(xtp); /* * This should not be an infinite loop, since get_dcs() will not return @@ -1674,14 +1677,17 @@ static bool find_dc(TALLOC_CTX *mem_ctx, goto again; return_transport: - set_socket_options(fd, lp_socket_options()); - *ptransport = smbXcli_transport_bsd(NULL, fd, &tp); - if (*ptransport == NULL) { - close(fd); - DBG_ERR("smbXcli_transport_bsd() failed\n"); - return false; + if (fd != -1) { + set_socket_options(fd, lp_socket_options()); + xtp = smbXcli_transport_bsd(NULL, fd, &tp); + if (xtp == NULL) { + close(fd); + DBG_ERR("smbXcli_transport_bsd() failed\n"); + return false; + } } - talloc_reparent(NULL, mem_ctx, *ptransport); + + *ptransport = talloc_move(mem_ctx, &xtp); return true; }