From: Stefan Metzmacher Date: Wed, 21 May 2025 13:25:26 +0000 (+0200) Subject: libcli/smb: let smbXcli_transport_bsd() take an fd by reference X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ac1cf07e4c9f858e159b9b8c856de8dbd65c93b;p=thirdparty%2Fsamba.git libcli/smb: let smbXcli_transport_bsd() take an fd by reference This allows it to set the callers value to -1 when it was moved. Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index 326e52c83e0..2d49bb1294b 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -328,10 +328,11 @@ static int smbXcli_transport_destructor(struct smbXcli_transport *xtp) } struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx, - int fd, + int *_fd, const struct smb_transport *tp) { struct smbXcli_transport *xtp = NULL; + int fd = *_fd; int ret; xtp = talloc_zero(mem_ctx, struct smbXcli_transport); @@ -362,6 +363,7 @@ struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx, return NULL; } + *_fd = -1; talloc_set_destructor(xtp, smbXcli_transport_destructor); return xtp; } diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index fa351ee60bd..ec173ae7533 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -43,7 +43,7 @@ struct smb_transport; struct smb311_capabilities; struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx, - int fd, + int *_fd, const struct smb_transport *tp); struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, diff --git a/source3/libsmb/smbsock_connect.c b/source3/libsmb/smbsock_connect.c index 22723edac06..681a069717b 100644 --- a/source3/libsmb/smbsock_connect.c +++ b/source3/libsmb/smbsock_connect.c @@ -647,12 +647,11 @@ static void smbsock_connect_nbt_connected(struct tevent_req *subreq) */ set_socket_options(s->sockfd, lp_socket_options()); state->transport = smbXcli_transport_bsd(state, - s->sockfd, + &s->sockfd, &s->transport); if (tevent_req_nomem(state->transport, req)) { return; } - s->sockfd = -1; tevent_req_done(req); return; } @@ -710,12 +709,11 @@ static void smbsock_connect_tcp_connected(struct tevent_req *subreq) */ set_socket_options(s->sockfd, lp_socket_options()); state->transport = smbXcli_transport_bsd(state, - s->sockfd, + &s->sockfd, &s->transport); if (tevent_req_nomem(state->transport, req)) { return; } - s->sockfd = -1; tevent_req_done(req); return; } diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 90a2054e87a..e735eb8247d 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -15030,7 +15030,7 @@ static bool run_smb1_truncated_sesssetup(int dummy) return false; } - xtp = smbXcli_transport_bsd(talloc_tos(), fd, &tp); + xtp = smbXcli_transport_bsd(talloc_tos(), &fd, &tp); if (xtp == NULL) { d_fprintf(stderr, "smbXcli_transport_bsd failed\n"); return false; @@ -15230,7 +15230,7 @@ static bool run_smb1_negotiate_exit(int dummy) return false; } - xtp = smbXcli_transport_bsd(talloc_tos(), fd, &tp); + xtp = smbXcli_transport_bsd(talloc_tos(), &fd, &tp); if (xtp == NULL) { d_fprintf(stderr, "smbXcli_transport_bsd failed\n"); return false; @@ -15352,7 +15352,7 @@ static bool run_ign_bad_negprot(int dummy) return false; } - xtp = smbXcli_transport_bsd(talloc_tos(), fd, &tp); + xtp = smbXcli_transport_bsd(talloc_tos(), &fd, &tp); if (xtp == NULL) { d_fprintf(stderr, "smbXcli_transport_bsd failed\n"); return false; diff --git a/source4/torture/smb2/multichannel.c b/source4/torture/smb2/multichannel.c index 4c7d77642f5..76684e142ba 100644 --- a/source4/torture/smb2/multichannel.c +++ b/source4/torture/smb2/multichannel.c @@ -2568,10 +2568,9 @@ static bool test_multichannel_bug_15346(struct torture_context *tctx, torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "socket_connect_multi failed"); - xtp = smbXcli_transport_bsd(state->conns, sock->fd, &tp); + xtp = smbXcli_transport_bsd(state->conns, &sock->fd, &tp); torture_assert_goto(tctx, xtp != NULL, ret, done, "smbXcli_transport_bsd failed"); - sock->fd = -1; TALLOC_FREE(sock); conn->smbXcli = smbXcli_conn_create(state->conns,