[SCM] Samba Shared Repository - branch master updated

Jelmer Vernooij jelmer at samba.org
Mon Sep 20 23:40:38 MDT 2010


The branch, master has been updated
       via  58cfbc5 rpc_talloc: Update test now that we create fewer references.
       via  7fc40d2 pytestrpc: Be more verbose.
       via  c4c6f8f s4-pild-python: Fix assignments - even though we reference the mem_ctx of an object we still use the actual ptr.
       via  f161fa3 testrpc: Convert from a single unit test to a simple test script, be more verbose.
       via  a739344 pidl: Fix segfault when accessing unicode objects.
       via  5dd47ee s4-pidl-python: use correct talloc pointer when allocating subobjects.
      from  08cf13a s3:registry: remove now (finally) obsolete reg_util_registry.{c,h}

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


- Log -----------------------------------------------------------------
commit 58cfbc510c7359708d4eae3045085155c912218e
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 22:23:15 2010 -0700

    rpc_talloc: Update test now that we create fewer references.

commit 7fc40d2ed3ab378c409e6f868d75733352ed5ddf
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 21:04:04 2010 -0700

    pytestrpc: Be more verbose.

commit c4c6f8f1755486056f77b9a7f830d10a9ebfb7b0
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 21:02:16 2010 -0700

    s4-pild-python: Fix assignments - even though we reference the mem_ctx
    of an object we still use the actual ptr.

commit f161fa3ac8e437600e64354652114e99edac32bb
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 20:19:16 2010 -0700

    testrpc: Convert from a single unit test to a simple test script, be
    more verbose.

commit a7393449eba9fc5173934096651b2fa232ae6764
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 20:02:21 2010 -0700

    pidl: Fix segfault when accessing unicode objects.

commit 5dd47eeac275d8a9da0a47fda3d71f69ee6c0c4a
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Sep 20 19:54:24 2010 -0700

    s4-pidl-python: use correct talloc pointer when allocating subobjects.

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

Summary of changes:
 lib/talloc/pytalloc.c                              |    9 ---
 lib/talloc/pytalloc.h                              |    2 -
 pidl/lib/Parse/Pidl/Samba4/Python.pm               |   50 +++++++++++-------
 .../python/samba/tests/dcerpc/rpc_talloc.py        |   11 ++---
 .../scripting/python/samba/tests/dcerpc/testrpc.py |   56 +++++++++++++-------
 5 files changed, 70 insertions(+), 58 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/talloc/pytalloc.c b/lib/talloc/pytalloc.c
index c9c6027..054704f 100644
--- a/lib/talloc/pytalloc.c
+++ b/lib/talloc/pytalloc.c
@@ -119,12 +119,3 @@ PyObject *PyString_FromString_check_null(const char *ptr)
 	}
 	return PyString_FromString(ptr);
 }
-
-PyObject *PyUnicode_Decode_check_null(const void *ptr, size_t len,
-				      const char *charset, const char *options)
-{
-	if (ptr == NULL) {
-		Py_RETURN_NONE;
-	}
-	return PyUnicode_Decode(ptr, len, charset, options);
-}
diff --git a/lib/talloc/pytalloc.h b/lib/talloc/pytalloc.h
index caa388a..4782756 100644
--- a/lib/talloc/pytalloc.h
+++ b/lib/talloc/pytalloc.h
@@ -55,7 +55,5 @@ PyObject *py_talloc_default_repr(PyObject *py_obj);
 PyObject *PyCObject_FromTallocPtr(void *);
 
 PyObject *PyString_FromString_check_null(const char *ptr);
-PyObject *PyUnicode_Decode_check_null(const void *ptr, size_t len,
-				      const char *charset, const char *options);
 
 #endif /* _PY_TALLOC_H_ */
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 715a400..d4db4c0 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -159,7 +159,7 @@ sub FromPythonToUnionFunction($$$$$)
 		if ($e->{CASE} eq "default") { $has_default = 1; }
 		$self->indent;
 		if ($e->{NAME}) {
-			$self->ConvertObjectFromPython({}, $mem_ctx, undef, $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
+			$self->ConvertObjectFromPython({}, $mem_ctx, $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
 		}
 		$self->pidl("break;");
 		$self->deindent;
@@ -210,7 +210,6 @@ sub PythonStruct($$$$$$)
 			$self->indent;
 			$self->pidl("$cname *object = ($cname *)py_talloc_get_ptr(py_obj);");
 			my $mem_ctx = "py_talloc_get_mem_ctx(py_obj)";
-			my $mem_ref = "py_talloc_get_ptr(py_obj)";
 			my $l = $e->{LEVELS}[0];
 			my $nl = GetNextLevel($e, $l);
 			if ($l->{TYPE} eq "POINTER" and 
@@ -218,7 +217,7 @@ sub PythonStruct($$$$$$)
 				not ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE}))) {
 				$self->pidl("talloc_unlink(py_talloc_get_mem_ctx(py_obj), $varname);");
 			}
