Changeset 746 for vendor/current/pidl


Ignore:
Timestamp:
Nov 27, 2012, 4:56:06 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated vendor to 3.6.9

Location:
vendor/current/pidl/lib/Parse/Pidl
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/pidl/lib/Parse/Pidl/NDR.pm

    r740 r746  
    172172                my $is_fixed = 0;
    173173                my $is_inline = 0;
     174                my $is_to_null = 0;
    174175
    175176                if ($d eq "*") {
     
    209210                }
    210211
     212                if (has_property($e, "to_null")) {
     213                        $is_to_null = 1;
     214                }
     215
    211216                push (@$order, {
    212217                        TYPE => "ARRAY",
     
    219224                        IS_CONFORMANT => $is_conformant,
    220225                        IS_FIXED => $is_fixed,
    221                         IS_INLINE => $is_inline
     226                        IS_INLINE => $is_inline,
     227                        IS_TO_NULL => $is_to_null
    222228                });
    223229        }
     
    11001106        "charset"               => ["ELEMENT"],
    11011107        "length_is"             => ["ELEMENT"],
     1108        "to_null"               => ["ELEMENT"],
    11021109);
    11031110
  • vendor/current/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

    r740 r746  
    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
     
    10001060
    10011061        my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
     1062        my $array_length = undef;
    10021063
    10031064        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
     
    10131074                } elsif ($l->{TYPE} eq "ARRAY") {
    10141075                        my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
    1015 
    1016                         if (my $range = has_property($e, "range")) {
    1017                                 my ($low, $high) = split(/,/, $range, 2);
    1018                                 if ($low < 0) {
    1019                                         warning(0, "$low is invalid for the range of an array size");
    1020                                 }
    1021                                 if ($low == 0) {
    1022                                         $self->pidl("if ($length > $high) {");
    1023                                 } else {
    1024                                         $self->pidl("if ($length < $low || $length > $high) {");
    1025                                 }
    1026                                 $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
    1027                                 $self->pidl("}");
    1028                         }
     1076                        $array_length = $length;
    10291077
    10301078                        my $nl = GetNextLevel($e, $l);
     
    10341082                                        $self->CheckStringTerminator($ndr, $e, $l, $length);
    10351083                                }
    1036                                 $self->pidl("NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
     1084                                if ($l->{IS_TO_NULL}) {
     1085                                        $self->pidl("NDR_CHECK(ndr_pull_charset_to_null($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
     1086                                } else {
     1087                                        $self->pidl("NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
     1088                                }
    10371089                                return;
    10381090                        } elsif (has_fast_array($e, $l)) {
     
    10881140        } elsif ($l->{TYPE} eq "ARRAY" and
    10891141                        not has_fast_array($e,$l) and not is_charset_array($e, $l)) {
    1090                 my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
     1142                my $length = $array_length;
    10911143                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
    10921144                my $array_name = $var_name;
    10931145
    1094                 if ($l->{IS_VARYING}) {
    1095                         $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")";
    1096                 }
    1097 
    1098                 if (my $range = has_property($e, "range")) {
    1099                         my ($low, $high) = split(/,/, $range, 2);
    1100                         if ($low < 0) {
    1101                                 warning(0, "$low is invalid for the range of an array size");
    1102                         }
    1103                         if ($low == 0) {
    1104                                 $self->pidl("if ($length > $high) {");
    1105                         } else {
    1106                                 $self->pidl("if ($length < $low || $length > $high) {");
    1107                         }
    1108                         $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");");
    1109                         $self->pidl("}");
     1146                if (not defined($length)) {
     1147                        $length = $self->ParseArrayPullGetLength($e, $l, $ndr, $var_name, $env);
    11101148                }
    11111149
     
    15241562}
    15251563
    1526 sub DeclareArrayVariables($$)
    1527 {
    1528         my ($self,$e) = @_;
     1564sub DeclareArrayVariables($$;$)
     1565{
     1566        my ($self,$e,$pull) = @_;
    15291567
    15301568        foreach my $l (@{$e->{LEVELS}}) {
     1569                next if ($l->{TYPE} ne "ARRAY");
     1570                if (defined($pull)) {
     1571                        $self->pidl("uint32_t size_$e->{NAME}_$l->{LEVEL_INDEX} = 0;");
     1572                        if ($l->{IS_VARYING}) {
     1573                                $self->pidl("uint32_t length_$e->{NAME}_$l->{LEVEL_INDEX} = 0;");
     1574                        }
     1575                }
    15311576                next if has_fast_array($e,$l);
    15321577                next if is_charset_array($e,$l);
    1533                 if ($l->{TYPE} eq "ARRAY") {
    1534                         $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    1535                 }
     1578                $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    15361579        }
    15371580}
     
    15421585
    15431586        foreach my $l (@{$e->{LEVELS}}) {
     1587                next if ($l->{TYPE} ne "ARRAY");
    15441588                next if has_fast_array($e,$l);
    15451589                next if is_charset_array($e,$l);
    1546                 if ($l->{TYPE} eq "ARRAY") {
    1547                     my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
    1548                     if ($length eq "0") {
     1590                my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
     1591                if ($length eq "0") {
    15491592                        warning($e->{ORIGINAL}, "pointless array cntr: 'cntr_$e->{NAME}_$l->{LEVEL_INDEX}': length=$length");
    1550                     } else {
     1593                } else {
    15511594                        $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};");
    1552                     }
    15531595                }
    15541596        }
     
    16161658        foreach my $e (@{$struct->{ELEMENTS}}) {
    16171659                $self->DeclarePtrVariables($e);
    1618                 $self->DeclareArrayVariables($e);
     1660                $self->DeclareArrayVariables($e, "pull");
    16191661                $self->DeclareMemCtxVariables($e);
    16201662        }
     
    18791921                if ($el->{TYPE} ne "EMPTY") {
    18801922                        $self->indent;
    1881                         $self->DeclarePtrVariables($el);
    1882                         $self->DeclareArrayVariables($el);
    18831923                        if (defined($e->{PROPERTIES}{relative_base})) {
    18841924                                $self->pidl("NDR_CHECK(ndr_pull_align($ndr, $el->{ALIGN}));");
     
    19571997                next if ($double_cases{"$el->{NAME}"});
    19581998                $self->DeclareMemCtxVariables($el);
     1999                $self->DeclarePtrVariables($el);
     2000                $self->DeclareArrayVariables($el, "pull");
    19592001                $double_cases{"$el->{NAME}"} = 1;
    19602002        }
     
    23222364        foreach my $e (@{$fn->{ELEMENTS}}) {
    23232365                $self->DeclarePtrVariables($e);
    2324                 $self->DeclareArrayVariables($e);
     2366                $self->DeclareArrayVariables($e, "pull");
    23252367        }
    23262368
Note: See TracChangeset for help on using the changeset viewer.