pidl: prevent ndr_print_*() dying on NULL pointers
authorAndrew Tridgell <tridge@samba.org>
Thu, 16 Sep 2010 06:57:21 +0000 (16:57 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 16 Sep 2010 11:09:17 +0000 (21:09 +1000)
when using ndrdump you can get uninitialised structures containing
pointers. Don't segfault when trying to print them

librpc/ndr/libndr.h
librpc/ndr/ndr_basic.c
pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index 9134efa17498b99760dfa9d8abc08e2a99b00a2a..5ad05be891b6af77aef7a7a563382f8bfb471222 100644 (file)
@@ -520,6 +520,7 @@ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p);
 enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p);
 enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr);
 void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type);
+void ndr_print_null(struct ndr_print *ndr);
 void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, const char *val, uint32_t value);
 void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
 void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
index 58d4e46e72dd1efdc328b7ef4c4c2f0a863762b9..c27faa2398142e6a6fe1c4c2e77952f5360ea683 100644 (file)
@@ -854,6 +854,11 @@ _PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const ch
        ndr->print(ndr, "%s: struct %s", name, type);
 }
 
+_PUBLIC_ void ndr_print_null(struct ndr_print *ndr)
+{
+       ndr->print(ndr, "UNEXPECTED NULL POINTER");
+}
+
 _PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, 
                    const char *val, uint32_t value)
 {
@@ -1005,6 +1010,11 @@ _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
 {
        int i;
 
+       if (data == NULL) {
+               ndr->print(ndr, "%s: ARRAY(%d) : NULL", name, count);
+               return;
+       }
+
        if (count <= 600 && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
                char s[1202];
                for (i=0;i<count;i++) {
index 83bca288edee8bc760cb82b5943cd48849031382..b389cfbc138ae4fd7cf86e63ae29689d784bfcfb 100644 (file)
@@ -1466,6 +1466,7 @@ sub ParseStructPrint($$$$$)
        $self->DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}});
 
        $self->pidl("ndr_print_struct($ndr, name, \"$name\");");
+       $self->pidl("if (r == NULL) { ndr_print_null($ndr); return; }");
 
        $self->start_flags($struct, $ndr);
 
@@ -2039,6 +2040,7 @@ sub ParseFunctionPrint($$)
        }
 
        $self->pidl("ndr_print_struct($ndr, name, \"$fn->{NAME}\");");
+       $self->pidl("if (r == NULL) { ndr_print_null($ndr); return; }");
        $self->pidl("$ndr->depth++;");
 
        $self->pidl("if (flags & NDR_SET_VALUES) {");