-			$self->ConvertObjectFromPython($env, $mem_ctx, $mem_ref, $e, "value", $varname, "return -1;");
+			$self->ConvertObjectFromPython($env, $mem_ctx, $e, "value", $varname, "return -1;");
 			$self->pidl("return 0;");
 			$self->deindent;
 			$self->pidl("}");
@@ -514,7 +513,7 @@ sub PythonFunctionPackIn($$$)
 				$self->pidl("r->in.$e->{NAME} = $val;");
 			}
 		} else {
-			$self->ConvertObjectFromPython($env, "r", undef, $e, "py_$e->{NAME}", "r->in.$e->{NAME}", $fail);
+			$self->ConvertObjectFromPython($env, "r", $e, "py_$e->{NAME}", "r->in.$e->{NAME}", $fail);
 		}
 	}
 	$self->pidl("return true;");
@@ -833,7 +832,7 @@ sub assign($$$)
 	if ($dest =~ /^\&/ and $src eq "NULL") {
 		$self->pidl("memset($dest, 0, sizeof(" . get_value_of($dest) . "));");
 	} elsif ($dest =~ /^\&/) {
-		$self->pidl("memcpy($dest, $src, sizeof(" . get_value_of($dest) . "));");
+		$self->pidl("memmove($dest, $src, sizeof(" . get_value_of($dest) . "));");
 	} else {
 		$self->pidl("$dest = $src;");
 	}
@@ -895,7 +894,13 @@ sub ConvertObjectFromPythonData($$$$$$;$)
 			return;
 		}
 		$self->pidl("PY_CHECK_TYPE($ctype_name, $cvar, $fail);");
-		$self->assign($target, "talloc_reference($mem_ctx, (".mapTypeName($ctype)." *)py_talloc_get_ptr($cvar))");
+		$self->pidl("if (talloc_reference($mem_ctx, py_talloc_get_mem_ctx($cvar)) == NULL) {");
+		$self->indent;
+		$self->pidl("PyErr_NoMemory();");
+		$self->pidl("$fail");
+		$self->deindent;
+		$self->pidl("}");
+		$self->assign($target, "(".mapTypeName($ctype)." *)py_talloc_get_ptr($cvar)");
 		return;
 	}
 
@@ -945,14 +950,14 @@ sub ConvertObjectFromPythonData($$$$$$;$)
 
 }
 
-sub ConvertObjectFromPythonLevel($$$$$$$$$)
+sub ConvertObjectFromPythonLevel($$$$$$$$)
 {
-	my ($self, $env, $mem_ctx, $mem_ref, $py_var, $e, $l, $var_name, $fail) = @_;
+	my ($self, $env, $mem_ctx, $py_var, $e, $l, $var_name, $fail) = @_;
 	my $nl = GetNextLevel($e, $l);
 
 	if ($l->{TYPE} eq "POINTER") {
 		if ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE})) {
-			$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $mem_ref, $py_var, $e, $nl, $var_name, $fail);
+			$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, $nl, $var_name, $fail);
 			return;
 		}
 		if ($l->{POINTER_TYPE} ne "ref") {
@@ -970,7 +975,7 @@ sub ConvertObjectFromPythonLevel($$$$$$$$$)
 		} else {
 			$self->pidl("$var_name = NULL;");
 		}
-		$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $mem_ref, $py_var, $e, $nl, get_value_of($var_name), $fail);
+		$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, $nl, get_value_of($var_name), $fail);
 		if ($l->{POINTER_TYPE} ne "ref") {
 			$self->deindent;
 			$self->pidl("}");
@@ -995,20 +1000,16 @@ sub ConvertObjectFromPythonLevel($$$$$$$$$)
 				$self->pidl("$var_name = talloc_array_ptrtype($mem_ctx, $var_name, PyList_Size($py_var));");
 				$self->pidl("if (!$var_name) { $fail; }");
 				$self->pidl("talloc_set_name_const($var_name, \"ARRAY: $var_name\");");
-				if ($mem_ref) {
-					$self->pidl("if (!talloc_reference($mem_ref, $var_name)) { $fail }");
-				}
 			}
 			$self->pidl("for ($counter = 0; $counter < PyList_Size($py_var); $counter++) {");
 			$self->indent;
