Changeset 734 for branches/samba-3.5.x/pidl/lib/Parse
- Timestamp:
- Nov 12, 2012, 5:18:59 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.5.x/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
r414 r734 316 316 } 317 317 318 ##################################################################### 319 # parse an array - pull side 320 sub ParseArrayPullHeader($$$$$$) 318 sub ParseArrayPullGetSize($$$$$$) 321 319 { 322 320 my ($self,$e,$l,$ndr,$var_name,$env) = @_; 323 321 324 my $length;325 322 my $size; 326 323 327 324 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) . ")"; 329 326 } 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))"; 331 328 } else { 332 $ length = $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},329 $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL}, 333 330 check_null_pointer($e, $env, sub { $self->pidl(shift); }, 334 331 "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"), … … 336 333 } 337 334 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 357 sub 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 392 sub ParseArrayPullHeader($$$$$$) 393 { 394 my ($self,$e,$l,$ndr,$var_name,$env) = @_; 395 338 396 if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) { 339 397 $self->pidl("NDR_CHECK(ndr_pull_array_size($ndr, " . get_pointer_to($var_name) . "));"); … … 342 400 if ($l->{IS_VARYING}) { 343 401 $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) {"); 349 409 $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);"); 351 411 $self->deindent; 352 412 $self->pidl("}"); … … 378 438 379 439 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; 384 444 } 385 445 … … 866 926 $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));"); 867 927 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") { 869 932 $var_name = get_value_of($var_name); 870 933 my $signed = Parse::Pidl::Typelist::is_signed($l->{DATA_TYPE}); … … 997 1060 998 1061 my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); 1062 my $array_length = undef; 999 1063 1000 1064 if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) { … … 1010 1074 } elsif ($l->{TYPE} eq "ARRAY") { 1011 1075 my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env); 1076 $array_length = $length; 1012 1077 1013 1078 my $nl = GetNextLevel($e, $l); … … 1066 1131 } elsif ($l->{TYPE} eq "ARRAY" and 1067 1132 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; 1069 1134 my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}"; 1070 1135 my $array_name = $var_name; 1071 1136 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); 1074 1139 } 1075 1140 … … 1479 1544 } 1480 1545 1481 sub DeclareArrayVariables($$ )1482 { 1483 my ($self,$e ) = @_;1546 sub DeclareArrayVariables($$;$) 1547 { 1548 my ($self,$e,$pull) = @_; 1484 1549 1485 1550 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 } 1486 1558 next if has_fast_array($e,$l); 1487 1559 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};"); 1491 1561 } 1492 1562 } … … 1497 1567 1498 1568 foreach my $l (@{$e->{LEVELS}}) { 1569 next if ($l->{TYPE} ne "ARRAY"); 1499 1570 next if has_fast_array($e,$l); 1500 1571 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") { 1504 1574 warning($e->{ORIGINAL}, "pointless array cntr: 'cntr_$e->{NAME}_$l->{LEVEL_INDEX}': length=$length"); 1505 1575 } else { 1506 1576 $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};"); 1507 }1508 1577 } 1509 1578 } … … 1571 1640 foreach my $e (@{$struct->{ELEMENTS}}) { 1572 1641 $self->DeclarePtrVariables($e); 1573 $self->DeclareArrayVariables($e );1642 $self->DeclareArrayVariables($e, "pull"); 1574 1643 $self->DeclareMemCtxVariables($e); 1575 1644 } … … 1815 1884 if ($el->{TYPE} ne "EMPTY") { 1816 1885 $self->indent; 1817 $self->DeclarePtrVariables($el);1818 $self->DeclareArrayVariables($el);1819 1886 if (defined($e->{PROPERTIES}{relative_base})) { 1820 1887 $self->pidl("NDR_CHECK(ndr_pull_align($ndr, $el->{ALIGN}));"); … … 1893 1960 next if ($double_cases{"$el->{NAME}"}); 1894 1961 $self->DeclareMemCtxVariables($el); 1962 $self->DeclarePtrVariables($el); 1963 $self->DeclareArrayVariables($el, "pull"); 1895 1964 $double_cases{"$el->{NAME}"} = 1; 1896 1965 } … … 2164 2233 foreach my $e (@{$fn->{ELEMENTS}}) { 2165 2234 $self->DeclarePtrVariables($e); 2166 $self->DeclareArrayVariables($e );2235 $self->DeclareArrayVariables($e, "pull"); 2167 2236 } 2168 2237
Note:
See TracChangeset
for help on using the changeset viewer.