The branch, master has been updated
       via  01bb7cff023 ndrdump: check bounds when passed functions/structs by 
integer
       via  3b9e983b648 ndrdump: Fix new "struct" feature
       via  78521577eb1 pidl: Generate compatability wrappers for ndr_print 
functions
       via  1bd1ae0593a pidl: Generate the trailing ndr_table even if the UUID 
is not set
       via  7299b9ba907 librpc: Allow registration of ndr tables with a zero 
UUID
       via  1b6ae21fff9 build: Prepare for pidl to generate ndr_table entries 
for more IDL
       via  dd8dfa16dea s3-build: Skip building the ndr_table at the tail of 
ndr_libnetapi.c
       via  dddef1b8224 pidl: Allow the compilation of the ndr_table to be 
skiped
       via  5e0442efbe7 build: Allow warning on compile of libnetapi PIDL
       via  e45e342624d librpc: Do not include the ndr_table for 
libnet_join.idl and libnetapi.idl in the global list
       via  88c8cd7a1e7 librpc: Do not place the ndr_table for 
windows_event_ids.idl in the global list
       via  88373c472c5 selftest: Add expected-output tests for the ndrdump 
struct mode
       via  dfbb3049585 ndrdump: add --stop-on-parse-failure
       via  a106ceb7bfe librpc: Match interface name and file name for 
bkupblobs.idl
       via  666dbc61f1a librpc: Match interface name and file name for 
winsrepl.idl
       via  8a627b5d65b librpc: Fix typo in "quota" name in IDL
      from  3fea05e01f8 smbd: Remove write cache

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 01bb7cff023719705d7442ae497c52a3f797edf4
Author: Andrew Bartlett <[email protected]>
Date:   Tue Nov 12 12:11:53 2019 +1300

    ndrdump: check bounds when passed functions/structs by integer
    
    The function or struct number should be >= 0 ans the underlying
    number it is compared to is uint32_t.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-programmed-with: Douglas Bagnall <[email protected]>
    
    Autobuild-User(master): Douglas Bagnall <[email protected]>
    Autobuild-Date(master): Wed Nov 13 01:55:33 UTC 2019 on sn-devel-184

commit 3b9e983b648bd3738d8a5e1d53f29cd21ba63387
Author: Andrew Bartlett <[email protected]>
Date:   Tue Nov 5 16:15:38 2019 +1300

    ndrdump: Fix new "struct" feature
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 78521577eb11d2d601768f3c521549793341a450
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 12:15:26 2019 +1300

    pidl: Generate compatability wrappers for ndr_print functions
    
    This creates wrappers that are compatible with the functions called by
    ndrdump which have an extra "int flags" parameter for NDR_IN and
    NDR_OUT.  This will make ndrdump of public structures work again.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 1bd1ae0593a233465cbd5c381199bd0fc2cb476f
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 12:19:29 2019 +1300

    pidl: Generate the trailing ndr_table even if the UUID is not set
    
    This allows ndrdump to dump many more public structures because most
    of these are not in files with a UUID as they are not RPC protocols.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 7299b9ba907d3c55897453ad2102500b94a21b82
Author: Andrew Bartlett <[email protected]>
Date:   Thu Nov 7 11:30:52 2019 +1300

    librpc: Allow registration of ndr tables with a zero UUID
    
    This helps ndrdump find public structures to dump
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Reviewed-by: Douglas Bagnall <[email protected]>

commit 1b6ae21fff9a649d451c30df90f167c33452975c
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 12:20:19 2019 +1300

    build: Prepare for pidl to generate ndr_table entries for more IDL
    
    These IDL files will soon create ndr_table entries so need to be
    linked into the ndr-table subsystem.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit dd8dfa16dea73da3e07c0e84c308f74246cc5d13
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 12:12:02 2019 +1300

    s3-build: Skip building the ndr_table at the tail of ndr_libnetapi.c
    
    This is not a real protocol and all the functions are set to nopull,nopush
    but do not supply replacement functions.
    
    This is the best was I could find to skip compiling the table as otherwise
    it would point to undefined functions.
    
    This does not happen until we generate the ndr_table for idl files without
    a UUID, but we will shortly do that.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit dddef1b8224a2977c6e8b56af83429b36d6119ad
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 12:17:41 2019 +1300

    pidl: Allow the compilation of the ndr_table to be skiped
    
    libnetapi.idl defines a large number of functions a nopull,nopush and
    no replacement is provided.
    
    This will allow the ndr_table to be generated for all other IDL files
    that may have public structures that could usefully be dumped by
    ndrdump.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 5e0442efbe738c1e1d12a237b4c0abe8a472a176
