[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