-			$self->ConvertObjectFromPythonLevel($env, $var_name, undef, "PyList_GetItem($py_var, $counter)", $e, GetNextLevel($e, $l), $var_name."[$counter]", $fail);
+			$self->ConvertObjectFromPythonLevel($env, $var_name, "PyList_GetItem($py_var, $counter)", $e, GetNextLevel($e, $l), $var_name."[$counter]", $fail);
 			$self->deindent;
 			$self->pidl("}");
 			$self->deindent;
 			$self->pidl("}");
 		}
 	} elsif ($l->{TYPE} eq "DATA") {
-
 		if (not Parse::Pidl::Typelist::is_scalar($l->{DATA_TYPE})) {
 			$var_name = get_pointer_to($var_name);
 		}
@@ -1026,17 +1027,17 @@ sub ConvertObjectFromPythonLevel($$$$$$$$$)
 		$self->deindent;
 		$self->pidl("}");
 	} elsif ($l->{TYPE} eq "SUBCONTEXT") {
-		$self->ConvertObjectFromPythonLevel($env, $mem_ctx, undef, $py_var, $e, GetNextLevel($e, $l), $var_name, $fail);
+		$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, GetNextLevel($e, $l), $var_name, $fail);
 	} else {
 		fatal($e->{ORIGINAL}, "unknown level type $l->{TYPE}");
 	}
 }
 
-sub ConvertObjectFromPython($$$$$$$$)
+sub ConvertObjectFromPython($$$$$$$)
 {
-	my ($self, $env, $mem_ctx, $mem_ref, $ctype, $cvar, $target, $fail) = @_;
+	my ($self, $env, $mem_ctx, $ctype, $cvar, $target, $fail) = @_;
 
-	$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $mem_ref, $cvar, $ctype, $ctype->{LEVELS}[0], $target, $fail);
+	$self->ConvertObjectFromPythonLevel($env, $mem_ctx, $cvar, $ctype, $ctype->{LEVELS}[0], $target, $fail);
 }
 
 sub ConvertScalarToPython($$$)
