[SCM] Samba Shared Repository - branch master updated

Jelmer Vernooij jelmer at samba.org
Wed Sep 22 18:48:27 MDT 2010


The branch, master has been updated
       via  7e31704 selftest: Remove unused --analyse argument.
       via  1716cdb dsdb: Use short path for ldb_handlers.h, in case ldb is installed in the system.
       via  8dd0c8c ldb: Use waf as default build system.
       via  c031329 ldb: Depend directly on replace, fixes the build on systems with tdb and tevent installed in the system.
       via  1c3c9a4 s4-param: Fix more memory leaks, invalid memory context.
       via  5b10c82 s3-selftest: Fix test prefixes in subunit output.
       via  3fea9df s4-param: Check type when converting python object to lp_ctx, fix some memory leaks.
       via  63031a2 pygensec: Implement start_mech_by_name().
       via  6abe823 subunithelper: Cope with errors outside of testsuites.
       via  5a75fb1 ndrdump: Move blackbox test to standard python namespace.
       via  18f10ee s4/selftest: Simplify running of python tests.
       via  31d5ac0 selftest: Let tests add prefix to tests by themselve.
      from  54f0da3 s3: Use asprintf where appropriate

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


- Log -----------------------------------------------------------------
commit 7e31704762b63ac580f3b778520d9f5f7d212cbe
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 17:47:28 2010 -0700

    selftest: Remove unused --analyse argument.

commit 1716cdbef36b7905c08d89de1ca3de4b61e3fe0f
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 17:17:42 2010 -0700

    dsdb: Use short path for ldb_handlers.h, in case ldb is installed in the
    system.

commit 8dd0c8c5460c6f16367a4a73f0ce4b27d5acab4f
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 17:17:25 2010 -0700

    ldb: Use waf as default build system.

commit c031329af1f4300237ba200a4d6ff5eb041d8e3d
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 17:15:38 2010 -0700

    ldb: Depend directly on replace, fixes the build on systems with
    tdb and tevent installed in the system.

commit 1c3c9a483be6d63b8efb67bfd2c04ef9302ccce6
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 16:44:17 2010 -0700

    s4-param: Fix more memory leaks, invalid memory context.

commit 5b10c82a5837073836fcf04152a6f032c98c93d1
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 15:36:06 2010 -0700

    s3-selftest: Fix test prefixes in subunit output.

commit 3fea9df85a7d489b81e21a7a63f9e115de712d4c
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 15:35:36 2010 -0700

    s4-param: Check type when converting python object to lp_ctx, fix some
    memory leaks.

commit 63031a2a78cff19f1f17137adfbc85a4df05ae36
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 13:57:07 2010 -0700

    pygensec: Implement start_mech_by_name().

commit 6abe823ce6c6fd1804d45b7c63c770d22b3e7265
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 13:05:55 2010 -0700

    subunithelper: Cope with errors outside of testsuites.

commit 5a75fb194a290cb09fc03312262bd57196e86cb9
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 12:52:29 2010 -0700

    ndrdump: Move blackbox test to standard python namespace.

commit 18f10eec0ea55108e97da019f07a18b8854c2883
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 11:39:53 2010 -0700

    s4/selftest: Simplify running of python tests.

commit 31d5ac05402ed9ac8158d143283c7f8b2d7bb7b4
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Wed Sep 22 11:30:34 2010 -0700

    selftest: Let tests add prefix to tests by themselve.

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

