PIDL fix for using external types with wireshark backend
authorronnie sahlberg <ronniesahlberg@gmail.com>
Tue, 6 Oct 2009 06:49:59 +0000 (17:49 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 6 Oct 2009 08:11:51 +0000 (19:11 +1100)
List,

Please review this patch to pidl.

Basically,  we need to process the wireshark conformance file BEFORE
we process the idl file since this file may define external types
and set the alignment for them (using the TYPE directive).
Otherwise pidl will default all external types to use 4byte alignment
which breaks (much more often) on NDR64

regards
ronnie sahlberg

From 8f86903fc353d0906bd82e72ce19c5af09beb001 Mon Sep 17 00:00:00 2001
From: Ronnie Sahlberg <ronniesahlberg@gmail.com>
Date: Mon, 5 Oct 2009 15:22:43 +1100
Subject: [PATCH] In the PIDL wireshark backend, we define external types in the conformance
 file using the TYPE directive.
 If we declare external types here, we must parse this file before we process
 the IDL file, or else these external types will all default to 4byte padding
 (pidl assumes all unknown types are 4byte aligned).

Make sure we read the conformance file and create these new types before
we parse the idl file.

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
pidl/lib/Parse/Pidl/NDR.pm
pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
pidl/lib/Parse/Pidl/Wireshark/NDR.pm
pidl/pidl

index 7c0f7bb7b45f3326e846b14d4b692c3bf6752d87..48a4ccbc95cc895e337f05a6da8be49060795e1b 100644 (file)
@@ -406,6 +406,8 @@ sub align_type($)
 
        if ($dt->{TYPE} eq "TYPEDEF") {
                return align_type($dt->{DATA});
+       } elsif ($dt->{TYPE} eq "CONFORMANCE") {
+               return $dt->{DATA}->{ALIGN};
        } elsif ($dt->{TYPE} eq "ENUM") {
                return align_type(Parse::Pidl::Typelist::enum_type_fn($dt));
        } elsif ($dt->{TYPE} eq "BITMAP") {
index 5c37b4a0c4f8eab2f02851e896d85c7f86ab0c92..1dec647d87d19886f207584c00a6ed690d0ee351 100644 (file)
@@ -110,6 +110,7 @@ use strict;
 
 use Parse::Pidl qw(fatal warning error);
 use Parse::Pidl::Util qw(has_property);
+use Parse::Pidl::Typelist qw(addType);
 
 sub handle_type($$$$$$$$$$)
 {
@@ -149,6 +150,17 @@ sub handle_type($$$$$$$$$$)
                VALSSTRING => $valsstring,
                ALIGNMENT => $alignment
        };
+
+       addType({
+               NAME => $name,
+               TYPE => "CONFORMANCE",
+               BASEFILE => "conformance file",
+               DATA => {
+                       NAME => $name,
+                       TYPE => "CONFORMANCE",
+                       ALIGN => $alignment
+               }
+       });
 }
 
 sub handle_tfs($$$$$)
index a9ad555cca4acfe442c1a6906547308109e75bca..e13e14465cae3a9c28a5f9e868a9fb1fd23f19f2 100644 (file)
@@ -1,5 +1,5 @@
 ##################################################
-# Samba4 NDR parser generator for IDL structures
+# Wireshark NDR parser generator for IDL structures
 # Copyright tridge@samba.org 2000-2003
 # Copyright tpot@samba.org 2001,2005
 # Copyright jelmer@samba.org 2004-2007
@@ -895,7 +895,7 @@ sub Initialize($$)
 sub Parse($$$$$)
 {
        my($self,$ndr,$idl_file,$h_filename,$cnf_file) = @_;
-       
+
        $self->Initialize($cnf_file);
 
        return (undef, undef) if defined($self->{conformance}->{noemit_dissector});
index bc0bb3524bd68eda8d88cc3af516fcdf88b0188d..d0623a06904a7491ea8e9828bb6ebb583debe92f 100755 (executable)
--- a/pidl/pidl
+++ b/pidl/pidl
@@ -653,7 +653,18 @@ sub process_file($)
 
        $pidl = Parse::Pidl::ODL::ODL2IDL($pidl, dirname($idl_file), \@opt_incdirs);
 
-       if (defined($opt_ws_parser) or 
+       if (defined($opt_ws_parser)) {
+         require Parse::Pidl::Wireshark::NDR;
+
+         my $cnffile = $idl_file;
+         $cnffile =~ s/\.idl$/\.cnf/;
+
+         my $generator = new Parse::Pidl::Wireshark::NDR();
+         $generator->Initialize($cnffile);
+       }
+
+
+       if (defined($opt_ws_parser) or
            defined($opt_client) or
            defined($opt_server) or 
            defined($opt_header) or