pidl/NDR/Parser: also do range checks on the array size
authorStefan Metzmacher <metze@samba.org>
Thu, 15 Mar 2012 16:03:05 +0000 (17:03 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 10 Apr 2012 16:21:59 +0000 (18:21 +0200)
metze

Autobuild-User: Karolin Seeger <kseeger@samba.org>
Autobuild-Date: Tue Apr 10 18:21:59 CEST 2012 on sn-devel-104

pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index 541e52926d1a8636f43aad799ba1457e8ad8483c..8eb935bf228f7d404dd3f589f651e194000dc3fe 100644 (file)
@@ -341,6 +341,20 @@ sub ParseArrayPullGetSize($$$$$$)
        $self->pidl("size_$e->{NAME}_$l->{LEVEL_INDEX} = $size;");
        my $array_size = "size_$e->{NAME}_$l->{LEVEL_INDEX}";
 
        $self->pidl("size_$e->{NAME}_$l->{LEVEL_INDEX} = $size;");
        my $array_size = "size_$e->{NAME}_$l->{LEVEL_INDEX}";
 
+       if (my $range = has_property($e, "range")) {
+               my ($low, $high) = split(/,/, $range, 2);
+               if ($low < 0) {
+                       warning(0, "$low is invalid for the range of an array size");
+               }
+               if ($low == 0) {
+                       $self->pidl("if ($array_size > $high) {");
+               } else {
+                       $self->pidl("if ($array_size < $low || $array_size > $high) {");
+               }
+               $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
+               $self->pidl("}");
+       }
+
        return $array_size;
 }
 
        return $array_size;
 }
 
@@ -354,13 +368,14 @@ sub ParseArrayPullGetLength($$$$$$;$)
                $array_size = $self->ParseArrayPullGetSize($e, $l, $ndr, $var_name, $env);
        }
 
                $array_size = $self->ParseArrayPullGetSize($e, $l, $ndr, $var_name, $env);
        }
 
-       my $array_length = $array_size;
-       if ($l->{IS_VARYING}) {
-               my $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
-               $self->pidl("length_$e->{NAME}_$l->{LEVEL_INDEX} = $length;");
-               $array_length = "length_$e->{NAME}_$l->{LEVEL_INDEX}";
+       if (not $l->{IS_VARYING}) {
+               return $array_size;
        }
 
        }
 
+       my $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
+       $self->pidl("length_$e->{NAME}_$l->{LEVEL_INDEX} = $length;");
+       my $array_length = "length_$e->{NAME}_$l->{LEVEL_INDEX}";
+
        if (my $range = has_property($e, "range")) {
                my ($low, $high) = split(/,/, $range, 2);
                if ($low < 0) {
        if (my $range = has_property($e, "range")) {
                my ($low, $high) = split(/,/, $range, 2);
                if ($low < 0) {