Summary of changes:
 selftest/Subunit.pm                                |   33 --------
 selftest/selftest.pl                               |   41 +++-------
 selftest/subunithelper.py                          |    3 +-
 source3/selftest/tests.sh                          |    7 +-
 source4/auth/credentials/pycredentials.c           |   49 ++++++++++--
 source4/auth/gensec/gensec.c                       |    5 +-
 source4/auth/gensec/gensec_gssapi.c                |    2 +-
 source4/auth/gensec/pygensec.c                     |   51 +++++++++++-
 source4/auth/pyauth.c                              |   38 ++++++++-
 source4/dsdb/samdb/ldb_modules/simple_ldap_map.c   |    2 +-
 .../lib/ldb/{autogen.sh => autogen-autotools.sh}   |    0
 source4/lib/ldb/autogen.sh                         |   19 +----
 source4/lib/ldb/wscript                            |    3 +
 source4/lib/registry/pyregistry.c                  |   37 ++++++++-
 source4/librpc/tests/test_ndrdump.sh               |   20 -----
 source4/param/provision.c                          |    9 ++-
 source4/param/pyparam_util.c                       |   24 ++++++-
 source4/scripting/python/pyglue.c                  |    7 +-
 source4/scripting/python/samba/provision.py        |    3 +-
 source4/scripting/python/samba/tests/__init__.py   |   13 +++
 .../python/samba/tests/blackbox}/__init__.py       |    0
 .../python/samba/tests/blackbox/ndrdump.py         |   28 +++++++
 source4/scripting/python/samba/tests/gensec.py     |   16 +++-
 source4/selftest/tests.sh                          |   84 ++++++++++----------
 24 files changed, 311 insertions(+), 183 deletions(-)
 copy source4/lib/ldb/{autogen.sh => autogen-autotools.sh} (100%)
 mode change 100755 => 120000 source4/lib/ldb/autogen.sh
 delete mode 100755 source4/librpc/tests/test_ndrdump.sh
 copy {source3/build => source4/scripting/python/samba/tests/blackbox}/__init__.py (100%)
 create mode 100755 source4/scripting/python/samba/tests/blackbox/ndrdump.py


Changeset truncated at 500 lines:

diff --git a/selftest/Subunit.pm b/selftest/Subunit.pm
index a94eecd..1cc0e72 100644
--- a/selftest/Subunit.pm
+++ b/selftest/Subunit.pm
@@ -19,42 +19,9 @@ use POSIX;
 
 require Exporter;
 @ISA = qw(Exporter);
- at EXPORT_OK = qw(filter_add_prefix);
 
 use strict;
 
