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 <abart...@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 <garm...@catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    (similar to 7b431eba22444d2e0d872de781a8193dcfa6d252)
    
    Autobuild-User(v4-2-test): Karolin Seeger <ksee...@samba.org>
    Autobuild-Date(v4-2-test): Thu Apr 21 11:46:43 CEST 2016 on sn-devel-104

commit e29becc1d0c1ffc28ceb3e99db7a4d5473a5db54
Author: Stefan Metzmacher <me...@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 <me...@samba.org>
    Reviewed-by: Günther Deschner <g...@samba.org>
    (cherry picked from commit 74ca470739e0128556d8d20010464df07f2f0ac8)

commit 452d39388d45aaf02fda50bbabfe6de04dacb4ea
Author: Günther Deschner <g...@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 <g...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>
    
    Autobuild-User(master): Günther Deschner <g...@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 <abart...@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 <abart...@samba.org>
    Reviewed-by: Garming Sam <garm...@catalyst.net.nz>
    (cherry picked from commit b96b1e88f760c92c7d9bb7e732f72d7e73a68907)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

commit 513b5d776e2d51787405b377cddf6c16480807c9
Author: Andrew Bartlett <abart...@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 <abart...@samba.org>
    Reviewed-by: Garming Sam <garm...@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

Reply via email to