summaryrefslogtreecommitdiff
path: root/source4/build
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build')
-rw-r--r--source4/build/pidl/ndr_parser.pm98
-rw-r--r--source4/build/pidl/validator.pm5
2 files changed, 81 insertions, 22 deletions
diff --git a/source4/build/pidl/ndr_parser.pm b/source4/build/pidl/ndr_parser.pm
index 842402f430..6601dc10ff 100644
--- a/source4/build/pidl/ndr_parser.pm
+++ b/source4/build/pidl/ndr_parser.pm
@@ -421,11 +421,10 @@ sub compression_dlen($)
return ParseExpr($e, $dlen, "r->");
}
-sub ParseCompressionPushStart($$$)
+sub ParseCompressionPushStart($$)
{
my $e = shift;
my $subndr = shift;
- my $ndr_flags = shift;
my $comndr = $subndr."_compressed";
pidl "{";
@@ -452,11 +451,10 @@ sub ParseCompressionPushEnd($$)
pidl "}";
}
-sub ParseCompressionPullStart($$$)
+sub ParseCompressionPullStart($$)
{
my $e = shift;
my $subndr = shift;
- my $ndr_flags = shift;
my $comndr = $subndr."_compressed";
my $alg = compression_alg($e);
my $dlen = compression_dlen($e);
@@ -480,28 +478,69 @@ sub ParseCompressionPullEnd($$)
pidl "}";
}
+sub ParseObfuscationPushStart($$)
+{
+ my $e = shift;
+ my $ndr = shift;
+
+ # nothing to do here
+
+ return $ndr;
+}
+
+sub ParseObfuscationPushEnd($$)
+{
+ my $e = shift;
+ my $ndr = shift;
+ my $obfuscation = util::has_property($e, "obfuscation");
+
+ pidl "NDR_CHECK(ndr_push_obfuscation($ndr, $obfuscation));";
+}
+
+sub ParseObfuscationPullStart($$)
+{
+ my $e = shift;
+ my $ndr = shift;
+ my $obfuscation = util::has_property($e, "obfuscation");
+
+ pidl "NDR_CHECK(ndr_pull_obfuscation($ndr, $obfuscation));";
+
+ return $ndr;
+}
+
+sub ParseObfuscationPullEnd($$)
+{
+ my $e = shift;
+ my $ndr = shift;
+
+ # nothing to do here
+}
+
sub ParseSubcontextPushStart($$)
{
my $e = shift;
my $ndr_flags = shift;
my $compression = util::has_property($e, "compression");
- my $retndr;
+ my $obfuscation = util::has_property($e, "obfuscation");
+ my $retndr = "_ndr_$e->{NAME}";
pidl "if (($ndr_flags) & NDR_SCALARS) {";
indent;
- pidl "struct ndr_push *_ndr_$e->{NAME};";
+ pidl "struct ndr_push *$retndr;";
pidl "";
- pidl "_ndr_$e->{NAME} = ndr_push_init_ctx(ndr);";
- pidl "if (!_ndr_$e->{NAME}) return NT_STATUS_NO_MEMORY;";
- pidl "_ndr_$e->{NAME}->flags = ndr->flags;";
+ pidl "$retndr = ndr_push_init_ctx(ndr);";
+ pidl "if (!$retndr) return NT_STATUS_NO_MEMORY;";
+ pidl "$retndr->flags = ndr->flags;";
pidl "";
-
- $retndr = "_ndr_$e->{NAME}";
if (defined $compression) {
- $retndr = ParseCompressionPushStart($e, $retndr, "NDR_SCALARS");
+ $retndr = ParseCompressionPushStart($e, $retndr);
}
-
+
+ if (defined $obfuscation) {
+ $retndr = ParseObfuscationPushStart($e, $retndr);
+ }
+
return $retndr
}
@@ -511,8 +550,13 @@ sub ParseSubcontextPushEnd($)
my $header_size = util::has_property($e, "subcontext");
my $size_is = util::has_property($e, "subcontext_size");
my $compression = util::has_property($e, "compression");
+ my $obfuscation = util::has_property($e, "obfuscation");
my $ndr = "_ndr_$e->{NAME}";
+ if (defined $obfuscation) {
+ ParseObfuscationPushEnd($e, $ndr);
+ }
+
if (defined $compression) {
ParseCompressionPushEnd($e, $ndr);
}
@@ -530,11 +574,12 @@ sub ParseSubcontextPushEnd($)
sub ParseSubcontextPullStart($$)
{
my $e = shift;
- my $ndr_flags = shift;
+ my $ndr_flags = shift;
my $header_size = util::has_property($e, "subcontext");
my $size_is = util::has_property($e, "subcontext_size");
- my $retndr = "_ndr_$e->{NAME}";
my $compression = util::has_property($e, "compression");
+ my $obfuscation = util::has_property($e, "obfuscation");
+ my $retndr = "_ndr_$e->{NAME}";
if (not defined($size_is)) {
$size_is = "-1";
@@ -544,10 +589,14 @@ sub ParseSubcontextPullStart($$)
indent;
pidl "struct ndr_pull *$retndr;";
pidl "NDR_ALLOC(ndr, $retndr);";
- pidl "NDR_CHECK(ndr_pull_subcontext_header(ndr, $header_size, $size_is, $retndr));";
+ pidl "NDR_CHECK(ndr_pull_subcontext_header(ndr, $header_size, $size_is, $retndr));";
if (defined $compression) {
- $retndr = ParseCompressionPullStart($e, $retndr, $ndr_flags);
+ $retndr = ParseCompressionPullStart($e, $retndr);
+ }
+
+ if (defined $obfuscation) {
+ $retndr = ParseObfuscationPullStart($e, $retndr);
}
return $retndr;
@@ -558,20 +607,25 @@ sub ParseSubcontextPullEnd($)
my $e = shift;
my $header_size = util::has_property($e, "subcontext");
my $size_is = util::has_property($e, "subcontext_size");
- my $subndr = "_ndr_$e->{NAME}";
my $compression = util::has_property($e, "compression");
+ my $obfuscation = util::has_property($e, "obfuscation");
+ my $ndr = "_ndr_$e->{NAME}";
+
+ if (defined $obfuscation) {
+ ParseObfuscationPullEnd($e, $ndr);
+ }
if (defined $compression) {
- ParseCompressionPullEnd($e, $subndr);
+ ParseCompressionPullEnd($e, $ndr);
}
my $advance;
if (defined ($size_is)) {
- $advance = "$size_is";
+ $advance = "$size_is";
} elsif ($header_size) {
- $advance = "$subndr->data_size";
+ $advance = "$ndr->data_size";
} else {
- $advance = "$subndr->offset";
+ $advance = "$ndr->offset";
}
pidl "NDR_CHECK(ndr_pull_advance(ndr, $advance));";
deindent;
diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm
index 7bd82f1506..42e9f699dc 100644
--- a/source4/build/pidl/validator.pm
+++ b/source4/build/pidl/validator.pm
@@ -86,6 +86,7 @@ my %property_list = (
"subcontext" => {},
"subcontext_size" => {},
"compression" => {},
+ "obfuscation" => {},
# enum
"enum8bit" => {},
@@ -167,6 +168,10 @@ sub ValidElement($)
fatal(el_name($e) . " : compression() on non-subcontext element");
}
+ if (defined (util::has_property($e, "obfuscation")) and not defined(util::has_property($e, "subcontext"))) {
+ fatal(el_name($e) . " : obfuscation() on non-subcontext element");
+ }
+
if (!$e->{POINTERS} && (
util::has_property($e, "ptr") or
util::has_property($e, "unique") or