[SCM] Samba Shared Repository - branch v4-2-test updated

Karolin Seeger kseeger at samba.org
Thu Apr 21 09:47:04 UTC 2016


The branch, v4-2-test has been updated
       via  9729bdc build: mark explicit dependencies on pytalloc-util
       via  e29becc s3:wscript: pylibsmb depends on pycredentials
       via  452d393 libsmb/pysmb: add pytalloc-util dependency to fix the build.
       via  cb827b7 pydsdb: Fix returning of ldb.MessageElement.
       via  513b5d7 pydsdb: Also accept ldb.MessageElement values to dsdb routines
      from  75f26e3 vfs_catia: Fix bug 11827, memleak

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-2-test


- Log -----------------------------------------------------------------
commit 9729bdc58f40b413f97af1b9dfe25d641a371e62
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Apr 21 13:03:19 2016 +1200

    build: mark explicit dependencies on pytalloc-util
    
    All subsystems that include pytalloc.h need to link against
    pytalloc-util.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789
    
    Signed-off-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    (similar to 7b431eba22444d2e0d872de781a8193dcfa6d252)
    
    Autobuild-User(v4-2-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-2-test): Thu Apr 21 11:46:43 CEST 2016 on sn-devel-104

commit e29becc1d0c1ffc28ceb3e99db7a4d5473a5db54
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Mar 15 16:59:51 2016 +0100

    s3:wscript: pylibsmb depends on pycredentials
    
    The need for pytalloc-util was based on the fact that
    pycredentials depends on pytalloc-util.
    
    As pylibsmb only used pycredentials and not pytalloc-util directly,
    we should depend on pycredentials.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Günther Deschner <gd at samba.org>
    (cherry picked from commit 74ca470739e0128556d8d20010464df07f2f0ac8)

commit 452d39388d45aaf02fda50bbabfe6de04dacb4ea
Author: Günther Deschner <gd at samba.org>
Date:   Mon Feb 1 23:11:13 2016 +0100

    libsmb/pysmb: add pytalloc-util dependency to fix the build.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <gd at samba.org>
    Reviewed-by: Michael Adam <obnox at samba.org>
    
    Autobuild-User(master): Günther Deschner <gd at samba.org>
    Autobuild-Date(master): Tue Feb  2 15:49:14 CET 2016 on sn-devel-144
    
    (cherry picked from commit 943e69ca8fd4491004eafbf29ed2ca748b0b7480)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

commit cb827b71562cedb60b9a4dd33fbd48d04f811460
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Feb 16 15:15:44 2016 +1300

    pydsdb: Fix returning of ldb.MessageElement.
    
    This object is not based on pytalloc_Object and so this causes
    a segfault (later a failure) when the struct definitions diverge.
    We must also not reuse the incoming ldb_message_element as a talloc
    context and overwrite the values, instead we should create a new
    object and return that.
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    (cherry picked from commit b96b1e88f760c92c7d9bb7e732f72d7e73a68907)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

commit 513b5d776e2d51787405b377cddf6c16480807c9
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Sep 22 15:25:30 2015 +1200

    pydsdb: Also accept ldb.MessageElement values to dsdb routines
    
    This shows the correct way to accept a value that may be a list of strings
    or a proper ldb.MessageElement.
    
    Andrew Bartlett
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    (cherry picked from commit b48776d78b446ad4abd4a6bc2ba6b488a29b11d2)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

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

Summary of changes:
 python/samba/dbchecker.py           |   4 +-
 source3/passdb/wscript_build        |   2 +-
 source3/wscript_build               |   4 +-
 source4/dsdb/pydsdb.c               | 162 +++++++++++++++++++++++-------------
 source4/lib/messaging/wscript_build |   2 +-
 source4/libcli/wscript_build        |   2 +-
 source4/libnet/wscript_build        |   2 +-
 source4/param/wscript_build         |   2 +-
 8 files changed, 113 insertions(+), 67 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/samba/dbchecker.py b/python/samba/dbchecker.py
index 74e9678..9e3dca9 100644
--- a/python/samba/dbchecker.py
+++ b/python/samba/dbchecker.py
@@ -1214,8 +1214,8 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
                 continue
 
             if str(attrname).lower() == 'objectclass':
-                normalised = self.samdb.dsdb_normalise_attributes(self.samdb_schema, attrname, list(obj[attrname]))
-                if list(normalised) != list(obj[attrname]):
+                normalised = self.samdb.dsdb_normalise_attributes(self.samdb_schema, attrname, obj[attrname])
+                if normalised != obj[attrname]:
                     self.err_normalise_mismatch_replace(dn, attrname, list(obj[attrname]))
                     error_count += 1
                 continue
