[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Mon Jul 22 23:38:05 UTC 2019


The branch, master has been updated
       via  0348dd4b310 dcerpc: use anon creds for unknown transport
       via  3d33e336267 s4/auth/py: avoid null deref with bad python arguments
       via  936c9662074 s4/gensec/py: avoid null deref with bad python arguments
       via  f3b65ff4e5e s3/smbd/py: avoid null deref with bad python arguments
       via  a2680b44358 s3/libsmb/py: avoid null deref with bad python arguments
       via  57fc8b6c536 s4/auth/pygensec: don't segfault when reporting bad types
       via  a5e8a5e05bc auth/pycreds/encrypt_netr_crypt_password: don't pretend arg is optional
       via  f8fb6f32612 auth/pycreds/encrypt_netr_crypt_password: don't segfault
       via  95a5140db3e pysecurity: use unsigned int, not int to approximate uint32_t
       via  0d0a88fc6a4 pycredentials.h: use import to ensure python type correctness
       via  c9c1d444881 auth/pycredentials: always check self is a Credentials object
       via  2d1c269a9e4 s4/rpc/py_security: don't deref NULL for invalid values
       via  5405f2ad7ed s4/py_dsdb: avoid NULL deref in set_domain_sid()
       via  99c43354ef5 libcli/pysecurity: use pytalloc_get_name to avoid NULL deref
       via  cd20e3876c3 talloc: Release talloc 2.3.0
       via  ac23eeb41c3 talloc/py_util: remove tautologically dead code
       via  dc20e7c6df7 talloc: pytalloc_get_checked_type: survive non-talloc objects
       via  4496e073cbd talloc: add pytalloc_get_name() helper
       via  3383390b4b8 tests/py-segfault: add messaging.deregister()
       via  c3a52e4c40a py segfault test: registry.open_hive
      from  c1e649fd473 s3:rpc_server: Call server exit routines in sigterm handler

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


- Log -----------------------------------------------------------------
commit 0348dd4b31062b2cf12d19ec5515a309d1d9b470
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jul 10 16:24:46 2019 +1200

    dcerpc: use anon creds for unknown transport
    
    Otherwise we get a segfault when the NULL creds are dereferenced in cli_credentials_is_anonymous()
    
     $  python3 -c"from samba.dcerpc.dnsserver import dnsserver; d = dnsserver('addc')"
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Mon Jul 22 23:37:57 UTC 2019 on sn-devel-184

commit 3d33e336267f54e1fe344bf1a83af88092c5ad43
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 22:52:33 2019 +1200

    s4/auth/py: avoid null deref with bad python arguments
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 936c96620743b75d3177b787cd50478d346c5870
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 22:52:19 2019 +1200

    s4/gensec/py: avoid null deref with bad python arguments
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f3b65ff4e5e27e65574a69ee72ac017cd6b3f93c
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 22:51:38 2019 +1200

    s3/smbd/py: avoid null deref with bad python arguments
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a2680b44358b2e85354c88c3fdd525327835e43a
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 22:51:18 2019 +1200

    s3/libsmb/py: avoid null deref with bad python arguments
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 57fc8b6c5369d99b544ff0f43720b9670e018a2a
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sun Jul 7 17:23:23 2019 +1200

    s4/auth/pygensec: don't segfault when reporting bad types
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a5e8a5e05bcb89a3fc36044ce89ac49df2f00d03
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 23:07:18 2019 +1200

    auth/pycreds/encrypt_netr_crypt_password: don't pretend arg is optional
    
    The "|O" signature is saying the password argument is optional, which
    makes no sense in terms of the funxtion and immediately leads to a
    TypeError (or until last commit, segfault). Removing the "|" leaves it
    with a TypeError, but it is better worded and faster.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f8fb6f326129267c7742947943df3f920c8cb54f
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sun Jul 7 13:47:51 2019 +1200

    auth/pycreds/encrypt_netr_crypt_password: don't segfault
    
    Non-talloc objects were treated as talloc objects, to no good effect
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 95a5140db3e84478b903f9e96fc34e87db2c07c6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sun Jul 7 12:14:50 2019 +1200

    pysecurity: use unsigned int, not int to approximate uint32_t
    
    the "I" flag for unsigned int has been available since Python 2.3
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0d0a88fc6a4371bf3666186792f253cacf2f1378
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sat Jul 6 19:09:57 2019 +1200

    pycredentials.h: use import to ensure python type correctness
    
    Because we include pyrpc_util.h, pycredentials doesn't need its own
    PyStringFromStringOrNull().
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c9c1d444881d4464842cfc19fcb5ddd41c58dfa9
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sat Jul 6 19:07:11 2019 +1200

    auth/pycredentials: always check self is a Credentials object
    
    This prevents a segfault with
    
        credentials.Credentials.guess(x)
    
    where x is not a Credentials object.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2d1c269a9e4b4bdf8bffc91fcb63778e03097b3e
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jul 5 23:01:39 2019 +1200

    s4/rpc/py_security: don't deref NULL for invalid values
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 5405f2ad7edc0dc04707e2c7472705c534cb11e8
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Jul 4 22:21:36 2019 +1200

    s4/py_dsdb: avoid NULL deref in set_domain_sid()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 99c43354ef5387b708cf0f527f39a86b43c0e979
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 09:45:03 2019 +0000

    libcli/pysecurity: use pytalloc_get_name to avoid NULL deref
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit cd20e3876c368556781ff0c8c14527b9339d3cad
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jul 22 13:42:37 2019 +1200

    talloc: Release talloc 2.3.0
    
    * add pytalloc_get_name() to safely access te talloc name in Python bindings
    * Use a new minor version to allow talloc updates in the 4.11 release stream
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz

commit ac23eeb41c3d27d710722f94e22dd84410d183d3
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Sun Jul 7 12:34:37 2019 +1200

    talloc/py_util: remove tautologically dead code
    
    Being careful is good and all, but if we don't trust the
    
           static PyTypeObject *type = NULL;
    
    two lines up, we need to reconsider our entire software universe.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit dc20e7c6df7a230c3b3cd9ae7de79e4cacc36eb4
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 09:44:12 2019 +0000

    talloc: pytalloc_get_checked_type: survive non-talloc objects
    
    If the python object is not a talloc object, we will end up
    with a NULL pointer. We weren't checking for that properly
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4496e073cbd0f78bcaa2cf340336e1a14bd6e8e6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Jul 9 08:59:19 2019 +0000

    talloc: add pytalloc_get_name() helper
    
    In several places we go
    
       talloc_get_name(pytalloc_get_ptr(py_obj))
    
    which is a certain NULL derefernce if py_obj is not a talloc object.
    
    This is a helper function that chooses to say "non-talloc object"
    rather than crash.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3383390b4b82e49865792b839af1e8fb798113ca
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jul 5 09:37:13 2019 +1200

    tests/py-segfault: add messaging.deregister()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c3a52e4c40a819ccaa5b4dab41f74afc8bff3d5c
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Jul 4 22:19:55 2019 +1200

    py segfault test: registry.open_hive
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

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

Summary of changes:
 auth/credentials/pycredentials.c                   | 300 +++++++++++++++++----
 auth/credentials/pycredentials.h                   |  15 +-
 ...oc-util-2.2.0.sigs => pytalloc-util-2.3.0.sigs} |   1 +
 .../ABI/{talloc-2.1.10.sigs => talloc-2.3.0.sigs}  |   0
 lib/talloc/pytalloc.h                              |   4 +
 lib/talloc/pytalloc_util.c                         |  23 +-
 lib/talloc/talloc.h                                |   2 +-
 lib/talloc/wscript                                 |   2 +-
 libcli/security/pysecurity.c                       |  12 +-
 python/samba/tests/segfault.py                     |  14 +
 selftest/knownfail.d/python-segfaults              |   3 -
 source3/libsmb/pylibsmb.c                          |   2 +-
 source3/smbd/pysmbd.c                              |   4 +-
 source4/auth/gensec/pygensec.c                     |   9 +-
 source4/auth/pyauth.c                              |   4 +-
 source4/dsdb/pydsdb.c                              |  13 +-
 source4/librpc/ndr/py_security.c                   |  12 +-
 source4/librpc/rpc/dcerpc_connect.c                |   5 +
 18 files changed, 337 insertions(+), 88 deletions(-)
 copy lib/talloc/ABI/{pytalloc-util-2.2.0.sigs => pytalloc-util-2.3.0.sigs} (94%)
 copy lib/talloc/ABI/{talloc-2.1.10.sigs => talloc-2.3.0.sigs} (100%)


