r8167: - use the same algorithm than w2k3 for 'unique' pointer values
authorStefan Metzmacher <metze@samba.org>
Tue, 5 Jul 2005 12:09:33 +0000 (12:09 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:16 +0000 (13:19 -0500)
- 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
source4/build/pidl/ndr_parser.pm
source4/build/pidl/validator.pm
source4/librpc/idl/epmapper.idl
source4/librpc/idl/mgmt.idl
source4/librpc/ndr/ndr_basic.c
source4/librpc/ndr/ndr_krb5pac.c

index 2bf673b5e34c78e99d4bccab12d4c2aa3730ba32..c167e783093d6810421164b7a7f7d32cbc27ecf3 100644 (file)
@@ -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"));
index ba6b9d58da54b03c564a1f0ecead936169188ef8..7a95babf9030ae5a909da911f0a998f520b186c0 100644 (file)
@@ -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 
index fbf7993b208931b7cde3528137d3b2ad63815dfa..fe4dc03c4d708fd75244f5f44989999ac7191b07 100644 (file)
@@ -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"))) {
index 6c0a85024a6bdd5e654788d6c603a33fc1a8759c..af0bd2483d4985ed4069f1654d30109d7cc55489 100644 (file)
@@ -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
 {
index 2c4910e677e802734a56d24d88d324d679e089fd..23bc09e81d5a3457068db447660928f18ba78735 100644 (file)
@@ -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")
 ] 
index 0a268ac6c976364e21d1099767d48579f734449a..8b473724dc8b9308486c549a09deac6ffd5f191b 100644 (file)
@@ -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);
 }
index e373189d89ae42e09ccceca1b32dace723906883..3af3a185e5bda3f88107ac1f659e7e385aa29803 100644 (file)
@@ -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));