The branch, master has been updated
       via  d08a6b42004 librpc/dcesrv_core: let dcesrv_call_dispatch_local() 
call context->iface->reply()
       via  7bd321e71b7 librpc/dcesrv_core: assert that 
dcesrv_call_dispatch_local() never gets async.
       via  42e79cee3d3 librpc/dcesrv_core: make use of 
dcerpc_fault_to_nt_status() in dcesrv_call_dispatch_local()
       via  7c8a7e8a15b librpc/dcesrv_core: move two rpcint_dispatch() copies 
into dcesrv_call_dispatch_local()
      from  3b5b23ea848 examples:auth: Do not install example plugin

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d08a6b4200411114c0b9a8fa46dd6acd91d47476
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Oct 23 11:56:19 2020 +0200

    librpc/dcesrv_core: let dcesrv_call_dispatch_local() call 
context->iface->reply()
    
    This is needed in order to get NDR_PRINT_FUNCTION_DEBUG(..., NDR_OUT) 
called.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14551
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Samuel Cabrero <[email protected]>
    
    Autobuild-User(master): Samuel Cabrero <[email protected]>
    Autobuild-Date(master): Fri Oct 23 17:24:37 UTC 2020 on sn-devel-184

commit 7bd321e71b7f38994236d84795e08d3818b69dc1
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Oct 23 11:54:29 2020 +0200

    librpc/dcesrv_core: assert that dcesrv_call_dispatch_local() never gets 
async.
    
    This is just not supported for now...
    
    We would need a dcesrv_call_dispatch_local_send/recv in order to
    support async calls.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14551
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Samuel Cabrero <[email protected]>

commit 42e79cee3d306a92243cc6c4898c5e280535d67b
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Oct 23 11:52:57 2020 +0200

    librpc/dcesrv_core: make use of dcerpc_fault_to_nt_status() in 
dcesrv_call_dispatch_local()
    
    The caller wants to get a useful NTSTATUS instead of a generic
    NT_STATUS_NET_WRITE_FAULT.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14551
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Samuel Cabrero <[email protected]>

commit 7c8a7e8a15b433cd151afff0b52e9e5096a2c230
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Oct 23 11:42:14 2020 +0200

    librpc/dcesrv_core: move two rpcint_dispatch() copies into 
dcesrv_call_dispatch_local()
    
    We only need this function once, so that we need to fix bugs only once...
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14551
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Samuel Cabrero <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 librpc/rpc/dcesrv_core.c             | 76 ++++++++++++++++++++++++++++++++++++
 librpc/rpc/dcesrv_core.h             |  2 +
 source3/rpc_server/rpc_ncacn_np.c    | 65 +-----------------------------
 source3/winbindd/winbindd_dual_ndr.c | 65 +-----------------------------
 4 files changed, 80 insertions(+), 128 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c
index a12bf134077..064ad38b8d6 100644
--- a/librpc/rpc/dcesrv_core.c
+++ b/librpc/rpc/dcesrv_core.c
@@ -2971,3 +2971,79 @@ _PUBLIC_ NTSTATUS dcesrv_connection_loop_start(struct 
dcesrv_connection *conn)
 
        return NT_STATUS_OK;
 }
