]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:libsmb: pass smbXcli_transport to cli_state_create()
authorStefan Metzmacher <metze@samba.org>
Wed, 7 May 2025 13:01:20 +0000 (15:01 +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/clientgen.c
source3/libsmb/proto.h
source3/winbindd/winbindd_cm.c

index 9dfdb8aefae581d3d196bb29a8a8afbf2531279f..079f422112b088cd3cd4c2f13db8949d7d38ca3b 100644 (file)
@@ -2593,20 +2593,26 @@ static void cli_connect_nb_done(struct tevent_req *subreq)
                subreq, struct tevent_req);
        struct cli_connect_nb_state *state = tevent_req_data(
                req, struct cli_connect_nb_state);
+       struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
+       struct smbXcli_transport *xtp = NULL;
        NTSTATUS status;
        int fd = 0;
-       uint16_t port;
 
-       status = cli_connect_sock_recv(subreq, &fd, &port);
+       status = cli_connect_sock_recv(subreq, &fd, &tp.port);
        TALLOC_FREE(subreq);
        if (tevent_req_nterror(req, status)) {
                return;
        }
 
-       state->cli = cli_state_create(state, fd, state->desthost,
+       xtp = smbXcli_transport_bsd(state, fd, &tp);
+       if (tevent_req_nomem(xtp, req)) {
+               close(fd);
+               return;
+       }
+
+       state->cli = cli_state_create(state, &xtp, state->desthost,
                                      state->signing_state, state->flags);
        if (tevent_req_nomem(state->cli, req)) {
-               close(fd);
                return;
        }
        tevent_req_done(req);
index 727cb0ed9912b05660e8119f702ddb33e245112c..d07156d2295ad015bcdb16bee464679f53bc4e78 100644 (file)
@@ -65,13 +65,11 @@ bool cli_set_backup_intent(struct cli_state *cli, bool flag)
 struct GUID cli_state_client_guid;
 
 struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
-                                  int fd,
+                                  struct smbXcli_transport **ptransport,
                                   const char *remote_name,
                                   enum smb_signing_setting signing_state,
                                   int flags)
 {
-       struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
-       struct smbXcli_transport *transport = NULL;
        struct cli_state *cli = NULL;
        bool use_spnego = lp_client_use_spnego();
        bool force_dos_errors = false;
@@ -195,13 +193,8 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
 
        smb2_capabilities = SMB2_CAP_ALL;
 
-       transport = smbXcli_transport_bsd(cli, fd, &tp);
-       if (transport == NULL) {
-               goto error;
-       }
-
        cli->conn = smbXcli_conn_create(cli,
-                                       &transport,
+                                       ptransport,
                                        remote_name,
                                        signing_state,
                                        smb1_capabilities,
index 078ce7aeee44cdf5187899f4d2e54c99f6eb9c74..97a83e46cb9c93424ba86b87651275576db83281 100644 (file)
@@ -191,8 +191,9 @@ char *smb1_dfs_share_path(TALLOC_CTX *ctx,
 unsigned int cli_set_timeout(struct cli_state *cli, unsigned int timeout);
 bool cli_set_backup_intent(struct cli_state *cli, bool flag);
 extern struct GUID cli_state_client_guid;
+struct smbXcli_transport;
 struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
-                                  int fd,
+                                  struct smbXcli_transport **ptransport,
                                   const char *remote_name,
                                   enum smb_signing_setting signing_state,
                                   int flags);
index d4a7312dbd447305f093ba237f7774ce20d583df..848f469c7c9e9f7ca558f53909bd07a73cc72259 100644 (file)
@@ -710,6 +710,8 @@ static NTSTATUS cm_prepare_connection(struct winbindd_domain *domain,
        const char *machine_domain = NULL;
        int flags = 0;
        struct cli_credentials *creds = NULL;
+       struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
+       struct smbXcli_transport *xtp = NULL;
 
        struct named_mutex *mutex;
 
@@ -782,15 +784,24 @@ static NTSTATUS cm_prepare_connection(struct winbindd_domain *domain,
 
        /*
         * cm_prepare_connection() is responsible that sockfd does not leak.
-        * Once cli_state_create() returns with success, the
-        * smbXcli_conn_destructor() makes sure that close(sockfd) is finally
+        * Once smbXcli_transport_bsd() returns with success, the
+        * smbXcli_transport_destructor() makes sure that close(sockfd) is finally
         * called. Till that, close(sockfd) must be called on every unsuccessful
         * return.
         */
-       *cli = cli_state_create(NULL, sockfd, controller,
+       set_socket_options(sockfd, lp_socket_options());
+       xtp = smbXcli_transport_bsd(NULL, sockfd, &tp);
+       if (xtp == NULL) {
+               close(sockfd);
+               DEBUG(1, ("Could not cli_initialize\n"));
+               result = NT_STATUS_NO_MEMORY;
+               goto done;
+       }
+
+       *cli = cli_state_create(NULL, &xtp, controller,
                                smb_sign_client_connections, flags);
        if (*cli == NULL) {
-               close(sockfd);
+               TALLOC_FREE(xtp);
                DEBUG(1, ("Could not cli_initialize\n"));
                result = NT_STATUS_NO_MEMORY;
                goto done;
@@ -798,8 +809,6 @@ static NTSTATUS cm_prepare_connection(struct winbindd_domain *domain,
 
        cli_set_timeout(*cli, 10000); /* 10 seconds */
 
-       set_socket_options(sockfd, lp_socket_options());
-
        result = smbXcli_negprot((*cli)->conn,
                                 (*cli)->timeout,
                                 lp_client_ipc_min_protocol(),