-sub filter_add_prefix($$)
-{
-	my ($prefix, $fh) = @_;
-
-	while(<$fh>) {
-		if (/^test: (.+)\n/) {
-			Subunit::start_test($prefix.$1);
-		} elsif (/^(success|successful|failure|fail|skip|knownfail|error|xfail): (.*?)( \[)?([ \t]*)( multipart)?\n/) {
-			my $result = $1;
-			my $testname = $prefix.$2;
-			my $reason = undef;
-			if ($3) {
-				$reason = "";
-				# reason may be specified in next lines
-				my $terminated = 0;
-				while(<$fh>) {
-					if ($_ eq "]\n") { $terminated = 1; last; } else { $reason .= $_; }
-				}
-
-				unless ($terminated) {
-					print $reason;
-					$reason = "reason ($result) interrupted";
-					$result = "error";
-				}
-			}
-			Subunit::end_test($testname, $result, $reason);
-		} else {
-			print $_;
-		}
-	}
-}
-
 sub start_test($)
 {
 	my ($testname) = @_;
diff --git a/selftest/selftest.pl b/selftest/selftest.pl
index a21ecba..f973ae5 100755
--- a/selftest/selftest.pl
+++ b/selftest/selftest.pl
@@ -153,7 +153,6 @@ my $opt_verbose = 0;
 my $opt_image = undef;
 my $opt_testenv = 0;
 my $ldap = undef;
-my $opt_analyse_cmd = undef;
 my $opt_resetup_env = undef;
 my $opt_bindir = undef;
 my $opt_load_list = undef;
@@ -238,28 +237,22 @@ sub run_testsuite($$$$$)
 	Subunit::start_testsuite($name);
 	Subunit::progress_push();
 	Subunit::report_time(time());
+	system($cmd);
+	Subunit::report_time(time());
+	Subunit::progress_pop();
 
-	open(RESULTS, "$cmd 2>&1|");
-
-	Subunit::filter_add_prefix("$name\.", *RESULTS);
-
-	my $ret = 0;
-
-	unless (close(RESULTS)) {
-		if ($!) {
-			Subunit::progress_pop();
-			Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!");
-			return 0;
-		} else {
-			$ret = $?;
-		}
-	} 
-
-	if ($ret & 127) {
+	if ($? == -1) {
 		Subunit::progress_pop();
-		Subunit::end_testsuite($name, "error", sprintf("Testsuite died with signal %d, %s coredump", ($ret & 127), ($ret & 128) ? "with": "without"));
+		Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!");
+		return 0;
+	} elsif ($? & 127) {
+		Subunit::end_testsuite($name, "error",
+			sprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127),  ($? & 128) ? 'with' : 'without'));
 		return 0;
 	}
+
+	my $exitcode = $? >> 8;
+
 	my $envlog = getlog_env($envname);
 	if ($envlog ne "") {
 		print "envlog: $envlog\n";
@@ -268,10 +261,6 @@ sub run_testsuite($$$$$)
 	print "command: $cmd\n";
 	printf "expanded command: %s\n", expand_environment_strings($cmd);
 
-	my $exitcode = $ret >> 8;
-
-	Subunit::report_time(time());
-	Subunit::progress_pop();
 	if ($exitcode == 0) {
 		Subunit::end_testsuite($name, "success");
 	} else {
@@ -349,7 +338,6 @@ my $result = GetOptions (
 		'verbose' => \$opt_verbose,
 		'testenv' => \$opt_testenv,
 		'ldap:s' => \$ldap,
-		'analyse-cmd=s' => \$opt_analyse_cmd,
 		'resetup-environment' => \$opt_resetup_env,
 		'bindir:s' => \$opt_bindir,
 		'image=s' => \$opt_image,
@@ -933,7 +921,6 @@ $envvarstr
 	foreach (@todo) {
 		$i++;
 		my $cmd = $$_[2];
-		$cmd =~ s/([\(\)])/\\$1/g;
 		my $name = $$_[0];
 		my $envname = $$_[1];
 
@@ -962,10 +949,6 @@ $envvarstr
 
 		run_testsuite($envname, $name, $cmd, $i, $suitestotal);
 
-		if (defined($opt_analyse_cmd)) {
-			system("$opt_analyse_cmd \"$name\"");
-		}
-
 		teardown_env($envname) if ($opt_resetup_env);
 	}
 }
diff --git a/selftest/subunithelper.py b/selftest/subunithelper.py
index 4a649c3..2a5d9ec 100644
--- a/selftest/subunithelper.py
+++ b/selftest/subunithelper.py
@@ -298,7 +298,6 @@ class FilterOps(testtools.testresult.TestResult):
 
     def start_testsuite(self, name):
         self._ops.start_testsuite(name)
-
         self.error_added = 0
         self.fail_added = 0
         self.xfail_added = 0
@@ -335,6 +334,8 @@ class FilterOps(testtools.testresult.TestResult):
         self.expected_failures = expected_failures
         self.strip_ok_output = strip_ok_output
         self.xfail_added = 0
+        self.fail_added = 0
         self.total_xfail = 0
         self.total_error = 0
         self.total_fail = 0
+        self.error_added = 0
diff --git a/source3/selftest/tests.sh b/source3/selftest/tests.sh
index 7a9e68a..39c1a26 100755
--- a/source3/selftest/tests.sh
+++ b/source3/selftest/tests.sh
@@ -30,12 +30,13 @@ plantest() {
 	cmdline="$*"
 	echo "-- TEST --"
 	if [ "$env" = "none" ]; then
-		echo "samba3.$name"
+		fulltest="samba3.$name"
 	else
-		echo "samba3.$name ($env)"
+		fulltest="samba3.$name ($env)"
 	fi
+	echo $fulltest
 	echo $env
-	echo $cmdline
+	echo $cmdline "2>&1" "| ../selftest/filter-subunit --prefix \"$fullname.\""
 }
 
 normalize_testname() {
diff --git a/source4/auth/credentials/pycredentials.c b/source4/auth/credentials/pycredentials.c
index 7c860b0..879d906 100644
--- a/source4/auth/credentials/pycredentials.c
+++ b/source4/auth/credentials/pycredentials.c
@@ -207,6 +207,7 @@ static PyObject *py_creds_guess(py_talloc_Object *self, PyObject *args)
 {
 	PyObject *py_lp_ctx = Py_None;
 	struct loadparm_context *lp_ctx;
+	TALLOC_CTX *mem_ctx;
 	struct cli_credentials *creds;
 
 	creds = PyCredentials_AsCliCredentials(self);
@@ -214,12 +215,22 @@ static PyObject *py_creds_guess(py_talloc_Object *self, PyObject *args)
 	if (!PyArg_ParseTuple(args, "|O", &py_lp_ctx))
 		return NULL;
 
-	lp_ctx = lpcfg_from_py_object(NULL, py_lp_ctx); /* FIXME: leaky */
-	if (lp_ctx == NULL)
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
 		return NULL;
+	}
+
+	lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
+	if (lp_ctx == NULL) {
+		talloc_free(mem_ctx);
+		return NULL;
+	}
 
 	cli_credentials_guess(creds, lp_ctx);
 
+	talloc_free(mem_ctx);
+
 	Py_RETURN_NONE;
 }
 
@@ -229,17 +240,28 @@ static PyObject *py_creds_set_machine_account(py_talloc_Object *self, PyObject *
 	struct loadparm_context *lp_ctx;
 	NTSTATUS status;
 	struct cli_credentials *creds;
+	TALLOC_CTX *mem_ctx;
 
 	creds = PyCredentials_AsCliCredentials(self);
 
 	if (!PyArg_ParseTuple(args, "|O", &py_lp_ctx))
 		return NULL;
 
-	lp_ctx = lpcfg_from_py_object(NULL, py_lp_ctx); /* FIXME: leaky */
-	if (lp_ctx == NULL)
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
 		return NULL;
+	}
+
+	lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
+	if (lp_ctx == NULL) {
+		talloc_free(mem_ctx);
+		return NULL;
+	}
 
 	status = cli_credentials_set_machine_account(creds, lp_ctx);
+	talloc_free(mem_ctx);
+
 	PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
 	Py_RETURN_NONE;
@@ -274,28 +296,39 @@ static PyObject *py_creds_get_named_ccache(py_talloc_Object *self, PyObject *arg
 	int ret;
 	const char *error_string;
 	struct cli_credentials *creds;
+	TALLOC_CTX *mem_ctx;
 
 	creds = PyCredentials_AsCliCredentials(self);
 
 	if (!PyArg_ParseTuple(args, "|Os", &py_lp_ctx, &ccache_name))
 		return NULL;
 
-	lp_ctx = lpcfg_from_py_object(NULL, py_lp_ctx); /* FIXME: leaky */
-	if (lp_ctx == NULL)
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+
+	lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
+	if (lp_ctx == NULL) {
+		talloc_free(mem_ctx);
 		return NULL;
+	}
 
-	event_ctx = tevent_context_init(NULL);
+	event_ctx = tevent_context_init(mem_ctx);
 
 	ret = cli_credentials_get_named_ccache(creds, event_ctx, lp_ctx,
 					       ccache_name, &ccc, &error_string);
+	talloc_free(lp_ctx);
 	if (ret == 0) {
 		talloc_steal(ccc, event_ctx);
+		talloc_free(mem_ctx);
 		return PyCredentialCacheContainer_from_ccache_container(ccc);
 	}
 
 	PyErr_SetString(PyExc_RuntimeError, error_string?error_string:"NULL");
 
-	talloc_free(event_ctx);
+	talloc_free(mem_ctx);
 	return NULL;
 }
 
diff --git a/source4/auth/gensec/gensec.c b/source4/auth/gensec/gensec.c
index 3520585..7220d0e 100644
--- a/source4/auth/gensec/gensec.c
+++ b/source4/auth/gensec/gensec.c
@@ -718,10 +718,9 @@ _PUBLIC_ const char *gensec_get_name_by_oid(struct gensec_security *gensec_secur
 	}
 	return oid_string;
 }
-	
 
-/** 
- * Start a GENSEC sub-mechanism with a specifed mechansim structure, used in SPNEGO
+/**
+ * Start a GENSEC sub-mechanism with a specified mechansim structure, used in SPNEGO
  *
  */
 
diff --git a/source4/auth/gensec/gensec_gssapi.c b/source4/auth/gensec/gensec_gssapi.c
index f28ab95..d2f19e9 100644
--- a/source4/auth/gensec/gensec_gssapi.c
+++ b/source4/auth/gensec/gensec_gssapi.c
@@ -360,7 +360,7 @@ static NTSTATUS gensec_gssapi_client_start(struct gensec_security *gensec_securi
 					    hostname, lpcfg_realm(gensec_security->settings->lp_ctx));
 
 		name_type = GSS_C_NT_USER_NAME;
-	}		
+	}
 	name_token.value  = discard_const_p(uint8_t, principal);
 	name_token.length = strlen(principal);
 
