From 1f0ea81ae9ea3ff02b10d0829d1db948bfe4500d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 10 Aug 2004 20:55:42 +0000 Subject: r1703: - Lots of RPC updates, adding new pipes and protocols. - More updates/fixes to the ethereal parser generator (This used to be commit 547f860285b117e291bf3dbaca0707dc268b214e) --- source4/build/pidl/eparser.pm | 43 +++++++++++++++++------------- source4/build/pidl/packet-dcerpc-eparser.c | 25 ++++++++++++++--- source4/build/pidl/packet-dcerpc-eparser.h | 6 ++--- 3 files changed, 49 insertions(+), 25 deletions(-) (limited to 'source4/build/pidl') diff --git a/source4/build/pidl/eparser.pm b/source4/build/pidl/eparser.pm index d84f17ef29..0711790d23 100644 --- a/source4/build/pidl/eparser.pm +++ b/source4/build/pidl/eparser.pm @@ -297,6 +297,9 @@ sub ParseElementPullSwitch($$$) my $cprefix = util::c_pull_prefix($e); + pidl "\t{\n"; + pidl "\t\tguint16 _level;\n"; + my $utype = $structs{$e->{TYPE}}; if (!defined $utype || !util::has_property($utype->{DATA}, "nodiscriminant")) { @@ -304,6 +307,8 @@ sub ParseElementPullSwitch($$$) pidl "\tif (($ndr_flags) & NDR_SCALARS) {\n"; pidl "\t\tndr_pull_level(ndr, tree, hf_level, &_level);\n"; pidl "\t}\n"; + } else { + pidl "\t_level = $switch_var;\n"; } my $sub_size = util::has_property($e, "subcontext"); @@ -312,8 +317,7 @@ sub ParseElementPullSwitch($$$) } else { pidl "\tndr_pull_$e->{TYPE}(ndr, tree, $ndr_flags, _level);\n"; } - - + pidl "\t}\n"; } ##################################################################### @@ -350,6 +354,13 @@ sub ParseElementPullScalar($$) pidl "\tndr_pull_subcontext_flags_fn(ndr, get_subtree(tree, \"$e->{NAME}\", ndr, ett_$e->{TYPE}), $sub_size, (ndr_pull_flags_fn_t) ndr_pull_$e->{TYPE});\n"; } } elsif (util::is_builtin_type($e->{TYPE})) { + $needed{"hf_$e->{NAME}_$e->{TYPE}"} = { + 'name' => $e->{NAME}, + 'type' => $e->{TYPE}, + 'ft' => type2ft($e->{TYPE}), + 'base' => type2base($e->{TYPE}) + }; + pidl "\tndr_pull_$e->{TYPE}(ndr, tree, hf_$e->{NAME}_$e->{TYPE}, &elt_$e->{NAME});\n"; } else { pidl "\tndr_pull_$e->{TYPE}(ndr, get_subtree(tree, \"$e->{NAME}\", ndr, ett_$e->{TYPE}), $ndr_flags);\n"; @@ -512,6 +523,13 @@ sub ParseUnionPull($) pidl "\tndr_pull_struct_start(ndr);\n"; + foreach my $el (@{$e->{DATA}}) { + my $e2 = $el->{DATA}; + if ($e2->{POINTERS}) { + pidl "\tguint32 ptr_$e2->{NAME};\n"; + } + } + # my $align = union_alignment($e); # pidl "\tndr_pull_align(ndr, $align);\n"; @@ -524,19 +542,16 @@ sub ParseUnionPull($) pidl "\tcase $el->{CASE}: {\n"; } if ($el->{TYPE} eq "UNION_ELEMENT") { - my $e2 = $el->{DATA}; - if ($e2->{POINTERS}) { - pidl "\t\tguint32 ptr_$e2->{NAME};\n"; - } ParseElementPullScalar($el->{DATA}, "NDR_SCALARS"); } pidl "\t\tbreak;\n\t}\n"; } if (! $have_default) { - pidl "\tdefault:\n"; + pidl "\tdefault: {\n"; pidl "\t\tproto_tree_add_text(tree, ndr->tvb, ndr->offset, 0, \"Bad switch value %u\", level);\n"; pidl "\t\tif (check_col(ndr->pinfo->cinfo, COL_INFO))\n"; pidl "\t\t\tcol_append_fstr(ndr->pinfo->cinfo, COL_INFO, \", Bad switch value %u\", level);\n"; + pidl "\t}\n"; } pidl "\t}\n"; pidl "buffers:\n"; @@ -544,12 +559,12 @@ sub ParseUnionPull($) pidl "\tswitch (level) {\n"; foreach my $el (@{$e->{DATA}}) { if ($el->{CASE} eq "default") { - pidl "\tdefault:\n"; + pidl "\tdefault: {\n"; } else { pidl "\tcase $el->{CASE}: {\n"; } if ($el->{TYPE} eq "UNION_ELEMENT") { - ParseElementPullBuffer($el->{DATA}, "NDR_BUFFERS"); + ParseElementPullBuffer($el->{DATA}, "NDR_BUFFERS"); } pidl "\t\tbreak;\n\t}\n"; } @@ -654,22 +669,12 @@ sub ParseFunctionElementPull($$) pidl "\tndr_pull_ptr(ndr, tree, hf_ptr, &ptr_$e->{NAME});\n"; pidl "\tif (ptr_$e->{NAME}) {\n"; pidl "\t\tguint32 " . find_size_var($e, util::array_size($e)) . ";\n"; - } elsif ($inout eq "out" && util::has_property($e, "ref")) { - pidl "\tif (r->$inout.$e->{NAME}) {\n"; } else { pidl "\t{\n"; } ParseArrayPull($e, "NDR_SCALARS|NDR_BUFFERS"); pidl "\t}\n"; } else { - if ($inout eq "out" && util::has_property($e, "ref")) { -# pidl "\tif (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {\n"; -# pidl "\tNDR_ALLOC(ndr, r->out.$e->{NAME});\n"; -# pidl "\t}\n"; - } - if ($inout eq "in" && util::has_property($e, "ref")) { -# pidl "\tNDR_ALLOC(ndr, r->in.$e->{NAME});\n"; - } ParseElementPullScalar($e, "NDR_SCALARS|NDR_BUFFERS"); if ($e->{POINTERS}) { diff --git a/source4/build/pidl/packet-dcerpc-eparser.c b/source4/build/pidl/packet-dcerpc-eparser.c index bef5d82646..bf2b6e7981 100644 --- a/source4/build/pidl/packet-dcerpc-eparser.c +++ b/source4/build/pidl/packet-dcerpc-eparser.c @@ -113,14 +113,33 @@ void ndr_pull_uint64(struct e_ndr_pull *ndr, proto_tree *tree, int hf, void ndr_pull_DATA_BLOB(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gDATA_BLOB *h) { - guint32 len1, ofs, len2; - char *data; + guint32 length; if (!(ndr_flags & NDR_SCALARS)) { return; } - /* FIXME */ + if (ndr->flags & LIBNDR_ALIGN_FLAGS) { + if (ndr->flags & LIBNDR_FLAG_ALIGN2) { + length = NDR_ALIGN(ndr, 2); + } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) { + length = NDR_ALIGN(ndr, 4); + } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) { + length = NDR_ALIGN(ndr, 8); + } + if (ndr->data_size - ndr->offset < length) { + length = ndr->data_size - ndr->offset; + } + } else if (ndr->flags & LIBNDR_FLAG_REMAINING) { + length = ndr->data_size - ndr->offset; + } else { + ndr_pull_uint32(ndr, &length); + } + + h->data = g_malloc(length); + proto_tree_add_bytes(tree, hf_bytes_data, ndr->tvb, ndr->offset, length, h->data); + + ndr->offset += length; } void ndr_pull_string(struct e_ndr_pull *ndr, proto_tree *tree, int ndr_flags) diff --git a/source4/build/pidl/packet-dcerpc-eparser.h b/source4/build/pidl/packet-dcerpc-eparser.h index b4cff95b8e..f48badbdf1 100644 --- a/source4/build/pidl/packet-dcerpc-eparser.h +++ b/source4/build/pidl/packet-dcerpc-eparser.h @@ -60,8 +60,8 @@ typedef guint32 gWERROR; typedef struct { - int foobar; - /* FIXME */ + guint8 *data; + guint32 length; } gDATA_BLOB; #include "packet-dcerpc-proto.h" @@ -92,7 +92,7 @@ void ndr_pull_NTTIME(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gNTTIME * void ndr_pull_HYPER_T(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gHYPER_T *data); void ndr_pull_int64(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gint64 *data); void ndr_pull_uint64(struct e_ndr_pull *ndr, proto_tree *tree, int hf, guint64 *data); -void ndr_pull_DATA_BLOB(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gDATA_BLOB *blob); +void ndr_pull_DATA_BLOB(struct e_ndr_pull *ndr, proto_tree *tree, int hf, gDATA_BLOB *data); void ndr_pull_string(struct e_ndr_pull *ndr, proto_tree *tree, int ndr_flags); void ndr_pull_dom_sid2(struct e_ndr_pull *ndr, proto_tree *tree, int flags); -- cgit