]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:libsmb: let smbsock_any_connect_recv return smbXcli_transport
authorStefan Metzmacher <metze@samba.org>
Wed, 7 May 2025 13:38:34 +0000 (15:38 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 18 Jun 2025 17:52:37 +0000 (17:52 +0000)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/libsmb/cliconnect.c
source3/libsmb/smbsock_connect.c
source3/libsmb/smbsock_connect.h
source4/libcli/raw/clisocket.c

index 3b29cce7a0b65fb6c35e44d34f8a98cb240a8e52..0dd7ddea6d0e7c1ae262d6ca9261df8625910e85 100644 (file)
@@ -2499,22 +2499,13 @@ static void cli_connect_sock_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        struct cli_connect_sock_state *state = tevent_req_data(
                req, struct cli_connect_sock_state);
-       struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
-       int fd;
        NTSTATUS status;
 
-       status = smbsock_any_connect_recv(subreq, &fd, NULL, &tp.port);
+       status = smbsock_any_connect_recv(subreq, state, &state->transport, NULL);
        TALLOC_FREE(subreq);
        if (tevent_req_nterror(req, status)) {
                return;
        }
-       set_socket_options(fd, lp_socket_options());
-
-       state->transport = smbXcli_transport_bsd(state, fd, &tp);
-       if (tevent_req_nomem(state->transport, req)) {
-               close(fd);
-               return;
-       }
 
        tevent_req_done(req);
 }
index 0f2af01d5ad3de979e2a9280b1b343014b164b76..f962136a0fccef3198809aa5611b3ff23fa6d49f 100644 (file)
@@ -804,8 +804,7 @@ struct smbsock_any_connect_state {
        size_t num_sent;
        size_t num_received;
 
-       int fd;
-       uint16_t chosen_port;
+       struct smbXcli_transport *transport;
        size_t chosen_index;
 };
 
@@ -844,7 +843,6 @@ struct tevent_req *smbsock_any_connect_send(TALLOC_CTX *mem_ctx,
        state->calling_names = calling_names;
        state->calling_types = calling_types;
        state->transports = *transports;
-       state->fd = -1;
 
        tevent_req_set_cleanup_fn(req, smbsock_any_connect_cleanup);
 
@@ -887,10 +885,7 @@ static void smbsock_any_connect_cleanup(struct tevent_req *req,
                return;
        }
 
-       if (state->fd != -1) {
-               close(state->fd);
-               state->fd = -1;
-       }
+       TALLOC_FREE(state->transport);
 }
 
 static void smbsock_any_connect_trynext(struct tevent_req *subreq)
@@ -984,12 +979,21 @@ static void smbsock_any_connect_connected(struct tevent_req *subreq)
        state->requests[chosen_index] = NULL;
 
        if (NT_STATUS_IS_OK(status)) {
+               struct smb_transport tp = {
+                       .type = SMB_TRANSPORT_TYPE_UNKNOWN,
+                       .port = chosen_port,
+               };
+
                /*
                 * tevent_req_done() will kill all the other requests
                 * via smbsock_any_connect_cleanup().
                 */
-               state->fd = fd;
-               state->chosen_port = chosen_port;
+               set_socket_options(fd, lp_socket_options());
+               state->transport = smbXcli_transport_bsd(state, fd, &tp);
+               if (tevent_req_nomem(state->transport, req)) {
+                       close(fd);
+                       return;
+               }
                state->chosen_index = chosen_index;
                tevent_req_done(req);
                return;
@@ -1010,9 +1014,10 @@ static void smbsock_any_connect_connected(struct tevent_req *subreq)
        return;
 }
 
-NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, int *pfd,
-                                 size_t *chosen_index,
-                                 uint16_t *chosen_port)
+NTSTATUS smbsock_any_connect_recv(struct tevent_req *req,
+                                 TALLOC_CTX *mem_ctx,
+                                 struct smbXcli_transport **ptransport,
+                                 size_t *chosen_index)
 {
        struct smbsock_any_connect_state *state = tevent_req_data(
                req, struct smbsock_any_connect_state);
@@ -1022,14 +1027,10 @@ NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, int *pfd,
                tevent_req_received(req);
                return status;
        }
-       *pfd = state->fd;
-       state->fd = -1;
+       *ptransport = talloc_move(mem_ctx, &state->transport);
        if (chosen_index != NULL) {
                *chosen_index = state->chosen_index;
        }
-       if (chosen_port != NULL) {
-               *chosen_port = state->chosen_port;
-       }
        tevent_req_received(req);
        return NT_STATUS_OK;
 }
@@ -1051,8 +1052,6 @@ NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs,
        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) {
@@ -1073,21 +1072,7 @@ 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, &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;
-               }
-       }
+       status = smbsock_any_connect_recv(req, mem_ctx, ptransport, chosen_index);
  fail:
        TALLOC_FREE(frame);
        return status;
index 45024115267981670b5806e61d6c30874d4590fc..26c54ca0297234496eab25bc34b8f0f4c2e98e61 100644 (file)
@@ -57,8 +57,11 @@ struct tevent_req *smbsock_any_connect_send(TALLOC_CTX *mem_ctx,
                                            size_t num_addrs,
                                            const struct smb_transports *transports)
        NONNULL(2) NONNULL(3) NONNULL(4) NONNULL(10);
-NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, int *pfd,
-                                 size_t *chosen_index, uint16_t *chosen_port);
+NTSTATUS smbsock_any_connect_recv(struct tevent_req *req,
+                                 TALLOC_CTX *mem_ctx,
+                                 struct smbXcli_transport **ptransport,
+                                 size_t *chosen_index)
+       NONNULL(1) NONNULL(3);
 NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs,
                             const char **called_names,
                             int *called_types,
index 27814617d2ec8dabfde5d07af38c4cda5369b091..19db3d038d054666c722a4ce1b0a5891846c1455 100644 (file)
 
 #include "includes.h"
 #include "system/network.h"
-#include "../lib/async_req/async_sock.h"
 #include "../lib/util/tevent_ntstatus.h"
-#include "lib/events/events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
-#include "lib/socket/socket.h"
 #include "libcli/resolve/resolve.h"
 #include "param/param.h"
-#include "../libcli/smb/smbXcli_base.h"
 #include "libcli/raw/raw_proto.h"
-#include "../libcli/smb/read_smb.h"
 #include "lib/util/util_net.h"
 #include "../source3/libsmb/smbsock_connect.h"
 
@@ -235,30 +230,20 @@ static void smbcli_sock_connect_recv_conn(struct tevent_req *subreq)
        struct sock_connect_state *state =
                tevent_req_callback_data(subreq,
                struct sock_connect_state);
-       struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
-       int sockfd = -1;
+       struct smbXcli_transport *xtp = NULL;
 
        state->ctx->status = smbsock_any_connect_recv(subreq,
-                                                     &sockfd,
-                                                     NULL,
+                                                     state,
+                                                     &xtp,
                                                      NULL);
        if (!composite_is_ok(state->ctx)) return;
 
-       set_socket_options(sockfd, state->socket_options);
-
        state->result = talloc_zero(state, struct smbcli_socket);
        if (composite_nomem(state->result, state->ctx)) {
-               close(sockfd);
                return;
        }
 
-       state->result->transport = smbXcli_transport_bsd(state->result,
-                                                        sockfd,
-                                                        &tp);
-       if (composite_nomem(state->result->transport, state->ctx)) {
-               close(sockfd);
-               return;
-       }
+       state->result->transport = talloc_move(state->result, &xtp);
 
        state->result->hostname = talloc_steal(state->result, state->host_name);