Author: Andrew Bartlett <[email protected]>
Date:   Wed Nov 6 15:33:24 2019 +1300

    build: Allow warning on compile of libnetapi PIDL
    
    This not-protocol only uses the print functions, but this means some other 
functions
    are now unused, and as this is a special case it is better to just allow 
warnings
    here.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Reviewed-by: Douglas Bagnall <[email protected]>

commit e45e342624da1b7f5df42c34c6fdccf32fc7b0e2
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 11:52:27 2019 +1300

    librpc: Do not include the ndr_table for libnet_join.idl and libnetapi.idl 
in the global list
    
    These are not wire protocols, there are no structures to parse.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 88c8cd7a1e7bc48a758bd00e91ca58ca91eed9d0
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 4 11:51:11 2019 +1300

    librpc: Do not place the ndr_table for windows_event_ids.idl in the global 
list
    
    This is just a list of event IDs, there are no structures to parse.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-progammed-with: Douglas Bagnall <[email protected]>

commit 88373c472c52ddc1191c1c20e74bff7776d0e805
Author: Andrew Bartlett <[email protected]>
Date:   Mon Nov 11 16:39:13 2019 +1300

    selftest: Add expected-output tests for the ndrdump struct mode
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14191
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Reviewed-by: Douglas Bagnall <[email protected]>

commit dfbb3049585186230a0d28a581ad22de7276614c
Author: Douglas Bagnall <[email protected]>
Date:   Wed Oct 30 03:05:22 2019 +0000

    ndrdump: add --stop-on-parse-failure
    
    If a data stream fails to parse as an NDR object, the default ndrdump
    action is to try to print those structures anyway, resulting perhaps in
    a NULL dereference. Sometimes you don't want to see that because it isn't
    very interesting and makes it harder to distinguish a crash in the parse
    routines. So --stop-on-parse-failure will skip the print and validate
    stages altogether if the parse failed.
    
    Signed-off-by: Douglas Bagnall <[email protected]>
    Pair-programmed-with: Andrew Bartlett <[email protected]>

commit a106ceb7bfe588b1888001fbba5f500c2d33e5f8
Author: Andrew Bartlett <[email protected]>
Date:   Tue Nov 5 09:46:13 2019 +1300

    librpc: Match interface name and file name for bkupblobs.idl
    
    This helps generate fuzzers for this IDL.
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Reviewed-by: Douglas Bagnall <[email protected]>

commit 666dbc61f1a32f78a4096373e7b94733e06bd86d
Author: Andrew Bartlett <[email protected]>
Date:   Tue Nov 5 10:12:01 2019 +1300

    librpc: Match interface name and file name for winsrepl.idl
    
    This helps generate fuzzers for this IDL.
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    Reviewed-by: Douglas Bagnall <[email protected]>