diff --git a/source4/auth/gensec/pygensec.c b/source4/auth/gensec/pygensec.c
index fc76fad..f8825b8 100644
--- a/source4/auth/gensec/pygensec.c
+++ b/source4/auth/gensec/pygensec.c
@@ -67,7 +67,7 @@ static struct gensec_settings *settings_from_object(TALLOC_CTX *mem_ctx, PyObjec
 		PyErr_SetString(PyExc_ValueError, "settings.lp_ctx not found");
 		return NULL;
 	}
-	
+
 	s->target_hostname = PyString_AsString(py_hostname);
 	s->lp_ctx = lpcfg_from_py_object(s, py_lp_ctx);
 	return s;
@@ -81,6 +81,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 	const char *kwnames[] = { "settings", NULL };
 	PyObject *py_settings;
 	struct tevent_context *ev;
+	struct gensec_security *gensec;
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", discard_const_p(char *, kwnames), &py_settings))
 		return NULL;
@@ -101,7 +102,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 		PyObject_DEL(self);
 		return NULL;
 	}
-	
+
 	ev = tevent_context_init(self->talloc_ctx);
 	if (ev == NULL) {
 		PyErr_NoMemory();
@@ -116,13 +117,15 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 		return NULL;
 	}
 
-	status = gensec_client_start(self->talloc_ctx, 
-		(struct gensec_security **)&self->ptr, ev, settings);
+	status = gensec_client_start(self->talloc_ctx, &gensec, ev, settings);
 	if (!NT_STATUS_IS_OK(status)) {
 		PyErr_SetNTSTATUS(status);
 		PyObject_DEL(self);
 		return NULL;
 	}
