summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorronnie sahlberg <ronniesahlberg@gmail.com>2009-10-06 17:49:59 +1100
committerAndrew Tridgell <tridge@samba.org>2009-10-06 19:11:51 +1100
commitd26016c19854142c1e5fbb5a3bfc40e7e4b1c616 (patch)
tree8b6e6a6a312fbeb1c8ccc2989a3db26b969b0f12
parent33347d783aa5aaae3eb90777b06412cbb2cbeca3 (diff)
downloadsamba-d26016c19854142c1e5fbb5a3bfc40e7e4b1c616.tar.gz
samba-d26016c19854142c1e5fbb5a3bfc40e7e4b1c616.tar.bz2
samba-d26016c19854142c1e5fbb5a3bfc40e7e4b1c616.zip
PIDL fix for using external types with wireshark backend
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>
-rw-r--r--pidl/lib/Parse/Pidl/NDR.pm2
-rw-r--r--pidl/lib/Parse/Pidl/Wireshark/Conformance.pm12
-rw-r--r--pidl/lib/Parse/Pidl/Wireshark/NDR.pm4
-rwxr-xr-xpidl/pidl13
4 files changed, 28 insertions, 3 deletions
diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm
index 7c0f7bb7b4..48a4ccbc95 100644
--- a/pidl/lib/Parse/Pidl/NDR.pm
+++ b/pidl/lib/Parse/Pidl/NDR.pm
@@ -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") {
diff --git a/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm b/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
index 5c37b4a0c4..1dec647d87 100644
--- a/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
+++ b/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
@@ -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($$$$$)
diff --git a/pidl/lib/Parse/Pidl/Wireshark/NDR.pm b/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
index a9ad555cca..e13e14465c 100644
--- a/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
+++ b/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
@@ -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});
diff --git a/pidl/pidl b/pidl/pidl
index bc0bb3524b..d0623a0690 100755
--- 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