Ignore:
Timestamp:
Jun 29, 2011, 7:36:41 AM (14 years ago)
Author:
Herwig Bauernfeind
Message:

Samba 3.5: Update vendor to version 3.5.6

File:
1 edited

Legend:

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

    r414 r587  
    1616use Parse::Pidl::Util qw(has_property ParseExpr);
    1717use Parse::Pidl::Samba4 qw(DeclLong);
    18 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv);
     18use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv);
    1919
    2020use vars qw($VERSION);
     
    7272}
    7373
    74 sub ParseOutputArgument($$$;$$)
    75 {
    76         my ($self, $fn, $e, $r, $o) = @_;
     74sub ParseInvalidResponse($$)
     75{
     76        my ($self, $type) = @_;
     77
     78        if ($type eq "sync") {
     79                $self->pidl("return NT_STATUS_INVALID_NETWORK_RESPONSE;");
     80        } elsif ($type eq "async") {
     81                $self->pidl("tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);");
     82                $self->pidl("return;");
     83        } else {
     84                die("ParseInvalidResponse($type)");
     85        }
     86}
     87
     88sub ParseOutputArgument($$$;$$$)
     89{
     90        my ($self, $fn, $e, $r, $o, $invalid_response_type) = @_;
    7791        my $level = 0;
    7892        $r = "r." unless defined($r);
    7993        $o = "" unless defined($o);
     94        $invalid_response_type = "sync" unless defined($invalid_response_type);
    8095
    8196        if ($e->{LEVELS}[0]->{TYPE} ne "POINTER" and $e->{LEVELS}[0]->{TYPE} ne "ARRAY") {
     
    98113                # structure, the user should be able to know the size beforehand
    99114                # to allocate a structure of the right size.
    100                 my $env = GenerateFunctionInEnv($fn, $r);
     115                my $in_env = GenerateFunctionInEnv($fn, $r);
     116                my $out_env = GenerateFunctionOutEnv($fn, $r);
    101117                my $l = $e->{LEVELS}[$level];
    102118                unless (defined($l->{SIZE_IS})) {
     119                        $self->pidl('#error No size known for [out] array `$e->{NAME}');
    103120                        error($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'");
    104                         $self->pidl('#error No size known for [out] array `$e->{NAME}');
    105121                } else {
    106                         my $size_is = ParseExpr($l->{SIZE_IS}, $env, $e->{ORIGINAL});
     122                        my $in_size_is = ParseExpr($l->{SIZE_IS}, $in_env, $e->{ORIGINAL});
     123                        my $out_size_is = ParseExpr($l->{SIZE_IS}, $out_env, $e->{ORIGINAL});
     124                        my $out_length_is = $out_size_is;
     125                        if (defined($l->{LENGTH_IS})) {
     126                                $out_length_is = ParseExpr($l->{LENGTH_IS}, $out_env, $e->{ORIGINAL});
     127                        }
     128                        if ($out_size_is ne $in_size_is) {
     129                                $self->pidl("if (($out_size_is) > ($in_size_is)) {");
     130                                $self->indent;
     131                                $self->ParseInvalidResponse($invalid_response_type);
     132                                $self->deindent;
     133                                $self->pidl("}");
     134                        }
     135                        if ($out_length_is ne $out_size_is) {
     136                                $self->pidl("if (($out_length_is) > ($out_size_is)) {");
     137                                $self->indent;
     138                                $self->ParseInvalidResponse($invalid_response_type);
     139                                $self->deindent;
     140                                $self->pidl("}");
     141                        }
    107142                        if (has_property($e, "charset")) {
    108                                 $self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), ${r}out.$e->{NAME}, ($size_is) * sizeof(*$o$e->{NAME}));");
     143                                $self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));");
    109144                        } else {
    110                                 $self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, ($size_is) * sizeof(*$o$e->{NAME}));");
     145                                $self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));");
    111146                        }
    112147                }
     
    282317                next unless (grep(/out/, @{$e->{DIRECTION}}));
    283318
    284                 $self->ParseOutputArgument($fn, $e, "state->tmp.", "state->orig.out.");
     319                $self->ParseOutputArgument($fn, $e,
     320                                           "state->tmp.",
     321                                           "state->orig.out.",
     322                                           "async");
    285323        }
    286324        $self->pidl("");
Note: See TracChangeset for help on using the changeset viewer.