+
+	self->ptr = gensec;
+
 	return (PyObject *)self;
 }
 
@@ -132,7 +135,7 @@ static PyObject *py_gensec_session_info(PyObject *self)
 	struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
 	struct auth_session_info *info;
 	if (security->ops == NULL) {
-		PyErr_SetString(PyExc_ValueError, "gensec not fully initialised - ask Andrew");
+		PyErr_SetString(PyExc_RuntimeError, "no mechanism selected");
 		return NULL;
 	}
 	status = gensec_session_info(security, &info);
@@ -145,6 +148,41 @@ static PyObject *py_gensec_session_info(PyObject *self)
 	Py_RETURN_NONE;
 }
 
+static PyObject *py_gensec_start_mech_by_name(PyObject *self, PyObject *args)
+{
+    char *name;
+    struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
+    NTSTATUS status;
+
+    if (!PyArg_ParseTuple(args, "s", &name))
+        return NULL;
+
+    status = gensec_start_mech_by_name(security, name);
+    if (!NT_STATUS_IS_OK(status)) {
+        PyErr_SetNTSTATUS(status);
+        return NULL;
+    }
+
+    Py_RETURN_NONE;
+}
+
+static PyObject *py_gensec_start_mech_by_authtype(PyObject *self, PyObject *args)
+{
+	int authtype, level;
+    struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
+	NTSTATUS status;
+	if (!PyArg_ParseTuple(args, "ii", &authtype, &level))
+		return NULL;
+
+	status = gensec_start_mech_by_authtype(security, authtype, level);
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		return NULL;
+	}
+
+	Py_RETURN_NONE;
+}
+
 static PyMethodDef py_gensec_security_methods[] = {
 	{ "start_client", (PyCFunction)py_gensec_start_client, METH_VARARGS|METH_KEYWORDS|METH_CLASS, 
 		"S.start_client(settings) -> gensec" },
@@ -152,6 +190,9 @@ static PyMethodDef py_gensec_security_methods[] = {
 		"S.start_server(auth_ctx, settings) -> gensec" },*/
 	{ "session_info", (PyCFunction)py_gensec_session_info, METH_NOARGS,
 		"S.session_info() -> info" },
+    { "start_mech_by_name", (PyCFunction)py_gensec_start_mech_by_name, METH_VARARGS, 
+        "S.start_mech_by_name(name)" },
+	{ "start_mech_by_authtype", (PyCFunction)py_gensec_start_mech_by_authtype, METH_VARARGS, "S.start_mech_by_authtype(authtype, level)" },
 	{ "get_name_by_authtype", (PyCFunction)py_get_name_by_authtype, METH_VARARGS,
 		"S.get_name_by_authtype(authtype) -> name\nLookup an auth type." },
 	{ NULL }
diff --git a/source4/auth/pyauth.c b/source4/auth/pyauth.c
index dff6963..c2a5e40 100644
--- a/source4/auth/pyauth.c
+++ b/source4/auth/pyauth.c
@@ -43,15 +43,26 @@ static PyObject *py_system_session(PyObject *module, PyObject *args)
 	PyObject *py_lp_ctx = Py_None;
 	struct loadparm_context *lp_ctx = NULL;
 	struct auth_session_info *session;
+	TALLOC_CTX *mem_ctx;
 	if (!PyArg_ParseTuple(args, "|O", &py_lp_ctx))
 		return NULL;
 
-	lp_ctx = lpcfg_from_py_object(NULL, py_lp_ctx); /* FIXME: Leaks memory */
-	if (lp_ctx == NULL)
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
 		return NULL;
+	}
+
+	lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
+	if (lp_ctx == NULL) {
+		talloc_free(mem_ctx);
+		return NULL;
+	}
 
 	session = system_session(lp_ctx);
 