commit 8a627b5d65b65e926f739272bb8f8191cd1a25b3
Author: Douglas Bagnall <[email protected]>
Date:   Fri Nov 1 17:18:37 2019 +1300

    librpc: Fix typo in "quota" name in IDL
    
    Signed-off-by: Douglas Bagnall <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 librpc/ABI/{ndr-0.2.0.sigs => ndr-0.2.1.sigs}      |   1 +
 librpc/idl/bkupblobs.idl                           |   2 +-
 librpc/idl/quota.idl                               |   2 +-
 librpc/idl/wscript_build                           |   9 +++-
 librpc/ndr/ndr_table.c                             |  26 ++++++++---
 librpc/tools/ndrdump.c                             |  50 ++++++++++++++++++---
 librpc/wscript_build                               |   2 +-
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm           |  46 +++++++++++++++----
 python/samba/tests/blackbox/ndrdump.py             |  28 +++++++++++-
 source3/librpc/idl/wscript_build                   |  11 ++++-
 source3/librpc/wscript_build                       |   4 +-
 source4/librpc/idl/winsrepl.idl                    |   2 +-
 .../tests/dns-decode_dns_name_packet-hex.txt       |  35 +++++++++++++++
 source4/librpc/tests/krb5pac-PAC_DATA.dat          | Bin 0 -> 768 bytes
 source4/librpc/wscript_build                       |  12 +++++
 15 files changed, 203 insertions(+), 27 deletions(-)
 copy librpc/ABI/{ndr-0.2.0.sigs => ndr-0.2.1.sigs} (98%)
 create mode 100644 source4/librpc/tests/dns-decode_dns_name_packet-hex.txt
 create mode 100644 source4/librpc/tests/krb5pac-PAC_DATA.dat


Changeset truncated at 500 lines:

diff --git a/librpc/ABI/ndr-0.2.0.sigs b/librpc/ABI/ndr-0.2.1.sigs
similarity index 98%
copy from librpc/ABI/ndr-0.2.0.sigs
copy to librpc/ABI/ndr-0.2.1.sigs
index 6346f2fb491..b73a463bc8e 100644
--- a/librpc/ABI/ndr-0.2.0.sigs
+++ b/librpc/ABI/ndr-0.2.1.sigs
@@ -255,6 +255,7 @@ ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, 
const struct ndr_syntax
 ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *)
 ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 
0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0
 ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *)
+ndr_table_misc: name = 0xXXXX "misc", syntax_id = {uuid = {time_low = 0, 
time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = 
"\000\000\000\000\000"}, if_version = 0}, helpstring = 0xXXXX, num_calls = 0, 
calls = 0xXXXX <misc_calls>, num_public_structs = 10, public_structs = 0xXXXX 
<misc_public_structs>, endpoints = 0xXXXX <misc_endpoints>, authservices = 
0xXXXX <misc_authservices>
 ndr_token_peek: uint32_t (struct ndr_token_list *, const void *)
 ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list *, const void *, 
uint32_t *)
 ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list *, const 
void *, uint32_t *, comparison_fn_t, bool)
diff --git a/librpc/idl/bkupblobs.idl b/librpc/idl/bkupblobs.idl
index d1ec4a5126f..6e4dd98b103 100644
--- a/librpc/idl/bkupblobs.idl
+++ b/librpc/idl/bkupblobs.idl
@@ -12,7 +12,7 @@ import "fscc.idl";
 ]
 
 
