From 4a993c5241c26bbd86f3aba830cb5a5a7a2a6ae7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 5 Jul 2005 12:09:33 +0000 Subject: [PATCH] r8167: - use the same algorithm than w2k3 for 'unique' pointer values - add a new 'sptr' (simple-full) pointer type to simulate what we need to support pipes like epmapper and mgmt that uses 'ptr' full pointer in their spec - I runned make test and test_w2k3.sh with this, all fine does we have any other pipe using 'unique' pointer where we need 'ptr'? btw: jelmer, what does 'ignore' pointers do? they are allowed in pidl but not implemented! metze (This used to be commit d19068bfb2e3ff5d88bc3b76d5cef93417c7f218) --- source4/build/pidl/ndr.pm | 1 + source4/build/pidl/ndr_parser.pm | 10 ++++++++-- source4/build/pidl/validator.pm | 10 ++++++---- source4/librpc/idl/epmapper.idl | 4 ++-- source4/librpc/idl/mgmt.idl | 4 ++-- source4/librpc/ndr/ndr_basic.c | 16 ++++++++++++---- source4/librpc/ndr/ndr_krb5pac.c | 2 +- 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/source4/build/pidl/ndr.pm b/source4/build/pidl/ndr.pm index 2bf673b5e34..c167e783093 100644 --- a/source4/build/pidl/ndr.pm +++ b/source4/build/pidl/ndr.pm @@ -232,6 +232,7 @@ sub pointer_type($) return "ref" if (util::has_property($e, "ref")); return "ptr" if (util::has_property($e, "ptr")); + return "sptr" if (util::has_property($e, "sptr")); return "unique" if (util::has_property($e, "unique")); return "relative" if (util::has_property($e, "relative")); return "ignore" if (util::has_property($e, "ignore")); diff --git a/source4/build/pidl/ndr_parser.pm b/source4/build/pidl/ndr_parser.pm index ba6b9d58da5..7a95babf903 100644 --- a/source4/build/pidl/ndr_parser.pm +++ b/source4/build/pidl/ndr_parser.pm @@ -627,6 +627,8 @@ sub ParsePtrPush($$$) pidl "NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_name));"; } elsif ($l->{POINTER_TYPE} eq "unique") { pidl "NDR_CHECK(ndr_push_unique_ptr(ndr, $var_name));"; + } elsif ($l->{POINTER_TYPE} eq "sptr") { + pidl "NDR_CHECK(ndr_push_sptr_ptr(ndr, $var_name));"; } else { die("Unhandled pointer type $l->{POINTER_TYPE}"); } @@ -947,10 +949,14 @@ sub ParsePtrPull($$$$) } return; - } else { - pidl "NDR_CHECK(ndr_pull_unique_ptr($ndr, &_ptr_$e->{NAME}));"; + } elsif (($l->{POINTER_TYPE} eq "unique") or + ($l->{POINTER_TYPE} eq "relative") or + ($l->{POINTER_TYPE} eq "sptr")) { + pidl "NDR_CHECK(ndr_pull_generic_ptr($ndr, &_ptr_$e->{NAME}));"; pidl "if (_ptr_$e->{NAME}) {"; indent; + } else { + die("Unhandled pointer type $l->{POINTER_TYPE}"); } # Don't do this for arrays, they're allocated at the actual level diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm index fbf7993b208..fe4dc03c4d7 100644 --- a/source4/build/pidl/validator.pm +++ b/source4/build/pidl/validator.pm @@ -83,8 +83,9 @@ my %property_list = ( # pointer "ref" => ["ELEMENT"], "ptr" => ["ELEMENT"], + "sptr" => ["ELEMENT"], "unique" => ["ELEMENT"], - "ignore" => ["ELEMENT"], + "ignore" => ["ELEMENT"], "relative" => ["ELEMENT"], "relative_base" => ["TYPEDEF"], @@ -125,9 +126,9 @@ my %property_list = ( # array "range" => ["ELEMENT"], "size_is" => ["ELEMENT"], - "string" => ["ELEMENT"], - "noheader" => ["ELEMENT"], - "charset" => ["ELEMENT"], + "string" => ["ELEMENT"], + "noheader" => ["ELEMENT"], + "charset" => ["ELEMENT"], "length_is" => ["ELEMENT"], ); @@ -222,6 +223,7 @@ sub ValidElement($) if (!$e->{POINTERS} && ( util::has_property($e, "ptr") or + util::has_property($e, "sptr") or util::has_property($e, "unique") or util::has_property($e, "relative") or util::has_property($e, "ref"))) { diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index 6c0a85024a6..af0bd2483d4 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -14,8 +14,8 @@ http://www.opengroup.org/onlinepubs/9629399/chap6.htm#tagcjh_11_02_03_01: bindin endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]", "ncalrpc:[EPMAPPER]"), helpstring("EndPoint Mapper"), - pointer_default_top(unique), - pointer_default(unique) + pointer_default_top(sptr), + pointer_default(sptr) ] interface epmapper { diff --git a/source4/librpc/idl/mgmt.idl b/source4/librpc/idl/mgmt.idl index 2c4910e677e..23bc09e81d5 100644 --- a/source4/librpc/idl/mgmt.idl +++ b/source4/librpc/idl/mgmt.idl @@ -7,8 +7,8 @@ [ uuid("afa8bd80-7d8a-11c9-bef4-08002b102989"), version(1.0), - pointer_default(unique), - pointer_default_top(unique), + pointer_default(sptr), + pointer_default_top(sptr), endpoint("ncalrpc:[EPMAPPER]", "ncacn_ip_tcp:[135]", "ncacn_np:[\\pipe\\epmapper]"), helpstring("DCE/RPC Remote Management") ] diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c index 0a268ac6c97..8b473724dc8 100644 --- a/source4/librpc/ndr/ndr_basic.c +++ b/source4/librpc/ndr/ndr_basic.c @@ -128,7 +128,7 @@ NTSTATUS ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v) /* parse a pointer referent identifier */ -NTSTATUS ndr_pull_unique_ptr(struct ndr_pull *ndr, uint32_t *v) +NTSTATUS ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v) { NTSTATUS status; status = ndr_pull_uint32(ndr, NDR_SCALARS, v); @@ -563,14 +563,22 @@ NTSTATUS ndr_push_unique_ptr(struct ndr_push *ndr, const void *p) { uint32_t ptr = 0; if (p) { -#if 0 ptr = ndr->ptr_count * 4; ptr |= 0x00020000; ndr->ptr_count++; -#else + } + return ndr_push_uint32(ndr, NDR_SCALARS, ptr); +} + +/* + push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0 +*/ +NTSTATUS ndr_push_sptr_ptr(struct ndr_push *ndr, const void *p) +{ + uint32_t ptr = 0; + if (p) { ndr->ptr_count++; ptr = ndr->ptr_count; -#endif } return ndr_push_uint32(ndr, NDR_SCALARS, ptr); } diff --git a/source4/librpc/ndr/ndr_krb5pac.c b/source4/librpc/ndr/ndr_krb5pac.c index e373189d89a..3af3a185e5b 100644 --- a/source4/librpc/ndr/ndr_krb5pac.c +++ b/source4/librpc/ndr/ndr_krb5pac.c @@ -90,7 +90,7 @@ NTSTATUS ndr_pull_PAC_BUFFER(struct ndr_pull *ndr, int ndr_flags, struct PAC_BUF { uint32_t _flags_save_PAC_INFO = ndr->flags; ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN8); - NDR_CHECK(ndr_pull_unique_ptr(ndr, &_ptr_info)); + NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info)); if (_ptr_info) { NDR_ALLOC(ndr, r->info); NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->info, _ptr_info)); -- 2.34.1