Changeset 746 for vendor/current/pidl
- Timestamp:
- Nov 27, 2012, 4:56:06 PM (13 years ago)
- Location:
- vendor/current/pidl/lib/Parse/Pidl
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/pidl/lib/Parse/Pidl/NDR.pm
r740 r746 172 172 my $is_fixed = 0; 173 173 my $is_inline = 0; 174 my $is_to_null = 0; 174 175 175 176 if ($d eq "*") { … … 209 210 } 210 211 212 if (has_property($e, "to_null")) { 213 $is_to_null = 1; 214 } 215 211 216 push (@$order, { 212 217 TYPE => "ARRAY", … … 219 224 IS_CONFORMANT => $is_conformant, 220 225 IS_FIXED => $is_fixed, 221 IS_INLINE => $is_inline 226 IS_INLINE => $is_inline, 227 IS_TO_NULL => $is_to_null 222 228 }); 223 229 } … … 1100 1106 "charset" => ["ELEMENT"], 1101 1107 "length_is" => ["ELEMENT"], 1108 "to_null" => ["ELEMENT"], 1102 1109 ); 1103 1110 -
vendor/current/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
r740 r746 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 … … 1000 1060 1001 1061 my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); 1062 my $array_length = undef; 1002 1063 1003 1064 if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) { … … 1013 1074 } elsif ($l->{TYPE} eq "ARRAY") { 1014 1075 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; 1029 1077 1030 1078 my $nl = GetNextLevel($e, $l); … … 1034 1082 $self->CheckStringTerminator($ndr, $e, $l, $length); 1035 1083 } 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 } 1037 1089 return; 1038 1090 } elsif (has_fast_array($e, $l)) { … … 1088 1140 } elsif ($l->{TYPE} eq "ARRAY" and 1089 1141 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; 1091 1143 my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}"; 1092 1144 my $array_name = $var_name; 1093 1145 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); 1110 1148 } 1111 1149 … … 1524 1562 } 1525 1563 1526 sub DeclareArrayVariables($$ )1527 { 1528 my ($self,$e ) = @_;1564 sub DeclareArrayVariables($$;$) 1565 { 1566 my ($self,$e,$pull) = @_; 1529 1567 1530 1568 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 } 1531 1576 next if has_fast_array($e,$l); 1532 1577 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};"); 1536 1579 } 1537 1580 } … … 1542 1585 1543 1586 foreach my $l (@{$e->{LEVELS}}) { 1587 next if ($l->{TYPE} ne "ARRAY"); 1544 1588 next if has_fast_array($e,$l); 1545 1589 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") { 1549 1592 warning($e->{ORIGINAL}, "pointless array cntr: 'cntr_$e->{NAME}_$l->{LEVEL_INDEX}': length=$length"); 1550 1593 } else { 1551 1594 $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};"); 1552 }1553 1595 } 1554 1596 } … … 1616 1658 foreach my $e (@{$struct->{ELEMENTS}}) { 1617 1659 $self->DeclarePtrVariables($e); 1618 $self->DeclareArrayVariables($e );1660 $self->DeclareArrayVariables($e, "pull"); 1619 1661 $self->DeclareMemCtxVariables($e); 1620 1662 } … … 1879 1921 if ($el->{TYPE} ne "EMPTY") { 1880 1922 $self->indent; 1881 $self->DeclarePtrVariables($el);1882 $self->DeclareArrayVariables($el);1883 1923 if (defined($e->{PROPERTIES}{relative_base})) { 1884 1924 $self->pidl("NDR_CHECK(ndr_pull_align($ndr, $el->{ALIGN}));"); … … 1957 1997 next if ($double_cases{"$el->{NAME}"}); 1958 1998 $self->DeclareMemCtxVariables($el); 1999 $self->DeclarePtrVariables($el); 2000 $self->DeclareArrayVariables($el, "pull"); 1959 2001 $double_cases{"$el->{NAME}"} = 1; 1960 2002 } … … 2322 2364 foreach my $e (@{$fn->{ELEMENTS}}) { 2323 2365 $self->DeclarePtrVariables($e); 2324 $self->DeclareArrayVariables($e );2366 $self->DeclareArrayVariables($e, "pull"); 2325 2367 } 2326 2368
Note:
See TracChangeset
for help on using the changeset viewer.