librpc/dcesrv_core: move two rpcint_dispatch() copies into dcesrv_call_dispatch_local()
authorStefan Metzmacher <metze@samba.org>
Fri, 23 Oct 2020 09:42:14 +0000 (11:42 +0200)
committerSamuel Cabrero <scabrero@sn-devel-184>
Fri, 23 Oct 2020 16:02:37 +0000 (16:02 +0000)
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 <metze@samba.org>
Reviewed-by: Samuel Cabrero <scabrero@samba.org>
librpc/rpc/dcesrv_core.c
librpc/rpc/dcesrv_core.h
source3/rpc_server/rpc_ncacn_np.c
source3/winbindd/winbindd_dual_ndr.c

index a12bf1340773d85e565652c4e77a265161d0511d..d39dbb4368776a412b9e6563e645dfa211be64fe 100644 (file)
@@ -2971,3 +2971,66 @@ _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 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;
+}
index c1234980b829c2b9f6a75120f070ee0c7208a2c5..399c4ea805669c4e7e2ec3d790f1e0f312d9acb2 100644 (file)
@@ -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);
index 625b28c9209def8dbd4af9b36bd630c113111040..d80c62e75d7a6b87adb32c94542dc8a618b7089a 100644 (file)
@@ -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);
index f2d8c815dca3dcfb03bbffd520bad47c4ee23ed0..f0b8588f6a01aeaa6eb4de76f18ddc706349b83d 100644 (file)
@@ -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;
        }