Ignore:
Timestamp:
Nov 12, 2012, 5:18:59 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server 3.5: update branche to 3.5.14

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/samba-3.5.x/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

    r414 r734  
    316316}
    317317
    318 #####################################################################
    319 # parse an array - pull side
    320 sub ParseArrayPullHeader($$$$$$)
     318sub ParseArrayPullGetSize($$$$$$)
    321319{
    322320        my ($self,$e,$l,$ndr,$var_name,$env) = @_;
    323321
    324         my $length;
    325322        my $size;
    326323
    327324        if ($l->{IS_CONFORMANT}) {
    328                 $length = $size = "ndr_get_array_size($ndr, " . get_pointer_to($var_name) . ")";
     325                $size = "ndr_get_array_size($ndr, " . get_pointer_to($var_name) . ")";
    329326        } elsif ($l->{IS_ZERO_TERMINATED} and $l->{SIZE_IS} == 0 and $l->{LENGTH_IS} == 0) { # Noheader arrays
    330                 $length = $size = "ndr_get_string_size($ndr, sizeof(*$var_name))";
     327                $size = "ndr_get_string_size($ndr, sizeof(*$var_name))";
    331328        } else {
    332                 $length = $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},
     329                $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},
    333330                        check_null_pointer($e, $env, sub { $self->pidl(shift); },
    334331                                           "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"),
     
    336333        }
    337334
     335        $self->pidl("size_$e->{NAME}_$l->{LEVEL_INDEX} = $size;");
     336        my $array_size = "size_$e->{NAME}_$l->{LEVEL_INDEX}";
     337
     338        if (my $range = has_property($e, "range")) {
     339                my ($low, $high) = split(/,/, $range, 2);
     340                if ($low < 0) {
     341                        warning(0, "$low is invalid for the range of an array size");
     342                }
     343                if ($low == 0) {
     344                        $self->pidl("if ($array_size > $high) {");
     345                } else {
     346                        $self->pidl("if ($array_size < $low || $array_size > $high) {");
     347                }
     348                $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
     349                $self->pidl("}");
     350        }
     351
     352        return $array_size;
     353}
     354
     355#####################################################################
     356# parse an array - pull side
     357sub ParseArrayPullGetLength($$$$$$;$)
     358{
     359        my ($self,$e,$l,$ndr,$var_name,$env,$array_size) = @_;
     360
     361        if (not defined($array_size)) {
     362                $array_size = $self->ParseArrayPullGetSize($e, $l, $ndr, $var_name, $env);
     363        }
     364
     365        if (not $l->{IS_VARYING}) {
     366                return $array_size;
     367        }
     368
     369        my $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
     370        $self->pidl("length_$e->{NAME}_$l->{LEVEL_INDEX} = $length;");
     371        my $array_length = "length_$e->{NAME}_$l->{LEVEL_INDEX}";
     372
     373        if (my $range = has_property($e, "range")) {
     374                my ($low, $high) = split(/,/, $range, 2);
     375                if ($low < 0) {
     376                        warning(0, "$low is invalid for the range of an array size");
     377                }
     378                if ($low == 0) {
     379                        $self->pidl("if ($array_length > $high) {");
     380                } else {
     381                        $self->pidl("if ($array_length < $low || $array_length > $high) {");
     382                }
     383                $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
     384                $self->pidl("}");
     385        }
     386
     387        return $array_length;
     388}
     389
     390#####################################################################
     391# parse an array - pull side
     392sub ParseArrayPullHeader($$$$$$)
     393{
     394        my ($self,$e,$l,$ndr,$var_name,$env) = @_;
     395
    338396        if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) {
    339397                $self->pidl("NDR_CHECK(ndr_pull_array_size($ndr, " . get_pointer_to($var_name) . "));");
     
    342400        if ($l->{IS_VARYING}) {
    343401                $self->pidl("NDR_CHECK(ndr_pull_array_length($ndr, " . get_pointer_to($var_name) . "));");
    344                 $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
    345         }
    346 
    347         if ($length ne $size) {
    348                 $self->pidl("if ($length > $size) {");
     402        }
     403
     404        my $array_size = $self->ParseArrayPullGetSize($e, $l, $ndr, $var_name, $env);
     405        my $array_length = $self->ParseArrayPullGetLength($e, $l, $ndr, $var_name, $env, $array_size);
     406
     407        if ($array_length ne $array_size) {
     408                $self->pidl("if ($array_length > $array_size) {");
    349409                $self->indent;
    350                 $self->pidl("return ndr_pull_error($ndr, NDR_ERR_ARRAY_SIZE, \"Bad array size %u should exceed array length %u\", $size, $length);");
     410                $self->pidl("return ndr_pull_error($ndr, NDR_ERR_ARRAY_SIZE, \"Bad array size %u should exceed array length %u\", $array_size, $array_length);");
    351411                $self->deindent;
    352412                $self->pidl("}");
     
    378438
    379439        if (ArrayDynamicallyAllocated($e,$l) and not is_charset_array($e,$l)) {
    380                 $self->AllocateArrayLevel($e,$l,$ndr,$var_name,$size);
    381         }
    382 
    383         return $length;
     440                $self->AllocateArrayLevel($e,$l,$ndr,$var_name,$array_size);
     441        }
     442
     443        return $array_length;
    384444}
    385445
     
    866926                $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
    867927
    868                 if (my $range = has_property($e, "range")) {
     928                my $pl = GetPrevLevel($e, $l);
     929
     930                my $range = has_property($e, "range");
     931                if ($range and $pl->{TYPE} ne "ARRAY") {
    869932                        $var_name = get_value_of($var_name);
    870933                        my $signed = Parse::Pidl::Typelist::is_signed($l->{DATA_TYPE});
     
    9971060
    9981061        my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
     1062        my $array_length = undef;
    9991063
    10001064        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
     
    10101074                } elsif ($l->{TYPE} eq "ARRAY") {
    10111075                        my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
     1076                        $array_length = $length;
    10121077
    10131078                        my $nl = GetNextLevel($e, $l);
     
    10661131        } elsif ($l->{TYPE} eq "ARRAY" and
    10671132                        not has_fast_array($e,$l) and not is_charset_array($e, $l)) {
    1068                 my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
     1133                my $length = $array_length;
    10691134                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
    10701135                my $array_name = $var_name;
    10711136
    1072                 if ($l->{IS_VARYING}) {
    1073                         $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
     1137                if (not defined($length)) {
     1138                        $length = $self->ParseArrayPullGetLength($e, $l, $ndr, $var_name, $env);
    10741139                }
    10751140
     
    14791544}
    14801545
    1481 sub DeclareArrayVariables($$)
    1482 {
    1483         my ($self,$e) = @_;
     1546sub DeclareArrayVariables($$;$)
     1547{
     1548        my ($self,$e,$pull) = @_;
    14841549
    14851550        foreach my $l (@{$e->{LEVELS}}) {
     1551                next if ($l->{TYPE} ne "ARRAY");
     1552                if (defined($pull)) {
     1553                        $self->pidl("uint32_t size_$e->{NAME}_$l->{LEVEL_INDEX} = 0;");
     1554                        if ($l->{IS_VARYING}) {
     1555                                $self->pidl("uint32_t length_$e->{NAME}_$l->{LEVEL_INDEX} = 0;");
     1556                        }
     1557                }
    14861558                next if has_fast_array($e,$l);
    14871559                next if is_charset_array($e,$l);
    1488                 if ($l->{TYPE} eq "ARRAY") {
    1489                         $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    1490                 }
     1560                $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    14911561        }
    14921562}
     
    14971567
    14981568        foreach my $l (@{$e->{LEVELS}}) {
     1569                next if ($l->{TYPE} ne "ARRAY");
    14991570                next if has_fast_array($e,$l);
    15001571                next if is_charset_array($e,$l);
    1501                 if ($l->{TYPE} eq "ARRAY") {
    1502                     my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
    1503                     if ($length eq "0") {
     1572                my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
     1573                if ($length eq "0") {
    15041574                        warning($e->{ORIGINAL}, "pointless array cntr: 'cntr_$e->{NAME}_$l->{LEVEL_INDEX}': length=$length");
    1505                     } else {
     1575                } else {
    15061576                        $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    1507                     }
    15081577                }
    15091578        }
     
    15711640        foreach my $e (@{$struct->{ELEMENTS}}) {
    15721641                $self->DeclarePtrVariables($e);
    1573                 $self->DeclareArrayVariables($e);
     1642                $self->DeclareArrayVariables($e, "pull");
    15741643                $self->DeclareMemCtxVariables($e);
    15751644        }
     
    18151884                if ($el->{TYPE} ne "EMPTY") {
    18161885                        $self->indent;
    1817                         $self->DeclarePtrVariables($el);
    1818                         $self->DeclareArrayVariables($el);
    18191886                        if (defined($e->{PROPERTIES}{relative_base})) {
    18201887                                $self->pidl("NDR_CHECK(ndr_pull_align($ndr, $el->{ALIGN}));");
     
    18931960                next if ($double_cases{"$el->{NAME}"});
    18941961                $self->DeclareMemCtxVariables($el);
     1962                $self->DeclarePtrVariables($el);
     1963                $self->DeclareArrayVariables($el, "pull");
    18951964                $double_cases{"$el->{NAME}"} = 1;
    18961965        }
     
    21642233        foreach my $e (@{$fn->{ELEMENTS}}) {
    21652234                $self->DeclarePtrVariables($e);
    2166                 $self->DeclareArrayVariables($e);
     2235                $self->DeclareArrayVariables($e, "pull");
    21672236        }
    21682237
Note: See TracChangeset for help on using the changeset viewer.