The branch, master has been updated via 0dd648a s4:librpc/rpc: remember "ncalrpc_dir" on the dcerpc_pipe->binding via d29c143 pidl:Samba4/Python: add interface.abstract_syntax() to each interface via 6d6427b s4:pyrpc: add base.transfer_syntax_ndr*() via ae02bf6 s4:pyrpc: add py_dcerpc_syntax_init_helper() via 4f0d598 s4:librpc: compile python bindings for dcerpc.idl via eabdbc8 dcerpc.idl: hide (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT) logic behind a define via f73ef30 dcerpc.idl: fix dcerpc_bind_nack definition via 9730210 dcerpc.idl: fix typo s/ist/int via a496c18 dcerpc.idl: make use of DCERPC_NCA_S_* constants for the legacy DCERPC_FAULT_* codes via 34d45a3 librpc/rpc: try to use DCERPC_NCA_S_* constants for error mappings from 533ad24 ctdb-tests: Do not mix bool and int data types
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0dd648a54ed00bfeb7c6074d16173128acd3799e Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 13 09:42:10 2014 +0100 s4:librpc/rpc: remember "ncalrpc_dir" on the dcerpc_pipe->binding Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Fri Mar 28 10:34:51 CET 2014 on sn-devel-104 commit d29c143fae4b67c9680a0b9773db3461f2d0d2b7 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 27 14:56:23 2014 +0100 pidl:Samba4/Python: add interface.abstract_syntax() to each interface Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 6d6427b7c8070f2350f337587f9db002056f1b64 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 27 14:57:29 2014 +0100 s4:pyrpc: add base.transfer_syntax_ndr*() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ae02bf6f068d49478f159be726e628fa6287907a Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 27 14:54:29 2014 +0100 s4:pyrpc: add py_dcerpc_syntax_init_helper() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 4f0d5981f1fa7f53a3ea0d1a746584a4bf2f08da Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 27 13:08:22 2014 +0100 s4:librpc: compile python bindings for dcerpc.idl Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit eabdbc886011028d19f5ef9bf6734f9ae6ffbf7f Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 27 13:08:22 2014 +0100 dcerpc.idl: hide (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT) logic behind a define This way we can alter the define depending on the generated code. E.g python bindings won't have an 'ndr' struct available. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit f73ef3028c4f4583c81b611a9714608eae79360c Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 26 22:42:19 2014 +0100 dcerpc.idl: fix dcerpc_bind_nack definition The version array is always present. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 97302100d0935653df3da593277b4e356cccf96b Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 26 22:42:19 2014 +0100 dcerpc.idl: fix typo s/ist/int Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit a496c18997f1f9a600981d20b8204fe471afd8e0 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 19 14:07:36 2014 +0100 dcerpc.idl: make use of DCERPC_NCA_S_* constants for the legacy DCERPC_FAULT_* codes Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 34d45a3a513c6ce010fa16f809de515250ae1729 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 19 14:14:36 2014 +0100 librpc/rpc: try to use DCERPC_NCA_S_* constants for error mappings Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: librpc/idl/dcerpc.idl | 32 ++++++++++---------- librpc/ndr/ndr_dcerpc.h | 4 ++ librpc/rpc/dcerpc_error.c | 8 ++-- pidl/lib/Parse/Pidl/Samba4/Python.pm | 39 +++++++++++++++++++++++++ source4/librpc/rpc/dcerpc_connect.c | 14 +++++++-- source4/librpc/rpc/pyrpc.c | 52 ++++++++++++++++++++++++++++++++++ source4/librpc/rpc/pyrpc.h | 5 +++ source4/librpc/rpc/pyrpc_util.c | 22 ++++++++++++++ source4/librpc/rpc/pyrpc_util.h | 4 ++ source4/librpc/wscript_build | 5 +++ source4/rpc_server/dcerpc_server.c | 9 ++++-- 11 files changed, 168 insertions(+), 26 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/idl/dcerpc.idl b/librpc/idl/dcerpc.idl index 1ffa784..4dad126 100644 --- a/librpc/idl/dcerpc.idl +++ b/librpc/idl/dcerpc.idl @@ -56,7 +56,11 @@ interface dcerpc uint32 alloc_hint; uint16 context_id; uint16 opnum; - [switch_is(ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)] dcerpc_object object; + /* + * NDR_DCERPC_REQUEST_OBJECT_PRESENT + * is defined differently for ndr_dcerpc.c and py_dcerpc.c + */ + [switch_is(NDR_DCERPC_REQUEST_OBJECT_PRESENT)] dcerpc_object object; [flag(NDR_ALIGN8)] DATA_BLOB _pad; [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier; } dcerpc_request; @@ -125,19 +129,15 @@ interface dcerpc DCERPC_BIND_NAK_REASON_INVALID_AUTH_TYPE; typedef struct { - uint32 num_versions; - uint32 versions[num_versions]; - } dcerpc_bind_nak_versions; - - typedef [nodiscriminant] union { - [case(DCERPC_BIND_NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED)] - dcerpc_bind_nak_versions v; - [default] ; - } dcerpc_bind_nak_versions_ctr; + uint8 rpc_vers; /* RPC version */ + uint8 rpc_vers_minor; /* Minor version */ + } dcerpc_bind_nak_version; typedef struct { dcerpc_bind_nak_reason reject_reason; - [switch_is(reject_reason)] dcerpc_bind_nak_versions_ctr versions; + uint8 num_versions; + dcerpc_bind_nak_version versions[num_versions]; + [flag(NDR_REMAINING)] DATA_BLOB _pad; } dcerpc_bind_nak; const uint8 DCERPC_RESPONSE_LENGTH = 24; @@ -200,11 +200,11 @@ interface dcerpc DCERPC_NCA_S_FAULT_NO_CLIENT_STUB = 0x1C000025 } dcerpc_nca_status; - const int DCERPC_FAULT_OP_RNG_ERROR = 0x1c010002; - const int DCERPC_FAULT_UNK_IF = 0x1c010003; + const int DCERPC_FAULT_OP_RNG_ERROR = DCERPC_NCA_S_OP_RNG_ERROR; + const int DCERPC_FAULT_UNK_IF = DCERPC_NCA_S_UNKNOWN_IF; const int DCERPC_FAULT_NDR = 0x000006f7; - const int DCERPC_FAULT_INVALID_TAG = 0x1c000006; - const int DCERPC_FAULT_CONTEXT_MISMATCH = 0x1c00001a; + const int DCERPC_FAULT_INVALID_TAG = DCERPC_NCA_S_FAULT_INVALID_TAG; + const int DCERPC_FAULT_CONTEXT_MISMATCH = DCERPC_NCA_S_FAULT_CONTEXT_MISMATCH; const int DCERPC_FAULT_OTHER = 0x00000001; const int DCERPC_FAULT_ACCESS_DENIED = 0x00000005; const int DCERPC_FAULT_CANT_PERFORM = 0x000006d8; @@ -521,7 +521,7 @@ interface dcerpc /* Cancel was pending at sender */ const int DCERPC_PFC_FLAG_PENDING_CANCEL = DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING; - const ist DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = + const int DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING; /* these offsets are needed by the signing code */ diff --git a/librpc/ndr/ndr_dcerpc.h b/librpc/ndr/ndr_dcerpc.h index f544fb1..1a7c3bd 100644 --- a/librpc/ndr/ndr_dcerpc.h +++ b/librpc/ndr/ndr_dcerpc.h @@ -23,3 +23,7 @@ enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer( struct ndr_pull *ndr, TALLOC_CTX *mem_ctx, struct dcerpc_sec_verification_trailer **_r); + +#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT +#define NDR_DCERPC_REQUEST_OBJECT_PRESENT (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT) +#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */ diff --git a/librpc/rpc/dcerpc_error.c b/librpc/rpc/dcerpc_error.c index 7c98386..4f0ed6e 100644 --- a/librpc/rpc/dcerpc_error.c +++ b/librpc/rpc/dcerpc_error.c @@ -101,15 +101,15 @@ _PUBLIC_ NTSTATUS dcerpc_fault_to_nt_status(uint32_t fault_code) { /* TODO: add more mappings */ switch (fault_code) { - case DCERPC_FAULT_OP_RNG_ERROR: + case DCERPC_NCA_S_OP_RNG_ERROR: return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE; - case DCERPC_FAULT_UNK_IF: + case DCERPC_NCA_S_UNKNOWN_IF: return NT_STATUS_RPC_UNKNOWN_IF; case DCERPC_FAULT_NDR: return NT_STATUS_RPC_BAD_STUB_DATA; - case DCERPC_FAULT_INVALID_TAG: + case DCERPC_NCA_S_FAULT_INVALID_TAG: return NT_STATUS_RPC_ENUM_VALUE_OUT_OF_RANGE; - case DCERPC_FAULT_CONTEXT_MISMATCH: + case DCERPC_NCA_S_FAULT_CONTEXT_MISMATCH: return NT_STATUS_RPC_SS_CONTEXT_MISMATCH; case DCERPC_FAULT_OTHER: return NT_STATUS_RPC_CALL_FAILED; diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index 39884ab..d603176 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -768,6 +768,45 @@ sub Interface($$$) my $dcerpc_typename = $self->import_type_variable("samba.dcerpc.base", "ClientConnection"); $self->register_module_prereadycode(["$if_typename.tp_base = $dcerpc_typename;", ""]); $self->register_module_postreadycode(["if (!PyInterface_AddNdrRpcMethods(&$if_typename, py_ndr_$interface->{NAME}\_methods))", "\treturn;", ""]); + + + $self->pidl("static PyObject *syntax_$interface->{NAME}_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)"); + $self->pidl("{"); + $self->indent; + $self->pidl("return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_table_$interface->{NAME}.syntax_id);"); + $self->deindent; + $self->pidl("}"); + + $self->pidl(""); + + my $signature = "\"abstract_syntax()\\n\""; + + my $docstring = $self->DocString($interface, $interface->{NAME}."_syntax"); + + if ($docstring) { + $docstring = "$signature$docstring"; + } else { + $docstring = $signature; + } + + my $syntax_typename = "$interface->{NAME}_SyntaxType"; + + $self->pidl("static PyTypeObject $syntax_typename = {"); + $self->indent; + $self->pidl("PyObject_HEAD_INIT(NULL) 0,"); + $self->pidl(".tp_name = \"$basename.$interface->{NAME}\","); + $self->pidl(".tp_basicsize = sizeof(pytalloc_Object),"); + $self->pidl(".tp_doc = $docstring,"); + $self->pidl(".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,"); + $self->pidl(".tp_new = syntax_$interface->{NAME}_new,"); + $self->deindent; + $self->pidl("};"); + + $self->pidl(""); + + $self->register_module_typeobject("abstract_syntax", "&$syntax_typename"); + my $ndr_typename = $self->import_type_variable("samba.dcerpc.misc", "ndr_syntax_id"); + $self->register_module_prereadycode(["$syntax_typename.tp_base = $ndr_typename;", ""]); } $self->pidl_hdr("\n"); diff --git a/source4/librpc/rpc/dcerpc_connect.c b/source4/librpc/rpc/dcerpc_connect.c index 6c503ad..da452e6 100644 --- a/source4/librpc/rpc/dcerpc_connect.c +++ b/source4/librpc/rpc/dcerpc_connect.c @@ -43,6 +43,9 @@ struct dcerpc_pipe_connect { const struct ndr_interface_table *interface; struct cli_credentials *creds; struct resolve_context *resolve_ctx; + struct { + const char *dir; + } ncalrpc; }; struct pipe_np_smb_state { @@ -505,7 +508,7 @@ static void continue_pipe_open_ncalrpc(struct composite_context *ctx) the binding structure to determine the endpoint and options */ static struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *mem_ctx, - struct dcerpc_pipe_connect *io, struct loadparm_context *lp_ctx) + struct dcerpc_pipe_connect *io) { struct composite_context *c; struct pipe_ncalrpc_state *s; @@ -531,7 +534,7 @@ static struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *me /* send pipe open request */ pipe_req = dcerpc_pipe_open_pipe_send(s->io.conn, - lpcfg_ncalrpc_dir(lp_ctx), + s->io.ncalrpc.dir, endpoint); composite_continue(c, pipe_req, continue_pipe_open_ncalrpc, c); return c; @@ -608,6 +611,7 @@ static void continue_connect(struct composite_context *c, struct pipe_connect_st uint32_t flags; /* dcerpc pipe connect input parameters */ + ZERO_STRUCT(pc); pc.conn = s->pipe->conn; pc.binding = s->binding; pc.pipe_name = NULL; @@ -646,7 +650,11 @@ static void continue_connect(struct composite_context *c, struct pipe_connect_st return; case NCALRPC: - ncalrpc_req = dcerpc_pipe_connect_ncalrpc_send(c, &pc, s->lp_ctx); + pc.ncalrpc.dir = lpcfg_ncalrpc_dir(s->lp_ctx); + c->status = dcerpc_binding_set_string_option(s->binding, "ncalrpc_dir", + pc.ncalrpc.dir); + if (!composite_is_ok(c)) return; + ncalrpc_req = dcerpc_pipe_connect_ncalrpc_send(c, &pc); composite_continue(c, ncalrpc_req, continue_pipe_connect_ncalrpc, c); return; diff --git a/source4/librpc/rpc/pyrpc.c b/source4/librpc/rpc/pyrpc.c index 140d86c..360fb24 100644 --- a/source4/librpc/rpc/pyrpc.c +++ b/source4/librpc/rpc/pyrpc.c @@ -32,6 +32,8 @@ void initbase(void); staticforward PyTypeObject dcerpc_InterfaceType; +static PyTypeObject *ndr_syntax_id_Type; + static bool PyString_AsGUID(PyObject *object, struct GUID *uuid) { NTSTATUS status; @@ -368,17 +370,67 @@ static PyTypeObject dcerpc_InterfaceType = { .tp_new = dcerpc_interface_new, }; +static PyObject *py_transfer_syntax_ndr_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr); +} + +static PyTypeObject py_transfer_syntax_ndr_SyntaxType = { + PyObject_HEAD_INIT(NULL) 0, + .tp_name = "base.transfer_syntax_ndr", + .tp_basicsize = sizeof(pytalloc_Object), + .tp_doc = "transfer_syntax_ndr()\n", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_new = py_transfer_syntax_ndr_new, +}; + +static PyObject *py_transfer_syntax_ndr64_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + return py_dcerpc_syntax_init_helper(type, args, kwargs, &ndr_transfer_syntax_ndr64); +} + +static PyTypeObject py_transfer_syntax_ndr64_SyntaxType = { + PyObject_HEAD_INIT(NULL) 0, + .tp_name = "base.transfer_syntax_ndr64", + .tp_basicsize = sizeof(pytalloc_Object), + .tp_doc = "transfer_syntax_ndr64()\n", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_new = py_transfer_syntax_ndr64_new, +}; + void initbase(void) { PyObject *m; + PyObject *dep_samba_dcerpc_misc; + + dep_samba_dcerpc_misc = PyImport_ImportModule("samba.dcerpc.misc"); + if (dep_samba_dcerpc_misc == NULL) + return; + + ndr_syntax_id_Type = (PyTypeObject *)PyObject_GetAttrString(dep_samba_dcerpc_misc, "ndr_syntax_id"); + if (ndr_syntax_id_Type == NULL) + return; + + py_transfer_syntax_ndr_SyntaxType.tp_base = ndr_syntax_id_Type; + py_transfer_syntax_ndr64_SyntaxType.tp_base = ndr_syntax_id_Type; if (PyType_Ready(&dcerpc_InterfaceType) < 0) return; + if (PyType_Ready(&py_transfer_syntax_ndr_SyntaxType) < 0) + return; + if (PyType_Ready(&py_transfer_syntax_ndr64_SyntaxType) < 0) + return; + m = Py_InitModule3("base", NULL, "DCE/RPC protocol implementation"); if (m == NULL) return; Py_INCREF((PyObject *)&dcerpc_InterfaceType); PyModule_AddObject(m, "ClientConnection", (PyObject *)&dcerpc_InterfaceType); + + Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType); + PyModule_AddObject(m, "transfer_syntax_ndr", (PyObject *)(void *)&py_transfer_syntax_ndr_SyntaxType); + Py_INCREF((PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType); + PyModule_AddObject(m, "transfer_syntax_ndr64", (PyObject *)(void *)&py_transfer_syntax_ndr64_SyntaxType); } diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h index 52f4f4d..290c988 100644 --- a/source4/librpc/rpc/pyrpc.h +++ b/source4/librpc/rpc/pyrpc.h @@ -56,4 +56,9 @@ union netr_LogonLevel *py_export_netr_LogonLevel(TALLOC_CTX *mem_ctx, int level, union netr_Validation; PyObject *py_import_netr_Validation(TALLOC_CTX *mem_ctx, int level, union netr_Validation *in); + +#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT +#define NDR_DCERPC_REQUEST_OBJECT_PRESENT LIBNDR_FLAG_OBJECT_PRESENT +#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */ + #endif /* _PYRPC_H_ */ diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c index cec8574..314ad2c 100644 --- a/source4/librpc/rpc/pyrpc_util.c +++ b/source4/librpc/rpc/pyrpc_util.c @@ -304,6 +304,28 @@ bool PyInterface_AddNdrRpcMethods(PyTypeObject *ifacetype, const struct PyNdrRpc return true; } +PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, + const struct ndr_syntax_id *syntax) +{ + PyObject *ret; + struct ndr_syntax_id *obj; + const char *kwnames[] = { NULL }; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":abstract_syntax", discard_const_p(char *, kwnames))) { + return NULL; + } + + ret = pytalloc_new(struct ndr_syntax_id, type); + if (ret == NULL) { + return NULL; + } + + obj = (struct ndr_syntax_id *)pytalloc_get_ptr(ret); + *obj = *syntax; + + return ret; +} + void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status) { if (p && NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) { diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h index 837a33b..21454ca 100644 --- a/source4/librpc/rpc/pyrpc_util.h +++ b/source4/librpc/rpc/pyrpc_util.h @@ -50,6 +50,10 @@ bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *type_na bool PyInterface_AddNdrRpcMethods(PyTypeObject *object, const struct PyNdrRpcMethodDef *mds); PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table); +struct ndr_syntax_id; +PyObject *py_dcerpc_syntax_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, + const struct ndr_syntax_id *syntax); + PyObject *py_return_ndr_struct(const char *module_name, const char *type_name, TALLOC_CTX *r_ctx, void *r); diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build index d1019b2..a047f33 100755 --- a/source4/librpc/wscript_build +++ b/source4/librpc/wscript_build @@ -275,6 +275,11 @@ bld.SAMBA_PYTHON('python_dfs', realname='samba/dcerpc/dfs.so' ) +bld.SAMBA_PYTHON('python_dcerpc_dcerpc', + source='../../librpc/gen_ndr/py_dcerpc.c', + deps='NDR_DCERPC pytalloc-util pyrpc_util', + realname='samba/dcerpc/dcerpc.so' + ) bld.SAMBA_PYTHON('python_unixinfo', source='../../librpc/gen_ndr/py_unixinfo.c', diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index a4afde0..cf737c6 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -457,6 +457,7 @@ static void dcesrv_call_set_list(struct dcesrv_call_state *call, static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason) { struct ncacn_packet pkt; + struct dcerpc_bind_nak_version version; struct data_blob_list_item *rep; NTSTATUS status; @@ -467,9 +468,11 @@ static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason) pkt.ptype = DCERPC_PKT_BIND_NAK; pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST; pkt.u.bind_nak.reject_reason = reason; - if (pkt.u.bind_nak.reject_reason == DECRPC_BIND_PROTOCOL_VERSION_NOT_SUPPORTED) { - pkt.u.bind_nak.versions.v.num_versions = 0; - } + version.rpc_vers = 5; + version.rpc_vers_minor = 0; + pkt.u.bind_nak.num_versions = 1; + pkt.u.bind_nak.versions = &version; + pkt.u.bind_nak._pad = data_blob_null; rep = talloc(call, struct data_blob_list_item); if (!rep) { -- Samba Shared Repository