Changeset truncated at 500 lines:

diff --git a/auth/credentials/pycredentials.c b/auth/credentials/pycredentials.c
index 1aef16a0145..446f30970a2 100644
--- a/auth/credentials/pycredentials.c
+++ b/auth/credentials/pycredentials.c
@@ -37,13 +37,6 @@
 
 void initcredentials(void);
 
-static PyObject *PyString_FromStringOrNULL(const char *str)
-{
-	if (str == NULL)
-		Py_RETURN_NONE;
-	return PyUnicode_FromString(str);
-}
-
 static PyObject *py_creds_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
 {
 	return pytalloc_steal(type, cli_credentials_init(NULL));
@@ -51,7 +44,12 @@ static PyObject *py_creds_new(PyTypeObject *type, PyObject *args, PyObject *kwar
 
 static PyObject *py_creds_get_username(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_username(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_username(creds));
 }
 
 static PyObject *py_creds_set_username(PyObject *self, PyObject *args)
@@ -59,13 +57,18 @@ static PyObject *py_creds_set_username(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_username(PyCredentials_AsCliCredentials(self), newval, obt));
+	return PyBool_FromLong(cli_credentials_set_username(creds, newval, obt));
 }
 
 static PyObject *py_creds_get_ntlm_username_domain(PyObject *self, PyObject *unused)
@@ -74,7 +77,12 @@ static PyObject *py_creds_get_ntlm_username_domain(PyObject *self, PyObject *unu
 	const char *user = NULL;
 	const char *domain = NULL;
 	PyObject *ret = NULL;
-	cli_credentials_get_ntlm_username_domain(PyCredentials_AsCliCredentials(self),
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	cli_credentials_get_ntlm_username_domain(creds,
 						 frame, &user, &domain);
 	ret = Py_BuildValue("(ss)",
 			    user,
@@ -101,6 +109,11 @@ static PyObject *py_creds_get_ntlm_response(PyObject *self, PyObject *args, PyOb
 	const char *kwnames[] = { "flags", "challenge",
 				  "target_info",
 				  NULL };
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	tv_now = timeval_current();
 	server_timestamp = timeval_to_nttime(&tv_now);
@@ -115,7 +128,7 @@ static PyObject *py_creds_get_ntlm_response(PyObject *self, PyObject *args, PyOb
 		return NULL;
 	}
 
-	status = cli_credentials_get_ntlm_response(PyCredentials_AsCliCredentials(self),
+	status = cli_credentials_get_ntlm_response(creds,
 						   frame, &flags,
 						   challenge,
 						   &server_timestamp,
@@ -147,7 +160,13 @@ static PyObject *py_creds_get_ntlm_response(PyObject *self, PyObject *args, PyOb
 static PyObject *py_creds_get_principal(PyObject *self, PyObject *unused)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
-	PyObject *ret = PyString_FromStringOrNULL(cli_credentials_get_principal(PyCredentials_AsCliCredentials(self), frame));
+	PyObject *ret = NULL;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	ret = PyString_FromStringOrNULL(cli_credentials_get_principal(creds, frame));
 	TALLOC_FREE(frame);
 	return ret;
 }
@@ -157,18 +176,28 @@ static PyObject *py_creds_set_principal(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_principal(PyCredentials_AsCliCredentials(self), newval, obt));
+	return PyBool_FromLong(cli_credentials_set_principal(creds, newval, obt));
 }
 
 static PyObject *py_creds_get_password(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_password(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_password(creds));
 }
 
 static PyObject *py_creds_set_password(PyObject *self, PyObject *args)
@@ -177,12 +206,18 @@ static PyObject *py_creds_set_password(PyObject *self, PyObject *args)
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
 	PyObject *result = NULL;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, PYARG_STR_UNI"|i", "utf8", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	result = PyBool_FromLong(cli_credentials_set_password(PyCredentials_AsCliCredentials(self), newval, obt));
+	result = PyBool_FromLong(cli_credentials_set_password(creds, newval, obt));
 	PyMem_Free(discard_const_p(void*, newval));
 	return result;
 }
@@ -196,6 +231,11 @@ static PyObject *py_creds_set_utf16_password(PyObject *self, PyObject *args)
 	Py_ssize_t size =  0;
 	int result;
 	bool ok;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "O|i", &newval, &_obt)) {
 		return NULL;
@@ -209,7 +249,7 @@ static PyObject *py_creds_set_utf16_password(PyObject *self, PyObject *args)
 	}
 	blob.length = size;
 
-	ok = cli_credentials_set_utf16_password(PyCredentials_AsCliCredentials(self),
+	ok = cli_credentials_set_utf16_password(creds,
 						&blob, obt);
 
 	return PyBool_FromLong(ok);
@@ -217,7 +257,12 @@ static PyObject *py_creds_set_utf16_password(PyObject *self, PyObject *args)
 
 static PyObject *py_creds_get_old_password(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_old_password(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_old_password(creds));
 }
 
 static PyObject *py_creds_set_old_password(PyObject *self, PyObject *args)
@@ -225,13 +270,18 @@ static PyObject *py_creds_set_old_password(PyObject *self, PyObject *args)
 	char *oldval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &oldval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_old_password(PyCredentials_AsCliCredentials(self), oldval, obt));
+	return PyBool_FromLong(cli_credentials_set_old_password(creds, oldval, obt));
 }
 
 static PyObject *py_creds_set_old_utf16_password(PyObject *self, PyObject *args)
@@ -241,6 +291,11 @@ static PyObject *py_creds_set_old_utf16_password(PyObject *self, PyObject *args)
 	Py_ssize_t size =  0;
 	int result;
 	bool ok;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "O", &oldval)) {
 		return NULL;
@@ -253,7 +308,7 @@ static PyObject *py_creds_set_old_utf16_password(PyObject *self, PyObject *args)
 	}
 	blob.length = size;
 