-interface bkup
+interface bkupblobs
 {
        typedef [v1_enum] enum {
                STREAM_ID_DATA  = 1,
diff --git a/librpc/idl/quota.idl b/librpc/idl/quota.idl
index 7c4d00acfcb..8d713c8475a 100644
--- a/librpc/idl/quota.idl
+++ b/librpc/idl/quota.idl
@@ -27,7 +27,7 @@ interface file_quota {
        } file_quota_information;
 }
 
-interface smb2_query_quoata
+interface smb2_query_quota
 {
        /* MS-SMB2 2.2.37.1 */
        typedef [public] struct {
diff --git a/librpc/idl/wscript_build b/librpc/idl/wscript_build
index e17a37255fa..c9b19c4aac4 100644
--- a/librpc/idl/wscript_build
+++ b/librpc/idl/wscript_build
@@ -114,12 +114,19 @@ bld.SAMBA_PIDL_LIST('PIDL',
                     security.idl
                     server_id.idl
                     smb_acl.idl
-                    windows_event_ids.idl
                     xattr.idl
                     ''',
                     options='--header --ndr-parser --python',
                     output_dir='../gen_ndr')
 
+bld.SAMBA_PIDL_LIST('PIDL',
+                   '''
+                    windows_event_ids.idl
+                    ''',
+                    options='--header --ndr-parser --python',
+                    output_dir='../gen_ndr',
+                    generate_tables=False)
+
 bld.SAMBA_PIDL_LIST('PIDL',
                     'winbind.idl',
                     options='--header --ndr-parser --samba3-ndr-server 
--client --python',
diff --git a/librpc/ndr/ndr_table.c b/librpc/ndr/ndr_table.c
index f64e5ac4d20..c386b8c0030 100644
--- a/librpc/ndr/ndr_table.c
+++ b/librpc/ndr/ndr_table.c
@@ -36,12 +36,28 @@ NTSTATUS ndr_table_register(const struct 
ndr_interface_table *table)
        struct ndr_interface_list *l;
 
        for (l = ndr_interfaces; l; l = l->next) {
-               if (GUID_equal(&table->syntax_id.uuid, 
&l->table->syntax_id.uuid)) {
-                       DEBUG(0, ("Attempt to register interface %s which has 
the "
-                                 "same UUID as already registered interface 
%s\n", 
-                                 table->name, l->table->name));
-                       return NT_STATUS_OBJECT_NAME_COLLISION;
+               /*
+                * If no GUID is supplied, use the name to determine
+                * uniquness.
+                */
+               if (GUID_all_zero(&table->syntax_id.uuid)) {
+                       if (strcmp(table->name,
+                                  l->table->name) != 0) {
+                               continue;
+                       }
+                       DBG_ERR("Attempt to register interface %s which has the 
"
+                               "same name as already registered interface\n",
+                               table->name);
+               } else {
+                       if (!GUID_equal(&table->syntax_id.uuid,
+                                       &l->table->syntax_id.uuid)) {
+                               continue;
+                       }
+                       DBG_ERR("Attempt to register interface %s which has the 
"
+                               "same UUID as already registered interface 
%s\n",
+                               table->name, l->table->name);
                }
+               return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
        /*
diff --git a/librpc/tools/ndrdump.c b/librpc/tools/ndrdump.c
index bd4f277607b..4173f03098d 100644
--- a/librpc/tools/ndrdump.c
+++ b/librpc/tools/ndrdump.c
@@ -31,9 +31,17 @@ static const struct ndr_interface_call *find_function(
        const struct ndr_interface_table *p,
        const char *function)
 {
-       int i;
+       unsigned int i;
        if (isdigit(function[0])) {
-               i = strtol(function, NULL, 0);
+               char *eptr = NULL;
+               i = strtoul(function, &eptr, 0);
+               if (i >= p->num_calls
+                   || eptr == NULL
+                   || eptr[0] != '\0') {
+                       printf("Function number '%s' not found\n",
+                              function);
+                       exit(1);
+               }
                return &p->calls[i];
        }
        for (i=0;i<p->num_calls;i++) {
@@ -57,7 +65,19 @@ static const struct ndr_interface_call *find_struct(
        const char *struct_name,
        struct ndr_interface_call *out_buffer)
 {
-       int i;
+       unsigned int i;
+       if (isdigit(struct_name[0])) {
+               char *eptr = NULL;
+               i = strtoul(struct_name, &eptr, 0);
+               if (i >= p->num_public_structs
+                   || eptr == NULL
+                   || eptr[0] != '\0') {
+                       printf("Public structure number '%s' not found\n",
+                              struct_name);
+                       exit(1);
+               }
+               return &p->calls[i];
+       }
        for (i=0;i<p->num_public_structs;i++) {
                if (strcmp(p->public_structs[i].name, struct_name) == 0) {
                        break;
@@ -261,8 +281,18 @@ static void ndr_print_dummy(struct ndr_print *ndr, const 
char *format, ...)
        bool assume_ndr64 = false;
        bool quiet = false;
        bool hex_input = false;
+       bool stop_on_parse_failure = false;
        int opt;
-       enum {OPT_CONTEXT_FILE=1000, OPT_VALIDATE, OPT_DUMP_DATA, OPT_LOAD_DSO, 
OPT_NDR64, OPT_QUIET, OPT_HEX_INPUT};
+       enum {
+               OPT_CONTEXT_FILE=1000,
+               OPT_VALIDATE,
+               OPT_DUMP_DATA,
+               OPT_LOAD_DSO,
+               OPT_NDR64,
+               OPT_QUIET,
+               OPT_HEX_INPUT,
+               OPT_STOP_ON_PARSE_FAILURE,
+       };
        struct poptOption long_options[] = {
                POPT_AUTOHELP
                {"context-file", 'c', POPT_ARG_STRING, NULL, OPT_CONTEXT_FILE, 
"In-filename to parse first", "CTX-FILE" },
@@ -272,6 +302,8 @@ static void ndr_print_dummy(struct ndr_print *ndr, const 
char *format, ...)
                {"ndr64", 0, POPT_ARG_NONE, NULL, OPT_NDR64, "Assume NDR64 
data", NULL },
                {"quiet", 0, POPT_ARG_NONE, NULL, OPT_QUIET, "Don't actually 
dump anything", NULL },
                {"hex-input", 0, POPT_ARG_NONE, NULL, OPT_HEX_INPUT, "Read the 
input file in as a hex dump", NULL },
+               {"stop-on-parse-failure", 0, POPT_ARG_NONE, NULL, 
OPT_STOP_ON_PARSE_FAILURE,
+                "Do not try to print structures that fail to parse.", NULL },
                POPT_COMMON_SAMBA
                POPT_COMMON_VERSION
                { NULL }
@@ -316,6 +348,9 @@ static void ndr_print_dummy(struct ndr_print *ndr, const 
char *format, ...)
                case OPT_HEX_INPUT:
                        hex_input = true;
                        break;
+               case OPT_STOP_ON_PARSE_FAILURE:
+                       stop_on_parse_failure = true;
+                       break;
                }
        }
 
@@ -360,7 +395,7 @@ static void ndr_print_dummy(struct ndr_print *ndr, const 
char *format, ...)
        }
 
        if (strcmp(type, "struct") == 0) {
-               flags = 0; /* neither NDR_IN nor NDR_OUT */
+               flags = NDR_SCALARS|NDR_BUFFERS; /* neither NDR_IN nor NDR_OUT 
*/
                f = find_struct(p, format, &f_buffer);
        } else {
                f = find_function(p, format);
@@ -509,6 +544,11 @@ static void ndr_print_dummy(struct ndr_print *ndr, const 
char *format, ...)
 
        printf("pull returned %s\n", nt_errstr(status));
 
+       if (stop_on_parse_failure  && !NT_STATUS_IS_OK(status)) {
+               printf("not printing because --stop-on-parse-failure\n");
+               exit(1);
+       }
+
        if (ndr_pull->offset > ndr_pull->relative_highest_offset) {
                highest_ofs = ndr_pull->offset;
        } else {
diff --git a/librpc/wscript_build b/librpc/wscript_build
index 5c4bedc5d7b..f5f8a344f64 100644
--- a/librpc/wscript_build
+++ b/librpc/wscript_build
@@ -620,7 +620,7 @@ bld.SAMBA_LIBRARY('ndr',
     public_deps='samba-errors talloc samba-util util_str_hex',
     public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h',
     header_path= [('*gen_ndr*', 'gen_ndr')],
-    vnum='0.2.0',
+    vnum='0.2.1',
     abi_directory='ABI',
     abi_match='ndr_* GUID_*',
     )
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm 
b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 2fc4327faf4..222a8b8c7b4 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -2768,7 +2768,7 @@ sub StructEntry($$)
        $self->pidl("\t\t.struct_size = sizeof($type_decl),");
        $self->pidl("\t\t.ndr_push = (ndr_push_flags_fn_t) 
ndr_push_$d->{NAME},");
        $self->pidl("\t\t.ndr_pull = (ndr_pull_flags_fn_t) 
ndr_pull_$d->{NAME},");
-       $self->pidl("\t\t.ndr_print = (ndr_print_function_t) 
ndr_print_$d->{NAME},");
+       $self->pidl("\t\t.ndr_print = (ndr_print_function_t) 
ndr_print_flags_$d->{NAME},");
        $self->pidl("\t},");
        return 1;
 }
@@ -2788,7 +2788,6 @@ sub FunctionTable($$)
        }
        return if ($#{$interface->{FUNCTIONS}}+1 == 0 and
                   $count_public_structs == 0);
-       return unless defined ($interface->{PROPERTIES}->{uuid});
 
        foreach my $d 
(@{$interface->{INHERITED_FUNCTIONS}},@{$interface->{FUNCTIONS}}) {
                $self->FunctionCallPipes($d);
@@ -2832,16 +2831,18 @@ sub FunctionTable($$)
                $interface->{PROPERTIES}->{authservice} = "\"host\"";
        }
 
-       $self->AuthServiceStruct($interface->{NAME}, 
+       $self->AuthServiceStruct($interface->{NAME},
                                     $interface->{PROPERTIES}->{authservice});
 
        $self->pidl("\nconst struct ndr_interface_table 
ndr_table_$interface->{NAME} = {");
        $self->pidl("\t.name\t\t= \"$interface->{NAME}\",");
-       $self->pidl("\t.syntax_id\t= {");
-       $self->pidl("\t\t" . print_uuid($interface->{UUID}) .",");
-       $self->pidl("\t\tNDR_$uname\_VERSION");
-       $self->pidl("\t},");
-       $self->pidl("\t.helpstring\t= NDR_$uname\_HELPSTRING,");
+       if (defined $interface->{PROPERTIES}->{uuid}) {
+               $self->pidl("\t.syntax_id\t= {");
+               $self->pidl("\t\t" . print_uuid($interface->{UUID}) .",");
+               $self->pidl("\t\tNDR_$uname\_VERSION");
+               $self->pidl("\t},");
+               $self->pidl("\t.helpstring\t= NDR_$uname\_HELPSTRING,");
+       }
        $self->pidl("\t.num_calls\t= $count,");
        $self->pidl("\t.calls\t\t= $interface->{NAME}\_calls,");
        $self->pidl("\t.num_public_structs\t= $count_public_structs,");
@@ -2910,7 +2911,15 @@ sub HeaderInterface($$$)
 
                if(!defined $interface->{PROPERTIES}->{helpstring}) { 
$interface->{PROPERTIES}->{helpstring} = "NULL"; }
                $self->pidl_hdr("#define NDR_$name\_HELPSTRING 
$interface->{PROPERTIES}->{helpstring}");
+       }
 
+       my $count_public_structs = 0;
+       foreach my $d (@{$interface->{TYPES}}) {
+               next unless (has_property($d, "public"));
+               $count_public_structs += 1;
+       }
+       if ($#{$interface->{FUNCTIONS}}+1 > 0 or
+                  $count_public_structs > 0) {
                $self->pidl_hdr("extern const struct ndr_interface_table 
ndr_table_$interface->{NAME};");
        }
 
@@ -3014,6 +3023,18 @@ sub ParseTypePrintFunction($$$)
 
        $self->pidl_hdr("void ".TypeFunctionName("ndr_print", $e)."(struct 
ndr_print *ndr, const char *name, $args);");
 
+       if (has_property($e, "public")) {
+                $self->pidl("static void ".TypeFunctionName("ndr_print_flags", 
$e).
+                             "(struct ndr_print *$ndr, const char *name, int 
unused, $args)"
+                             );
+               $self->pidl("{");
+               $self->indent;
+               $self->pidl(TypeFunctionName("ndr_print", $e)."($ndr, name, 
$varname);");
+               $self->deindent;
+               $self->pidl("}");
+               $self->pidl("");
+       }
+
        return if (has_property($e, "noprint"));
 
        $self->pidl("_PUBLIC_ void ".TypeFunctionName("ndr_print", $e)."(struct 
ndr_print *$ndr, const char *name, $args)");
@@ -3093,7 +3114,16 @@ sub ParseInterface($$$)
                ($needed->{"ndr_print_$d->{NAME}"}) && 
$self->ParseFunctionPrint($d);
        }
 
+        # Allow compilation of generated files where replacement functions
+        # for structures declared nopull/nopush have not been provided.
+        #
+        # This makes sense when only the print functions are used
+        #
+        # Otherwise the ndr_table XXX will reference these
+
+        $self->pidl("#ifndef SKIP_NDR_TABLE_$interface->{NAME}");
        $self->FunctionTable($interface);
+        $self->pidl("#endif /* SKIP_NDR_TABLE_$interface->{NAME} */");
 
        $self->pidl_hdr("#endif /* _HEADER_NDR_$interface->{NAME} */");
 }
diff --git a/python/samba/tests/blackbox/ndrdump.py 
b/python/samba/tests/blackbox/ndrdump.py
index fd1bc832d9b..b8f467f8e82 100644
--- a/python/samba/tests/blackbox/ndrdump.py
+++ b/python/samba/tests/blackbox/ndrdump.py
@@ -62,9 +62,35 @@ class NdrDumpTests(BlackboxTestCase):
                 self.data_path("dns-decode_dns_name_packet-hex.dat")))
 
     def test_ndrdump_with_hex_struct_name(self):
+        expected = 
open(self.data_path("dns-decode_dns_name_packet-hex.txt")).read()
         try:
-            self.check_run(
+            actual = self.check_output(
                 "ndrdump dns dns_name_packet struct --hex-input %s" %
                 self.data_path("dns-decode_dns_name_packet-hex.dat"))
         except BlackboxProcessError as e:
             self.fail(e)
+
+        # check_output will return bytes
+        # convert expected to bytes for python 3
+        self.assertEqual(actual, expected.encode('utf-8'))
+
+    def test_ndrdump_with_binary_struct_name(self):
+        # Prefix of the expected unparsed PAC data (without times, as
+        # these vary by host)
+        expected = '''pull returned NT_STATUS_OK
+    PAC_DATA: struct PAC_DATA
+        num_buffers              : 0x00000005 (5)
+        version                  : 0x00000000 (0)
+        buffers: ARRAY(5)'''
+        try:
+            actual = self.check_output(
+                "ndrdump krb5pac PAC_DATA struct %s" %
+                self.data_path("krb5pac-PAC_DATA.dat"))
+        except BlackboxProcessError as e:
+            self.fail(e)
+
+        # check_output will return bytes
+        # convert expected to bytes for python 3
+        self.assertEqual(actual[:len(expected)],
+                         expected.encode('utf-8'))
+        self.assertTrue(actual.endswith(b"dump OK\n"))
diff --git a/source3/librpc/idl/wscript_build b/source3/librpc/idl/wscript_build
index 183226e5f9b..2c6ec49faec 100644
--- a/source3/librpc/idl/wscript_build
+++ b/source3/librpc/idl/wscript_build
@@ -5,10 +5,17 @@ import os
 topinclude=os.path.join(bld.srcnode.abspath(), 'librpc/idl')
 
 bld.SAMBA_PIDL_LIST('PIDL',
-                    '''libnetapi.idl open_files.idl
-                       perfcount.idl secrets.idl libnet_join.idl
+                    '''open_files.idl
+                       perfcount.idl secrets.idl
                        smbXsrv.idl
                        leases_db.idl
                     ''',
                     options='--includedir=%s --header --ndr-parser' % 
topinclude,
                     output_dir='../gen_ndr')
+
+bld.SAMBA_PIDL_LIST('PIDL',
+                    '''libnetapi.idl libnet_join.idl
+                    ''',
+                    options='--includedir=%s --header --ndr-parser' % 
topinclude,
+                    output_dir='../gen_ndr',
+                    generate_tables=False)
diff --git a/source3/librpc/wscript_build b/source3/librpc/wscript_build
index 92603509311..34cd96bebda 100644
--- a/source3/librpc/wscript_build
+++ b/source3/librpc/wscript_build
@@ -1,8 +1,10 @@
 #!/usr/bin/env python
 
 bld.SAMBA3_SUBSYSTEM('NDR_LIBNETAPI',
+        cflags="-D SKIP_NDR_TABLE_libnetapi",
        source='gen_ndr/ndr_libnetapi.c',
-       public_deps='ndr'
+       public_deps='ndr',
+       allow_warnings=True
        )
 
 bld.SAMBA3_SUBSYSTEM('NDR_LIBNET_JOIN',
diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl
index 23b14990e7d..4ef2e8ef7a7 100644
--- a/source4/librpc/idl/winsrepl.idl
+++ b/source4/librpc/idl/winsrepl.idl
@@ -15,7 +15,7 @@ import "nbt.idl";
        uuid("915f5653-bac1-431c-97ee-9ffb34526921"),
        helpstring("WINS Replication PDUs"),
        helper("../libcli/nbt/libnbt.h")
-] interface wrepl
+] interface winsrepl
 {
        const int WINS_REPLICATION_PORT = 42;
 
diff --git a/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt 
b/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt
new file mode 100644
index 00000000000..a973c28d5b9
--- /dev/null
+++ b/source4/librpc/tests/dns-decode_dns_name_packet-hex.txt
@@ -0,0 +1,35 @@
+pull returned NT_STATUS_OK
+    dns_name_packet: struct dns_name_packet
+        id                       : 0xecef (60655)
+        operation                : 0x2800 (10240)
+            0x00: DNS_RCODE                 (0)
+               0: DNS_FLAG_RECURSION_AVAIL 
+               0: DNS_FLAG_RECURSION_DESIRED
+               0: DNS_FLAG_TRUNCATION      
+               0: DNS_FLAG_AUTHORITATIVE   
+            0x05: DNS_OPCODE                (5)
+               0: DNS_FLAG_REPLY           
+        qdcount                  : 0x0001 (1)
+        ancount                  : 0x0000 (0)
+        nscount                  : 0x0001 (1)
+        arcount                  : 0x0000 (0)
+        questions: ARRAY(1)
+            questions: struct dns_name_question
+                name                     : 'samba2003.example.com'
+                question_type            : DNS_QTYPE_SOA (0x6)
+                question_class           : DNS_QCLASS_IN (0x1)
+        answers: ARRAY(0)
+        nsrecs: ARRAY(1)
+            nsrecs: struct dns_res_rec
+                name                     : 
'cnamedotprefix0.samba2003.example.com'
+                rr_type                  : DNS_QTYPE_CNAME (0x5)
+                rr_class                 : DNS_QCLASS_IN (0x1)
+                ttl                      : 0x00000384 (900)
+                length                   : 0x0013 (19)
+                rdata                    : union dns_rdata(case 0x5)
+                cname_record             : ''
+                unexpected               : DATA_BLOB length=18
+[0000] 0F 62 6E 61 6D 65 64 6F   74 70 72 65 66 69 78 32   .bnamedo tprefix2
+[0010] C0 0C                                              .. 
+        additional: ARRAY(0)
+dump OK
diff --git a/source4/librpc/tests/krb5pac-PAC_DATA.dat 
b/source4/librpc/tests/krb5pac-PAC_DATA.dat
new file mode 100644
index 00000000000..71b48d9d719
Binary files /dev/null and b/source4/librpc/tests/krb5pac-PAC_DATA.dat differ
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
index 23b02604c83..7dab8bcf72d 100644
--- a/source4/librpc/wscript_build
+++ b/source4/librpc/wscript_build
@@ -125,6 +125,18 @@ bld.SAMBA_SUBSYSTEM('ndr-table',
                     NDR_CLUSAPI
                     NDR_WINSPOOL
                     NDR_CAB
+                    NDR_FSRVP_STATE
+                    NDR_IOCTL
+                    NDR_COMPRESSION
+                    NDR_PRINTCAP
+                    NDR_QUOTA
+                    NDR_RAP
+                    NDR_DCERPC
+                    NDR_MESSAGING
+                    NDR_SMB_ACL
+                    NDR_PERFCOUNT
+                    NDR_SECRETS
+                    NDR_LEASES_DB
                     ''',
         depends_on='GEN_NDR_TABLES'
         )


-- 
Samba Shared Repository

Reply via email to