[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Sat Aug 28 02:59:55 MDT 2010


The branch, master has been updated
       via  831611e pidl:Samba4/NDR/Client: support argument based stubs for [in,out,string]
       via  94faf0c pidl:NDR: [in,out,string] doesn't need to pointers
       via  aa3b75a pidl:Samba4/NDR/Client: correctly copy [out,charset()] buffers
       via  eeebaa6 pidl:Samba4/NDR/Client: fix skip reason for unsized arrays
      from  8e6f673 selftest/Subunit.pm: fix perl warnings

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 831611e221d82b8074727fb8e948d0cbe3eb6f0a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 25 11:12:16 2010 +0200

    pidl:Samba4/NDR/Client: support argument based stubs for [in,out,string]
    
    metze

commit 94faf0ccbe061681de0a529b5cfd61da10d5226a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 25 11:02:52 2010 +0200

    pidl:NDR: [in,out,string] doesn't need to pointers
    
    metze

commit aa3b75ad1fa60dbf1ea3bd61782c59b39020b2e3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 25 11:07:29 2010 +0200

    pidl:Samba4/NDR/Client: correctly copy [out,charset()] buffers
    
    If the conversion from CH_UTF16 to CH_UNIX uses multi-byte characters
    in CH_UNIX, we should not silently truncate the string, but return
    an error.
    
    metze

commit eeebaa63f1fe85fe9d58bad50920432263de84c0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 25 11:13:08 2010 +0200

    pidl:Samba4/NDR/Client: fix skip reason for unsized arrays
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 pidl/lib/Parse/Pidl/NDR.pm               |    2 +-
 pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm |  103 +++++++++++++++++++++++-------
 2 files changed, 81 insertions(+), 24 deletions(-)


Changeset truncated at 500 lines:

diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm
index 2358a25..197a929 100644
--- a/pidl/lib/Parse/Pidl/NDR.pm
+++ b/pidl/lib/Parse/Pidl/NDR.pm
@@ -104,7 +104,7 @@ sub GetElementLevelTable($$)
 	if (has_property($e, "out")) {
 		my $needptrs = 1;
 
-		if (has_property($e, "string")) { $needptrs++; }
+		if (has_property($e, "string") and not has_property($e, "in")) { $needptrs++; }
 		if ($#bracket_array >= 0) { $needptrs = 0; }
 
 		warning($e, "[out] argument `$e->{NAME}' not a pointer") if ($needptrs > $e->{POINTERS});
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
index 190bb0d..bd2616a 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
@@ -347,35 +347,89 @@ sub ParseOutputArgument($$$$$$)
 		my $in_env = GenerateFunctionInEnv($fn, $r);
 		my $out_env = GenerateFunctionOutEnv($fn, $r);
 		my $l = $e->{LEVELS}[$level];
-		unless (defined($l->{SIZE_IS})) {
-			fatal($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'");
+
+		my $in_var = undef;
+		if (grep(/in/, @{$e->{DIRECTION}})) {
+			$in_var = ParseExpr($e->{NAME}, $in_env, $e->{ORIGINAL});
+		}
+		my $out_var = ParseExpr($e->{NAME}, $out_env, $e->{ORIGINAL});
+
+		my $in_size_is = undef;
+		my $out_size_is = undef;
+		my $out_length_is = undef;
+
+		my $avail_len = undef;
+		my $needed_len = undef;
+
+		$self->pidl("{");
+		$self->indent;
+		my $copy_len_var = "_copy_len_$e->{NAME}";
+		$self->pidl("size_t $copy_len_var;");
+
+		if (not defined($l->{SIZE_IS})) {
+			if (not $l->{IS_ZERO_TERMINATED}) {
+				fatal($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'");
+			}
+			if (has_property($e, "charset")) {
+				$avail_len = "ndr_charset_length($in_var, CH_UNIX)";
+				$needed_len = "ndr_charset_length($out_var, CH_UNIX)";
+			} else {
+				$avail_len = "ndr_string_length($in_var, sizeof(*$in_var))";
+				$needed_len = "ndr_string_length($out_var, sizeof(*$out_var))";
+			}
+			$in_size_is = "";
+			$out_size_is = "";
+			$out_length_is = "";
 		} else {
-			my $in_size_is = ParseExpr($l->{SIZE_IS}, $in_env, $e->{ORIGINAL});
-			my $out_size_is = ParseExpr($l->{SIZE_IS}, $out_env, $e->{ORIGINAL});
-			my $out_length_is = $out_size_is;
+			$in_size_is = ParseExpr($l->{SIZE_IS}, $in_env, $e->{ORIGINAL});
+			$out_size_is = ParseExpr($l->{SIZE_IS}, $out_env, $e->{ORIGINAL});
+			$out_length_is = $out_size_is;
 			if (defined($l->{LENGTH_IS})) {
 				$out_length_is = ParseExpr($l->{LENGTH_IS}, $out_env, $e->{ORIGINAL});
 			}
-			if ($out_size_is ne $in_size_is) {
-				$self->pidl("if (($out_size_is) > ($in_size_is)) {");
-				$self->indent;
-				$self->ParseInvalidResponse($invalid_response_type);
-				$self->deindent;
-				$self->pidl("}");
-			}
-			if ($out_length_is ne $out_size_is) {
-				$self->pidl("if (($out_length_is) > ($out_size_is)) {");
-				$self->indent;
-				$self->ParseInvalidResponse($invalid_response_type);
-				$self->deindent;
-				$self->pidl("}");
-			}
 			if (has_property($e, "charset")) {
-				$self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));");
-			} else {
-				$self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));");
+				if (defined($in_var)) {
+					$avail_len = "ndr_charset_length($in_var, CH_UNIX)";
+				} else {
+					$avail_len = $out_length_is;
+				}
+				$needed_len = "ndr_charset_length($out_var, CH_UNIX)";
 			}
 		}
+
+		if ($out_size_is ne $in_size_is) {
+			$self->pidl("if (($out_size_is) > ($in_size_is)) {");
+			$self->indent;
+			$self->ParseInvalidResponse($invalid_response_type);
+			$self->deindent;
+			$self->pidl("}");
+		}
+		if ($out_length_is ne $out_size_is) {
+			$self->pidl("if (($out_length_is) > ($out_size_is)) {");
+			$self->indent;
+			$self->ParseInvalidResponse($invalid_response_type);
+			$self->deindent;
+			$self->pidl("}");
+		}
+		if (defined($needed_len)) {
+			$self->pidl("$copy_len_var = $needed_len;");
+			$self->pidl("if ($copy_len_var > $avail_len) {");
+			$self->indent;
+			$self->ParseInvalidResponse($invalid_response_type);
+			$self->deindent;
+			$self->pidl("}");
+		} else {
+			$self->pidl("$copy_len_var = $out_length_is;");
+		}
+
+		if (has_property($e, "charset")) {
+			$self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), $out_var, $copy_len_var * sizeof(*$o$e->{NAME}));");
+		} else {
+			$self->pidl("memcpy($o$e->{NAME}, $out_var, $copy_len_var * sizeof(*$o$e->{NAME}));");
+		}
+
+		$self->deindent;
+		$self->pidl("}");
 	} else {
 		$self->pidl("*$o$e->{NAME} = *${r}out.$e->{NAME};");
 	}
@@ -702,6 +756,9 @@ sub ParseFunction($$$)
 			    $e->{LEVELS}[1]->{DATA_TYPE} eq "string") {
 				$reason = "is a pointer to type 'string'";
 			} elsif ($e->{LEVELS}[1]->{TYPE} eq "ARRAY" and
+				 $e->{LEVELS}[1]->{IS_ZERO_TERMINATED}) {
+				next;
+			} elsif ($e->{LEVELS}[1]->{TYPE} eq "ARRAY" and
 				 not defined($e->{LEVELS}[1]->{SIZE_IS})) {
 				$reason = "is a pointer to an unsized array";
 			} else {
@@ -710,7 +767,7 @@ sub ParseFunction($$$)
 		}
 		if ($e->{LEVELS}[0]->{TYPE} eq "ARRAY") {
 			if (not defined($e->{LEVELS}[0]->{SIZE_IS})) {
-				$reason = "is a pointer to an unsized array";
+				$reason = "is an unsized array";
 			} else {
 				next;
 			}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list