diff --git a/source3/passdb/wscript_build b/source3/passdb/wscript_build
index 2464b0e..d78028d 100644
--- a/source3/passdb/wscript_build
+++ b/source3/passdb/wscript_build
@@ -43,6 +43,6 @@ bld.SAMBA3_MODULE('pdb_samba_dsdb',
 bld.SAMBA3_PYTHON('pypassdb',
                   source='py_passdb.c',
                   deps='pdb',
-                  public_deps='samba-util tdb_compat talloc pyrpc_util',
+                  public_deps='samba-util tdb_compat talloc pyrpc_util pytalloc-util',
                   realname='samba/samba3/passdb.so'
                   )
diff --git a/source3/wscript_build b/source3/wscript_build
index 2c94ef3..47a3c2c 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -1456,13 +1456,13 @@ bld.SAMBA3_BINARY('vlp',
 
 bld.SAMBA3_PYTHON('pysmbd',
                   source='smbd/pysmbd.c',
-                  deps='smbd_base pyrpc_util',
+                  deps='smbd_base pyrpc_util pytalloc-util',
                   realname='samba/samba3/smbd.so'
                   )
 
 bld.SAMBA3_PYTHON('pylibsmb',
                   source='libsmb/pylibsmb.c',
-                  deps='smbclient samba-credentials',
+                  deps='smbclient samba-credentials pycredentials',
                   realname='samba/samba3/libsmb_samba_internal.so'
                   )
 
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index 0a2b86e..704fe10 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -529,11 +529,6 @@ static PyObject *py_dsdb_DsReplicaAttribute(PyObject *self, PyObject *args)
 
 	PyErr_LDB_OR_RAISE(py_ldb, ldb);
 
-	if (!PyList_Check(el_list)) {
-		PyErr_Format(PyExc_TypeError, "ldif_elements must be a list");
-		return NULL;
-	}
-
 	schema = dsdb_get_schema(ldb, NULL);
 	if (!schema) {
 		PyErr_SetString(PyExc_RuntimeError, "Failed to find a schema from ldb");
@@ -555,32 +550,47 @@ static PyObject *py_dsdb_DsReplicaAttribute(PyObject *self, PyObject *args)
 		return NULL;
 	}
 
-	el = talloc_zero(tmp_ctx, struct ldb_message_element);
-	if (el == NULL) {
-		PyErr_NoMemory();
-		talloc_free(tmp_ctx);
-		return NULL;
-	}
-
-	el->name = ldap_display_name;
-	el->num_values = PyList_Size(el_list);
+	/* If we were not given an LdbMessageElement */
+	if (!PyList_Check(el_list)) {
+		if (!py_check_dcerpc_type(el_list, "ldb", "MessageElement")) {
+			PyErr_SetString(py_ldb_get_exception(),
+					"list of strings or ldb MessageElement object required");
+			return NULL;
+		}
+		/*
+		 * NOTE:
+		 * el may not be a valid talloc context, it
+		 * could be part of an array
+		 */
+		el = pyldb_MessageElement_AsMessageElement(el_list);
+	} else {
+		el = talloc_zero(tmp_ctx, struct ldb_message_element);
+		if (el == NULL) {
+			PyErr_NoMemory();
+			talloc_free(tmp_ctx);
+			return NULL;
+		}
 
-	el->values = talloc_array(el, struct ldb_val, el->num_values);
-	if (el->values == NULL) {
-		PyErr_NoMemory();
-		talloc_free(tmp_ctx);
-		return NULL;
-	}
+		el->name = ldap_display_name;
+		el->num_values = PyList_Size(el_list);
 
-	for (i = 0; i < el->num_values; i++) {
-		PyObject *item = PyList_GetItem(el_list, i);
-		if (!PyString_Check(item)) {
-			PyErr_Format(PyExc_TypeError, "ldif_elements should be strings");
+		el->values = talloc_array(el, struct ldb_val, el->num_values);
+		if (el->values == NULL) {
+			PyErr_NoMemory();
 			talloc_free(tmp_ctx);
 			return NULL;
 		}
-		el->values[i].data = (uint8_t *)PyString_AsString(item);
-		el->values[i].length = PyString_Size(item);
+
+		for (i = 0; i < el->num_values; i++) {
+			PyObject *item = PyList_GetItem(el_list, i);
+			if (!PyString_Check(item)) {
+				PyErr_Format(PyExc_TypeError, "ldif_elements should be strings");
+				talloc_free(tmp_ctx);
+				return NULL;
+			}
+			el->values[i].data = (uint8_t *)PyString_AsString(item);
+			el->values[i].length = PyString_Size(item);
+		}
 	}
 
 	attr = talloc_zero(tmp_ctx, struct drsuapi_DsReplicaAttribute);
@@ -606,17 +616,20 @@ static PyObject *py_dsdb_DsReplicaAttribute(PyObject *self, PyObject *args)
  */
 static PyObject *py_dsdb_normalise_attributes(PyObject *self, PyObject *args)
 {
-	PyObject *py_ldb, *el_list, *ret;
+	PyObject *py_ldb, *el_list, *py_ret;
 	struct ldb_context *ldb;
 	char *ldap_display_name;
 	const struct dsdb_attribute *a;
 	struct dsdb_schema *schema;
 	struct dsdb_syntax_ctx syntax_ctx;
-	struct ldb_message_element *el;
+	struct ldb_message_element *el, *new_el;
 	struct drsuapi_DsReplicaAttribute *attr;
+	PyLdbMessageElementObject *ret;
 	TALLOC_CTX *tmp_ctx;
 	WERROR werr;
 	Py_ssize_t i;
+	PyTypeObject *py_type = NULL;
+	PyObject *module = NULL;
 
 	if (!PyArg_ParseTuple(args, "OsO", &py_ldb, &ldap_display_name, &el_list)) {
 		return NULL;
@@ -624,11 +637,6 @@ static PyObject *py_dsdb_normalise_attributes(PyObject *self, PyObject *args)
 
 	PyErr_LDB_OR_RAISE(py_ldb, ldb);
 
-	if (!PyList_Check(el_list)) {
-		PyErr_Format(PyExc_TypeError, "ldif_elements must be a list");
-		return NULL;
-	}
-
 	schema = dsdb_get_schema(ldb, NULL);
 	if (!schema) {
 		PyErr_SetString(PyExc_RuntimeError, "Failed to find a schema from ldb");
@@ -650,38 +658,59 @@ static PyObject *py_dsdb_normalise_attributes(PyObject *self, PyObject *args)
 		return NULL;
 	}
 
-	el = talloc_zero(tmp_ctx, struct ldb_message_element);
-	if (el == NULL) {
-		PyErr_NoMemory();
-		talloc_free(tmp_ctx);
-		return NULL;
-	}
+	if (!PyList_Check(el_list)) {
+		if (!py_check_dcerpc_type(el_list, "ldb", "MessageElement")) {
+			PyErr_SetString(py_ldb_get_exception(),
+					"list of strings or ldb MessageElement object required");
+			return NULL;
+		}
+		/*
+		 * NOTE:
+		 * el may not be a valid talloc context, it
+		 * could be part of an array
+		 */
+		el = pyldb_MessageElement_AsMessageElement(el_list);
+	} else {
+		el = talloc_zero(tmp_ctx, struct ldb_message_element);
+		if (el == NULL) {
+			PyErr_NoMemory();
+			talloc_free(tmp_ctx);
+			return NULL;
+		}
 
-	el->name = ldap_display_name;
-	el->num_values = PyList_Size(el_list);
+		el->name = ldap_display_name;
+		el->num_values = PyList_Size(el_list);
 
-	el->values = talloc_array(el, struct ldb_val, el->num_values);
-	if (el->values == NULL) {
-		PyErr_NoMemory();
-		talloc_free(tmp_ctx);
-		return NULL;
-	}
-
-	for (i = 0; i < el->num_values; i++) {
-		PyObject *item = PyList_GetItem(el_list, i);
-		if (!PyString_Check(item)) {
-			PyErr_Format(PyExc_TypeError, "ldif_elements should be strings");
+		el->values = talloc_array(el, struct ldb_val, el->num_values);
+		if (el->values == NULL) {
+			PyErr_NoMemory();
 			talloc_free(tmp_ctx);
 			return NULL;
 		}
-		el->values[i].data = (uint8_t *)PyString_AsString(item);
-		el->values[i].length = PyString_Size(item);
+
+		for (i = 0; i < el->num_values; i++) {
+			PyObject *item = PyList_GetItem(el_list, i);
+			if (!PyString_Check(item)) {
+				PyErr_Format(PyExc_TypeError, "ldif_elements should be strings");
+				talloc_free(tmp_ctx);
+				return NULL;
+			}
+			el->values[i].data = (uint8_t *)PyString_AsString(item);
+			el->values[i].length = PyString_Size(item);
+		}
+	}
+
+	new_el = talloc_zero(tmp_ctx, struct ldb_message_element);
+	if (new_el == NULL) {
+		PyErr_NoMemory();
+		talloc_free(tmp_ctx);
+		return NULL;
 	}
 
 	/* Normalise "objectClass" attribute if needed */
 	if (ldb_attr_cmp(a->lDAPDisplayName, "objectClass") == 0) {
 		int iret;
-		iret = dsdb_sort_objectClass_attr(ldb, schema, el, tmp_ctx, el);
+		iret = dsdb_sort_objectClass_attr(ldb, schema, el, new_el, new_el);
 		if (iret != LDB_SUCCESS) {
 			PyErr_SetString(PyExc_RuntimeError, ldb_errstring(ldb));
 			talloc_free(tmp_ctx);
@@ -704,14 +733,31 @@ static PyObject *py_dsdb_normalise_attributes(PyObject *self, PyObject *args)
 	PyErr_WERROR_NOT_OK_RAISE(werr);
 
 	/* now convert back again */
-	werr = a->syntax->drsuapi_to_ldb(&syntax_ctx, a, attr, el, el);
+	werr = a->syntax->drsuapi_to_ldb(&syntax_ctx, a, attr, new_el, new_el);
 	PyErr_WERROR_NOT_OK_RAISE(werr);
 
-	ret = py_return_ndr_struct("ldb", "MessageElement", el, el);
+	module = PyImport_ImportModule("ldb");
+	if (module == NULL) {
+		return NULL;
+	}
+
+	py_type = (PyTypeObject *)PyObject_GetAttrString(module, "MessageElement");
+	if (py_type == NULL) {
+		return NULL;
+	}
+	py_ret = py_type->tp_alloc(py_type, 0);
+	ret = (PyLdbMessageElementObject *)py_ret;
+
+	ret->mem_ctx = talloc_new(NULL);
+	if (talloc_reference(ret->mem_ctx, new_el) == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+	ret->el = new_el;
 
 	talloc_free(tmp_ctx);
 
-	return ret;
+	return py_ret;
 }
 
 
diff --git a/source4/lib/messaging/wscript_build b/source4/lib/messaging/wscript_build
index c1b7e1e..2781266 100644
--- a/source4/lib/messaging/wscript_build
+++ b/source4/lib/messaging/wscript_build
@@ -10,7 +10,7 @@ bld.SAMBA_LIBRARY('MESSAGING',
 
 bld.SAMBA_PYTHON('python_messaging',
 	source='pymessaging.c',
-	deps='MESSAGING events pyparam_util',
+	deps='MESSAGING events pyparam_util pytalloc-util',
 	realname='samba/messaging.so'
 	)
 
diff --git a/source4/libcli/wscript_build b/source4/libcli/wscript_build
index 13e1adb..0ae7dd7 100755
--- a/source4/libcli/wscript_build
+++ b/source4/libcli/wscript_build
@@ -34,7 +34,7 @@ bld.SAMBA_SUBSYSTEM('LIBCLI_SMB_COMPOSITE',
 bld.SAMBA_PYTHON('pysmb',
     source='pysmb.c',
     deps='LIBCLI_SMB_COMPOSITE LIBCLI_SMB2 tevent-util pyparam_util',
-	public_deps='cli_composite samba-credentials gensec LIBCLI_RESOLVE tevent param_options',
+	public_deps='cli_composite samba-credentials gensec LIBCLI_RESOLVE tevent param_options pytalloc-util',
     realname='samba/smb.so'
     )
 
diff --git a/source4/libnet/wscript_build b/source4/libnet/wscript_build
index 55fedcd..fd04566 100644
--- a/source4/libnet/wscript_build
+++ b/source4/libnet/wscript_build
@@ -10,7 +10,7 @@ bld.SAMBA_LIBRARY('samba-net',
 
 bld.SAMBA_PYTHON('python_net',
 	source='py_net.c',
-	deps='samba-net pyrpc_util',
+	deps='samba-net pyrpc_util pytalloc-util',
 	realname='samba/net.so'
 	)
 
diff --git a/source4/param/wscript_build b/source4/param/wscript_build
index 4585a83..2ad753b 100644
--- a/source4/param/wscript_build
+++ b/source4/param/wscript_build
@@ -49,7 +49,7 @@ bld.SAMBA_SUBSYSTEM('param_options',
 
 bld.SAMBA_SUBSYSTEM('pyparam_util',
 	source='pyparam_util.c',
-	deps='LIBPYTHON samba-hostconfig',
+	deps='LIBPYTHON samba-hostconfig pytalloc-util',
 	pyext=True,
 	)
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list