-	ok = cli_credentials_set_old_utf16_password(PyCredentials_AsCliCredentials(self),
+	ok = cli_credentials_set_old_utf16_password(creds,
 						    &blob);
 
 	return PyBool_FromLong(ok);
@@ -261,7 +316,12 @@ static PyObject *py_creds_set_old_utf16_password(PyObject *self, PyObject *args)
 
 static PyObject *py_creds_get_domain(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_domain(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_domain(creds));
 }
 
 static PyObject *py_creds_set_domain(PyObject *self, PyObject *args)
@@ -269,18 +329,28 @@ static PyObject *py_creds_set_domain(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_domain(PyCredentials_AsCliCredentials(self), newval, obt));
+	return PyBool_FromLong(cli_credentials_set_domain(creds, newval, obt));
 }
 
 static PyObject *py_creds_get_realm(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_realm(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_realm(creds));
 }
 
 static PyObject *py_creds_set_realm(PyObject *self, PyObject *args)
@@ -288,32 +358,52 @@ static PyObject *py_creds_set_realm(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_realm(PyCredentials_AsCliCredentials(self), newval, obt));
+	return PyBool_FromLong(cli_credentials_set_realm(creds, newval, obt));
 }
 
 static PyObject *py_creds_get_bind_dn(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_bind_dn(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_bind_dn(creds));
 }
 
 static PyObject *py_creds_set_bind_dn(PyObject *self, PyObject *args)
 {
 	char *newval;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 	if (!PyArg_ParseTuple(args, "s", &newval))
 		return NULL;
 
-	return PyBool_FromLong(cli_credentials_set_bind_dn(PyCredentials_AsCliCredentials(self), newval));
+	return PyBool_FromLong(cli_credentials_set_bind_dn(creds, newval));
 }
 
 static PyObject *py_creds_get_workstation(PyObject *self, PyObject *unused)
 {
-	return PyString_FromStringOrNULL(cli_credentials_get_workstation(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyString_FromStringOrNULL(cli_credentials_get_workstation(creds));
 }
 
 static PyObject *py_creds_set_workstation(PyObject *self, PyObject *args)
@@ -321,39 +411,69 @@ static PyObject *py_creds_set_workstation(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	return PyBool_FromLong(cli_credentials_set_workstation(PyCredentials_AsCliCredentials(self), newval, obt));
+	return PyBool_FromLong(cli_credentials_set_workstation(creds, newval, obt));
 }
 
 static PyObject *py_creds_is_anonymous(PyObject *self, PyObject *unused)
 {
-	return PyBool_FromLong(cli_credentials_is_anonymous(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	return PyBool_FromLong(cli_credentials_is_anonymous(creds));
 }
 
 static PyObject *py_creds_set_anonymous(PyObject *self, PyObject *unused)
 {
-	cli_credentials_set_anonymous(PyCredentials_AsCliCredentials(self));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	cli_credentials_set_anonymous(creds);
 	Py_RETURN_NONE;
 }
 
 static PyObject *py_creds_authentication_requested(PyObject *self, PyObject *unused)
 {
-        return PyBool_FromLong(cli_credentials_authentication_requested(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+        return PyBool_FromLong(cli_credentials_authentication_requested(creds));
 }
 
 static PyObject *py_creds_wrong_password(PyObject *self, PyObject *unused)
 {
-        return PyBool_FromLong(cli_credentials_wrong_password(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+         return PyBool_FromLong(cli_credentials_wrong_password(creds));
 }
 
 static PyObject *py_creds_set_cmdline_callbacks(PyObject *self, PyObject *unused)
 {
-        return PyBool_FromLong(cli_credentials_set_cmdline_callbacks(PyCredentials_AsCliCredentials(self)));
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+        return PyBool_FromLong(cli_credentials_set_cmdline_callbacks(creds));
 }
 
 static PyObject *py_creds_parse_string(PyObject *self, PyObject *args)
@@ -361,13 +481,18 @@ static PyObject *py_creds_parse_string(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	cli_credentials_parse_string(PyCredentials_AsCliCredentials(self), newval, obt);
+	cli_credentials_parse_string(creds, newval, obt);
 	Py_RETURN_NONE;
 }
 
@@ -376,13 +501,18 @@ static PyObject *py_creds_parse_file(PyObject *self, PyObject *args)
 	char *newval;
 	enum credentials_obtained obt = CRED_SPECIFIED;
 	int _obt = obt;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 
 	if (!PyArg_ParseTuple(args, "s|i", &newval, &_obt)) {
 		return NULL;
 	}
 	obt = _obt;
 
-	cli_credentials_parse_file(PyCredentials_AsCliCredentials(self), newval, obt);
+	cli_credentials_parse_file(creds, newval, obt);
 	Py_RETURN_NONE;
 }
 
@@ -404,8 +534,13 @@ static PyObject *py_cli_credentials_set_password_will_be_nt_hash(PyObject *self,
 static PyObject *py_creds_get_nt_hash(PyObject *self, PyObject *unused)
 {
 	PyObject *ret;
+	struct samr_Password *ntpw = NULL;
 	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
-	struct samr_Password *ntpw = cli_credentials_get_nt_hash(creds, creds);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	ntpw = cli_credentials_get_nt_hash(creds, creds);
 
 	ret = PyBytes_FromStringAndSize(discard_const_p(char, ntpw->hash), 16);
 	TALLOC_FREE(ntpw);
@@ -414,34 +549,55 @@ static PyObject *py_creds_get_nt_hash(PyObject *self, PyObject *unused)
 
 static PyObject *py_creds_get_kerberos_state(PyObject *self, PyObject *unused)
 {
-	int state = cli_credentials_get_kerberos_state(PyCredentials_AsCliCredentials(self));
+	int state;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
+	state = cli_credentials_get_kerberos_state(creds);
 	return PyInt_FromLong(state);
 }
 
 static PyObject *py_creds_set_kerberos_state(PyObject *self, PyObject *args)
 {
 	int state;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;
+	}
 	if (!PyArg_ParseTuple(args, "i", &state))
 		return NULL;
 
-	cli_credentials_set_kerberos_state(PyCredentials_AsCliCredentials(self), state);
+	cli_credentials_set_kerberos_state(creds, state);
 	Py_RETURN_NONE;
 }
 
 static PyObject *py_creds_set_krb_forwardable(PyObject *self, PyObject *args)
 {
 	int state;
+	struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+	if (creds == NULL) {
+		PyErr_Format(PyExc_TypeError, "Credentials expected");
+		return NULL;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list