@@ -1157,7 +1158,16 @@ sub ConvertObjectToPythonLevel($$$$$$)
 
 		if (is_charset_array($e, $l)) {
 			# FIXME: Use Unix charset setting rather than utf-8
-			$self->pidl("$py_var = PyUnicode_Decode_check_null($var_name, strlen($var_name), \"utf-8\", \"ignore\");");
+			$self->pidl("if ($var_name == NULL) {");
+			$self->indent;
+			$self->pidl("$py_var = Py_None;");
+			$self->pidl("Py_INCREF($py_var);");
+			$self->deindent;
+			$self->pidl("} else {");
+			$self->indent;
+			$self->pidl("$py_var = PyUnicode_Decode($var_name, strlen($var_name), \"utf-8\", \"ignore\");");
+			$self->deindent;
+			$self->pidl("}");
 		} else {
 			die("No SIZE_IS for array $var_name") unless (defined($l->{SIZE_IS}));
 			my $length = $l->{SIZE_IS};
diff --git a/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py b/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py
index 6dd3d07..5058e08 100755
--- a/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py
+++ b/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py
@@ -23,7 +23,6 @@ samba.talloc_enable_null_tracking()
 class TallocTests(samba.tests.TestCase):
     '''test talloc behaviour of pidl generated python code'''
 
-
     def check_blocks(self, object, num_expected):
         '''check that the number of allocated blocks is correct'''
         nblocks = samba.talloc_total_blocks(object)
@@ -31,7 +30,6 @@ class TallocTests(samba.tests.TestCase):
             nblocks -= self.initial_blocks
         self.assertEquals(nblocks, num_expected)
 
-
     def get_rodc_partial_attribute_set(self):
         '''get a list of attributes for RODC replication'''
         partial_attribute_set = drsuapi.DsPartialAttributeSet()
@@ -46,22 +44,21 @@ class TallocTests(samba.tests.TestCase):
 
         # we expect one block object, a structure, an ARRAY, and a
         # reference to the array
-        self.check_blocks(partial_attribute_set, 4)
+        self.check_blocks(partial_attribute_set, 3)
 
         return partial_attribute_set
 
     def pas_test(self):
         pas = self.get_rodc_partial_attribute_set()
-        self.check_blocks(pas, 4)
+        self.check_blocks(pas, 3)
         req8 = drsuapi.DsGetNCChangesRequest8()
         self.check_blocks(req8, 2)
-        self.check_blocks(None, 6)
+        self.check_blocks(None, 5)
         req8.partial_attribute_set = pas
         if req8.partial_attribute_set.attids[1] != 2:
             raise Exception("Wrong value in attids[2]")
         # we now get an additional reference
-        samba.talloc_report_full(None)
-        self.check_blocks(None, 7)
+        self.check_blocks(None, 6)
 
     def test_run(self):
         self.initial_blocks = samba.talloc_total_blocks(None)
diff --git a/source4/scripting/python/samba/tests/dcerpc/testrpc.py b/source4/scripting/python/samba/tests/dcerpc/testrpc.py
index 71c1341..d432d5a 100644
--- a/source4/scripting/python/samba/tests/dcerpc/testrpc.py
+++ b/source4/scripting/python/samba/tests/dcerpc/testrpc.py
@@ -13,7 +13,7 @@ from samba.dcerpc import drsuapi
 
 samba.talloc_enable_null_tracking()
 
-class RpcTests(samba.tests.TestCase):
+class RpcTests(object):
     '''test type behaviour of pidl generated python RPC code'''
 
     def check_blocks(self, object, num_expected):
@@ -21,7 +21,9 @@ class RpcTests(samba.tests.TestCase):
         nblocks = samba.talloc_total_blocks(object)
         if object is None:
             nblocks -= self.initial_blocks
-        self.assertEquals(nblocks, num_expected)
+        leaked_blocks = (nblocks - num_expected)
+        if leaked_blocks != 0:
+            print "Leaked %d blocks" % leaked_blocks
 
     def check_type(self, interface, typename, type):
         print "Checking type %s" % typename
@@ -43,28 +45,34 @@ class RpcTests(samba.tests.TestCase):
                     continue
                 else:
                     print "ERROR: Failed to instantiate %s.%s" % (typename, n)
-                    raise
+                    self.errcount += 1
+                    continue
             except:
                 print "ERROR: Failed to instantiate %s.%s" % (typename, n)
-                raise
+                self.errcount += 1
+                continue
 
             # now try setting the value back
             try:
                 print "Setting %s.%s" % (typename, n)
                 setattr(v, n, value)
-            except:
-                print "ERROR: Failed to set %s.%s" % (typename, n)
-                raise
+            except Exception, e:
+                if isinstance(e, AttributeError) and str(e).endswith("is read-only"):
+                    # readonly, ignore
+                    continue
+                else:
+                    print "ERROR: Failed to set %s.%s: %r: %s" % (typename, n, e.__class__, e)
+                    self.errcount += 1
+                    continue
 
             # and try a comparison
             try:
                 if value != getattr(v, n):
-                    print "ERROR: Comparison failed for %s.%s" % (typename, n)
-                    raise
-            except:
-                print "ERROR: compare exception for %s.%s" % (typename, n)
-                raise
-
+                    print "ERROR: Comparison failed for %s.%s: %r != %r" % (typename, n, value, getattr(v, n))
+                    continue
+            except Exception, e:
+                print "ERROR: compare exception for %s.%s: %r: %s" % (typename, n, e.__class__, e)
+                continue
 
     def check_interface(self, interface, iname):
         errcount = self.errcount
@@ -76,7 +84,7 @@ class RpcTests(samba.tests.TestCase):
             if isinstance(value, str):
                 #print "%s=\"%s\"" % (n, value)
                 pass
-            elif isinstance(value, int):
+            elif isinstance(value, int) or isinstance(value, long):
                 #print "%s=%d" % (n, value)
                 pass
             elif isinstance(value, type):
@@ -84,16 +92,16 @@ class RpcTests(samba.tests.TestCase):
                     initial_blocks = samba.talloc_total_blocks(None)
                     self.check_type(interface, n, value)
                     self.check_blocks(None, initial_blocks)
-                except:
-                    print "ERROR: Failed to check_type %s.%s" % (iname, n)
+                except Exception, e:
+                    print "ERROR: Failed to check_type %s.%s: %r: %s" % (iname, n, e.__class__, e)
                     self.errcount += 1
-                    pass
+            elif callable(value):
+                pass # Method
             else:
                 print "UNKNOWN: %s=%s" % (n, value)
         if self.errcount - errcount != 0:
             print "Found %d errors in %s" % (self.errcount - errcount, iname)
 
-
     def check_all_interfaces(self):
         for iname in dir(samba.dcerpc):
             if iname[0] == '_':
@@ -106,8 +114,16 @@ class RpcTests(samba.tests.TestCase):
             self.check_interface(iface, iname)
             self.check_blocks(None, initial_blocks)
 
-    def test_run(self):
+    def run(self):
         self.initial_blocks = samba.talloc_total_blocks(None)
         self.errcount = 0
         self.check_all_interfaces()
-        self.assertEquals(self.errcount, 0)
+        return self.errcount
+
+tests = RpcTests()
+errcount = tests.run()
+if errcount == 0:
+    sys.exit(0)
+else:
+    print "%d failures" % errcount
+    sys.exit(1)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list