summaryrefslogtreecommitdiff
path: root/source4/pidl/lib/Parse
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2005-10-18 14:12:33 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:44:54 -0500
commit087dd76232b8e7471db5f90fff4e49b2359f1557 (patch)
tree29ca1959191ea3f4e49b7d80bb1bc2837b67b21d /source4/pidl/lib/Parse
parentbf59ef9d72b97b5e972ee84d410db8cbd2e2588e (diff)
downloadsamba-087dd76232b8e7471db5f90fff4e49b2359f1557.tar.gz
samba-087dd76232b8e7471db5f90fff4e49b2359f1557.tar.bz2
samba-087dd76232b8e7471db5f90fff4e49b2359f1557.zip
r11141: Re-add paranoid string terminator check
(This used to be commit 55805b5ed9493160ff17c26d2e1361947f368707)
Diffstat (limited to 'source4/pidl/lib/Parse')
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm30
1 files changed, 21 insertions, 9 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm
index d203c4fa43..0454f90c9a 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm
@@ -923,6 +923,15 @@ sub ParseMemCtxPullEnd($$)
pidl "NDR_PULL_SET_MEM_CTX(ndr, $mem_r_ctx, $mem_r_flags);";
}
+sub CheckStringTerminator($$$$)
+{
+ my ($ndr,$e,$l,$length) = @_;
+ my $nl = GetNextLevel($e, $l);
+
+ # Make sure last element is zero!
+ pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $length, sizeof($nl->{DATA_TYPE}_t)));";
+}
+
sub ParseElementPullLevel
{
my($e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_;
@@ -945,14 +954,16 @@ sub ParseElementPullLevel
my $nl = GetNextLevel($e, $l);
if (is_charset_array($e,$l)) {
+ if ($l->{IS_ZERO_TERMINATED}) {
+ CheckStringTerminator($ndr, $e, $l, $length);
+ }
pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
return;
} elsif (has_fast_array($e, $l)) {
- pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
if ($l->{IS_ZERO_TERMINATED}) {
- # Make sure last element is zero!
- pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, $length, sizeof(*$var_name)));";
+ CheckStringTerminator($ndr,$e,$l,$length);
}
+ pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
return;
}
} elsif ($l->{TYPE} eq "POINTER") {
@@ -1002,16 +1013,17 @@ sub ParseElementPullLevel
ParseMemCtxPullStart($e,$l, $array_name);
if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) {
+ my $nl = GetNextLevel($e,$l);
+
+ if ($l->{IS_ZERO_TERMINATED}) {
+ CheckStringTerminator($ndr,$e,$l,$length);
+ }
+
pidl "for ($counter = 0; $counter < $length; $counter++) {";
indent;
- ParseElementPullLevel($e,GetNextLevel($e,$l), $ndr, $var_name, $env, 1, 0);
+ ParseElementPullLevel($e, $nl, $ndr, $var_name, $env, 1, 0);
deindent;
pidl "}";
-
- if ($l->{IS_ZERO_TERMINATED}) {
- # Make sure last element is zero!
- pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, $length, sizeof(*$var_name)));";
- }
}
if ($deferred and ContainsDeferred($e, $l)) {