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>
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;
+}
_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);
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;
};
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);
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)
{
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;
}