s4:librpc/rpc: avoid using dcerpc_secondary_smb_send/recv
authorStefan Metzmacher <metze@samba.org>
Tue, 11 Mar 2014 11:37:40 +0000 (12:37 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 10:43:20 +0000 (12:43 +0200)
We can now just use dcerpc_pipe_open_smb_send/recv and get
smbXcli_{conn,session,tcon} from the dcerpc_binding of the primary connection.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source4/librpc/rpc/dcerpc_secondary.c

index 55068dc107249d0b9acc27c2f7e3f2872b9dc441..41c6b8f3499b026b42c1f07a23efc0a745964bff 100644 (file)
@@ -28,6 +28,7 @@
 #include "lib/events/events.h"
 #include "librpc/rpc/dcerpc.h"
 #include "librpc/rpc/dcerpc_proto.h"
+#include "libcli/smb/smbXcli_base.h"
 #include "auth/credentials/credentials.h"
 #include "param/param.h"
 #include "libcli/resolve/resolve.h"
@@ -37,6 +38,11 @@ struct sec_conn_state {
        struct dcerpc_pipe *pipe;
        struct dcerpc_pipe *pipe2;
        struct dcerpc_binding *binding;
+       struct {
+               struct smbXcli_conn *conn;
+               struct smbXcli_session *session;
+               struct smbXcli_tcon *tcon;
+       } smb;
 };
 
 
@@ -116,8 +122,26 @@ _PUBLIC_ struct composite_context* dcerpc_secondary_connection_send(struct dcerp
        /* open second dcerpc pipe using the same transport as for primary pipe */
        switch (s->pipe->conn->transport.transport) {
        case NCACN_NP:
-               pipe_smb_req = dcerpc_secondary_smb_send(s->pipe->conn,
-                                                        s->pipe2->conn,
+               s->smb.conn = dcerpc_binding_get_pointer_option(s->pipe->binding,
+                                                       "connection",
+                                                       struct smbXcli_conn);
+               s->smb.session = dcerpc_binding_get_pointer_option(s->pipe->binding,
+                                                       "connection",
+                                                       struct smbXcli_session);
+               s->smb.tcon = dcerpc_binding_get_pointer_option(s->pipe->binding,
+                                                       "connection",
+                                                       struct smbXcli_tcon);
+
+               if (!smbXcli_conn_is_connected(s->smb.conn)) {
+                       composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+                       return c;
+               }
+
+               pipe_smb_req = dcerpc_pipe_open_smb_send(s->pipe2->conn,
+                                                        s->smb.conn,
+                                                        s->smb.session,
+                                                        s->smb.tcon,
+                                                        DCERPC_REQUEST_TIMEOUT * 1000,
                                                         endpoint);
                composite_continue(c, pipe_smb_req, continue_open_smb, c);
                return c;
@@ -203,8 +227,28 @@ static void continue_open_smb(struct composite_context *ctx)
 {
        struct composite_context *c = talloc_get_type(ctx->async.private_data,
                                                      struct composite_context);
-       
-       c->status = dcerpc_secondary_smb_recv(ctx);
+       struct sec_conn_state *s = talloc_get_type_abort(c->private_data,
+                                                        struct sec_conn_state);
+
+       c->status = dcerpc_pipe_open_smb_recv(ctx);
+       if (!composite_is_ok(c)) return;
+
+       c->status = dcerpc_binding_set_pointer_option(s->binding,
+                                                     "connection",
+                                                     struct smbXcli_conn,
+                                                     s->smb.conn);
+       if (!composite_is_ok(c)) return;
+
+       c->status = dcerpc_binding_set_pointer_option(s->binding,
+                                                     "connection",
+                                                     struct smbXcli_session,
+                                                     s->smb.session);
+       if (!composite_is_ok(c)) return;
+
+       c->status = dcerpc_binding_set_pointer_option(s->binding,
+                                                     "connection",
+                                                     struct smbXcli_tcon,
+                                                     s->smb.tcon);
        if (!composite_is_ok(c)) return;
 
        continue_pipe_open(c);