From: Stefan Metzmacher Date: Wed, 18 Jul 2018 13:34:55 +0000 (+0200) Subject: s4:libcli: allow passing an already negotiated connection to smb_composite_connect() X-Git-Tag: ldb-1.5.0~251 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2b68f9b8b0dd944fa89b9e0037886ddd4fb4e5f9;p=thirdparty%2Fsamba.git s4:libcli: allow passing an already negotiated connection to smb_composite_connect() It will just do the session setup and tree connect steps. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13308 Signed-off-by: Stefan Metzmacher Reviewed-by: Alexander Bokovoy --- diff --git a/source4/libcli/raw/clitree.c b/source4/libcli/raw/clitree.c index 11be5485f26..b1b6159e750 100644 --- a/source4/libcli/raw/clitree.c +++ b/source4/libcli/raw/clitree.c @@ -207,6 +207,7 @@ NTSTATUS smbcli_tree_full_connection(TALLOC_CTX *parent_ctx, io.in.called_name = strupper_talloc(tmp_ctx, dest_host); io.in.service = service; io.in.service_type = service_type; + io.in.existing_conn = NULL; io.in.credentials = credentials; io.in.gensec_settings = gensec_settings; io.in.fallback_to_anonymous = false; diff --git a/source4/libcli/smb_composite/connect.c b/source4/libcli/smb_composite/connect.c index fffa768ac97..582d43ef173 100644 --- a/source4/libcli/smb_composite/connect.c +++ b/source4/libcli/smb_composite/connect.c @@ -228,18 +228,10 @@ static NTSTATUS connect_session_setup(struct composite_context *c, return NT_STATUS_OK; } -/* - a negprot request has completed -*/ -static NTSTATUS connect_negprot(struct composite_context *c, - struct smb_composite_connect *io) +static NTSTATUS connect_send_session(struct composite_context *c, + struct smb_composite_connect *io) { struct connect_state *state = talloc_get_type(c->private_data, struct connect_state); - NTSTATUS status; - - status = smb_raw_negotiate_recv(state->subreq); - TALLOC_FREE(state->subreq); - NT_STATUS_NOT_OK_RETURN(status); /* next step is a session setup */ state->session = smbcli_session_init(state->transport, state, true, io->in.session_options); @@ -281,6 +273,22 @@ static NTSTATUS connect_negprot(struct composite_context *c, return NT_STATUS_OK; } +/* + a negprot request has completed +*/ +static NTSTATUS connect_negprot(struct composite_context *c, + struct smb_composite_connect *io) +{ + struct connect_state *state = talloc_get_type(c->private_data, struct connect_state); + NTSTATUS status; + + status = smb_raw_negotiate_recv(state->subreq); + TALLOC_FREE(state->subreq); + NT_STATUS_NOT_OK_RETURN(status); + + return connect_send_session(c, io); +} + /* setup a negprot send */ @@ -432,6 +440,26 @@ struct composite_context *smb_composite_connect_send(struct smb_composite_connec nbt_choose_called_name(state, &state->called, io->in.called_name, NBT_NAME_SERVER); + if (io->in.existing_conn != NULL) { + NTSTATUS status; + + status = smbcli_transport_raw_init(state, + c->event_ctx, + &io->in.existing_conn, + &io->in.options, + &state->transport); + if (!NT_STATUS_IS_OK(status)) { + goto failed; + } + + status = connect_send_session(c, io); + if (!NT_STATUS_IS_OK(status)) { + goto failed; + } + + return c; + } + state->creq = smbcli_sock_connect_send(state, NULL, io->in.dest_ports, diff --git a/source4/libcli/smb_composite/smb_composite.h b/source4/libcli/smb_composite/smb_composite.h index a92c9612c6a..383946f1307 100644 --- a/source4/libcli/smb_composite/smb_composite.h +++ b/source4/libcli/smb_composite/smb_composite.h @@ -118,6 +118,7 @@ struct smb_composite_connect { const char *called_name; const char *service; const char *service_type; + struct smbXcli_conn *existing_conn; /* optional */ struct cli_credentials *credentials; bool fallback_to_anonymous; const char *workgroup; diff --git a/source4/ntvfs/cifs/vfs_cifs.c b/source4/ntvfs/cifs/vfs_cifs.c index 478428e3246..d88c034c6f2 100644 --- a/source4/ntvfs/cifs/vfs_cifs.c +++ b/source4/ntvfs/cifs/vfs_cifs.c @@ -296,6 +296,7 @@ static NTSTATUS cvfs_connect(struct ntvfs_module_context *ntvfs, io.in.dest_ports = lpcfg_smb_ports(ntvfs->ctx->lp_ctx); io.in.socket_options = lpcfg_socket_options(ntvfs->ctx->lp_ctx); io.in.called_name = host; + io.in.existing_conn = NULL; io.in.credentials = credentials; io.in.fallback_to_anonymous = false; io.in.workgroup = lpcfg_workgroup(ntvfs->ctx->lp_ctx);