+
+_PUBLIC_ NTSTATUS dcesrv_call_dispatch_local(struct dcesrv_call_state *call)
+{
+       NTSTATUS status;
+       struct ndr_pull *pull = NULL;
+       struct ndr_push *push = NULL;
+       struct data_blob_list_item *rep = NULL;
+
+       pull = ndr_pull_init_blob(&call->pkt.u.request.stub_and_verifier,
+                                 call);
+       if (pull == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+
+       call->ndr_pull = pull;
+
+       /* unravel the NDR for the packet */
+       status = call->context->iface->ndr_pull(call, call, pull, &call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return dcerpc_fault_to_nt_status(call->fault_code);
+       }
+
+       status = call->context->iface->local(call, call, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return dcerpc_fault_to_nt_status(call->fault_code);
+       }
+
+       /* This can never go async for now! */
+       SMB_ASSERT(!(call->state_flags & DCESRV_CALL_STATE_FLAG_ASYNC));
+
+       /* call the reply function */
+       status = call->context->iface->reply(call, call, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return dcerpc_fault_to_nt_status(call->fault_code);
+       }
+
+       push = ndr_push_init_ctx(call);
+       if (push == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       push->ptr_count = call->ndr_pull->ptr_count;
+
+       status = call->context->iface->ndr_push(call, call, push, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return dcerpc_fault_to_nt_status(call->fault_code);
+       }
+
+       rep = talloc_zero(call, struct data_blob_list_item);
+       if (rep == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       rep->blob = ndr_push_blob(push);
+       DLIST_ADD_END(call->replies, rep);
+
+       return NT_STATUS_OK;
+}
diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h
index c1234980b82..399c4ea8056 100644
--- a/librpc/rpc/dcesrv_core.h
+++ b/librpc/rpc/dcesrv_core.h
@@ -624,6 +624,8 @@ _PUBLIC_ void dcesrv_sock_report_output_data(struct 
dcesrv_connection *dce_conn)
 
 _PUBLIC_ NTSTATUS dcesrv_connection_loop_start(struct dcesrv_connection *conn);
 
+_PUBLIC_ NTSTATUS dcesrv_call_dispatch_local(struct dcesrv_call_state *call);
+
 _PUBLIC_ const struct dcesrv_interface *find_interface_by_uuid(
                                const struct dcesrv_endpoint *endpoint,
                                const struct GUID *uuid, uint32_t if_version);
diff --git a/source3/rpc_server/rpc_ncacn_np.c 
b/source3/rpc_server/rpc_ncacn_np.c
index 625b28c9209..d80c62e75d7 100644
--- a/source3/rpc_server/rpc_ncacn_np.c
+++ b/source3/rpc_server/rpc_ncacn_np.c
@@ -421,69 +421,6 @@ fail:
        return status;
 }
 
-static NTSTATUS rpcint_dispatch(struct dcesrv_call_state *call)
-{
-       NTSTATUS status;
-       struct ndr_pull *pull = NULL;
-       struct ndr_push *push = NULL;
-       struct data_blob_list_item *rep = NULL;
-
-       pull = ndr_pull_init_blob(&call->pkt.u.request.stub_and_verifier,
-                                 call);
-       if (pull == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
-
-       call->ndr_pull = pull;
-
-       /* unravel the NDR for the packet */
-       status = call->context->iface->ndr_pull(call, call, pull, &call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       status = call->context->iface->local(call, call, call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       push = ndr_push_init_ctx(call);
-       if (push == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       push->ptr_count = call->ndr_pull->ptr_count;
-
-       status = call->context->iface->ndr_push(call, call, push, call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       rep = talloc_zero(call, struct data_blob_list_item);
-       if (rep == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       rep->blob = ndr_push_blob(push);
-       DLIST_ADD_END(call->replies, rep);
-
-       return NT_STATUS_OK;
-}
-
 struct rpcint_bh_state {
        struct dcesrv_connection *conn;
 };
@@ -567,7 +504,7 @@ static struct tevent_req 
*rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
        state->call->pkt.u.request.stub_and_verifier.length = in_length;
 
        /* TODO: allow async */
-       status = rpcint_dispatch(state->call);
+       status = dcesrv_call_dispatch_local(state->call);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return tevent_req_post(req, ev);
diff --git a/source3/winbindd/winbindd_dual_ndr.c 
b/source3/winbindd/winbindd_dual_ndr.c
index f2d8c815dca..f0b8588f6a0 100644
--- a/source3/winbindd/winbindd_dual_ndr.c
+++ b/source3/winbindd/winbindd_dual_ndr.c
@@ -475,69 +475,6 @@ struct dcerpc_binding_handle 
*wbint_binding_handle(TALLOC_CTX *mem_ctx,
        return h;
 }
 
-static NTSTATUS rpcint_dispatch(struct dcesrv_call_state *call)
-{
-       NTSTATUS status;
-       struct ndr_pull *pull = NULL;
-       struct ndr_push *push = NULL;
-       struct data_blob_list_item *rep = NULL;
-
-       pull = ndr_pull_init_blob(&call->pkt.u.request.stub_and_verifier,
-                                 call);
-       if (pull == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
-
-       call->ndr_pull = pull;
-
-       /* unravel the NDR for the packet */
-       status = call->context->iface->ndr_pull(call, call, pull, &call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       status = call->context->iface->local(call, call, call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       push = ndr_push_init_ctx(call);
-       if (push == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       push->ptr_count = call->ndr_pull->ptr_count;
-
-       status = call->context->iface->ndr_push(call, call, push, call->r);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       call->context->iface->name,
-                       call->pkt.u.request.opnum,
-                       dcerpc_errstr(call, call->fault_code));
-               return status;
-       }
-
-       rep = talloc_zero(call, struct data_blob_list_item);
-       if (rep == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       rep->blob = ndr_push_blob(push);
-       DLIST_ADD_END(call->replies, rep);
-
-       return NT_STATUS_OK;
-}
-
 enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain,
                                          struct winbindd_cli_state *state)
 {
@@ -599,7 +536,7 @@ enum winbindd_result winbindd_dual_ndrcmd(struct 
winbindd_domain *domain,
                data_blob_const(state->request->extra_data.data,
                                state->request->extra_len);
 
-       status = rpcint_dispatch(dcesrv_call);
+       status = dcesrv_call_dispatch_local(dcesrv_call);
        if (!NT_STATUS_IS_OK(status)) {
                goto out;
        }


-- 
Samba Shared Repository

Reply via email to