+	talloc_free(mem_ctx);
+
 	return PyAuthSession_FromSession(session);
 }
 
@@ -63,15 +74,32 @@ static PyObject *py_admin_session(PyObject *module, PyObject *args)
 	struct loadparm_context *lp_ctx = NULL;
 	struct auth_session_info *session;
 	struct dom_sid *domain_sid = NULL;
+	TALLOC_CTX *mem_ctx;
+
 	if (!PyArg_ParseTuple(args, "OO", &py_lp_ctx, &py_sid))
 		return NULL;
 
-	lp_ctx = lpcfg_from_py_object(NULL, py_lp_ctx); /* FIXME: leaky */
-	if (lp_ctx == NULL)
+	mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		PyErr_NoMemory();
 		return NULL;
+	}
 
-	domain_sid = dom_sid_parse_talloc(NULL, PyString_AsString(py_sid));
+	lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
+	if (lp_ctx == NULL) {
+		talloc_free(mem_ctx);
+		return NULL;
+	}
+
+	domain_sid = dom_sid_parse_talloc(mem_ctx, PyString_AsString(py_sid));
+	if (domain_sid == NULL) {
+		PyErr_Format(PyExc_RuntimeError, "Unable to parse sid %s", 
+					 PyString_AsString(py_sid));
+		talloc_free(mem_ctx);
+		return NULL;
+	}
 	session = admin_session(NULL, lp_ctx, domain_sid);
+	talloc_free(mem_ctx);
 
 	return PyAuthSession_FromSession(session);
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list