The branch, v4-3-test has been updated
       via  810dca6 libads: record session expiry for spnego sasl binds
       via  9944a5a s3:wscript: pylibsmb depends on pycredentials
       via  8c295c3 libsmb/pysmb: add pytalloc-util dependency to fix the build.
       via  828a9b4 build: mark explicit dependencies on pytalloc-util
       via  b174304 pydsdb: Fix returning of ldb.MessageElement.
       via  e25a6f3 pydsdb: Also accept ldb.MessageElement values to dsdb 
routines
      from  bf61978 vfs_catia: Fix bug 11827, memleak

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


- Log -----------------------------------------------------------------
commit 810dca6074f179bfda045e6059650458d3bfa2fe
Author: Uri Simchoni <[email protected]>
Date:   Mon Apr 18 23:08:38 2016 +0300

    libads: record session expiry for spnego sasl binds
    
    With the move to gensec-based spnego, record the session expiry
    in tgs_expire, so that libads users such as winbindd can use this info
    to determine how long to keep the connection.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11852
    
    Signed-off-by: Uri Simchoni <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>
    
    Autobuild-User(master): Uri Simchoni <[email protected]>
    Autobuild-Date(master): Tue Apr 19 16:53:57 CEST 2016 on sn-devel-144
    
    (cherry picked from commit 34482eb7cc3d74c8de510309332e8ab176d0f3c0)
    
    Autobuild-User(v4-3-test): Karolin Seeger <[email protected]>
    Autobuild-Date(v4-3-test): Tue Apr 26 15:33:37 CEST 2016 on sn-devel-104

commit 9944a5a8665f62a0fabdb583c36abc858133fe61
Author: Stefan Metzmacher <[email protected]>
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 <[email protected]>
    Reviewed-by: Günther Deschner <[email protected]>
    (cherry picked from commit 74ca470739e0128556d8d20010464df07f2f0ac8)

commit 8c295c331924bf8f17c35f4c3300d96bbe89503f
Author: Günther Deschner <[email protected]>
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 <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>
    
    Autobuild-User(master): Günther Deschner <[email protected]>
    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 828a9b4cc99dccf0713fb19c3174a41aeb8e7ec1
Author: Garming Sam <[email protected]>
Date:   Tue Mar 15 13:29:54 2016 +1300

    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 <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>
    
    Autobuild-User(master): Garming Sam <[email protected]>
    Autobuild-Date(master): Tue Mar 15 07:08:16 CET 2016 on sn-devel-144
    
    (similar to commit 7b431eba22444d2e0d872de781a8193dcfa6d252)
    
    Backported to 4.3 by Andrew Bartlett

commit b174304c9cc29cdff17e35cdfe448db3c3a6ac4f
Author: Andrew Bartlett <[email protected]>
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 <[email protected]>
    Reviewed-by: Garming Sam <[email protected]>
    (cherry picked from commit b96b1e88f760c92c7d9bb7e732f72d7e73a68907)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

commit e25a6f32d2b1a4fc33a8a8c8a4e6225be016ebc1
Author: Andrew Bartlett <[email protected]>
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 <[email protected]>
    Reviewed-by: Garming Sam <[email protected]>
    (cherry picked from commit b48776d78b446ad4abd4a6bc2ba6b488a29b11d2)
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11789

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

Summary of changes:
 python/samba/dbchecker.py           |   4 +-
 source3/libads/sasl.c               |   9 ++
 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 +-
 9 files changed, 122 insertions(+), 67 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/samba/dbchecker.py b/python/samba/dbchecker.py
index 4fb9d12..69b4c61 100644
--- a/python/samba/dbchecker.py
+++ b/python/samba/dbchecker.py
@@ -1286,8 +1286,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/libads/sasl.c b/source3/libads/sasl.c
index 22aa9cf..b8d4527 100644
--- a/source3/libads/sasl.c
+++ b/source3/libads/sasl.c
@@ -134,6 +134,7 @@ static ADS_STATUS ads_sasl_spnego_gensec_bind(ADS_STRUCT 
*ads,
        struct auth_generic_state *auth_generic_state;
        bool use_spnego_principal = lp_client_use_spnego_principal();
        const char *sasl_list[] = { sasl, NULL };
+       NTTIME end_nt_time;
 
        nt_status = auth_generic_client_prepare(NULL, &auth_generic_state);
        if (!NT_STATUS_IS_OK(nt_status)) {
@@ -307,6 +308,14 @@ static ADS_STATUS ads_sasl_spnego_gensec_bind(ADS_STRUCT 
*ads,
                }
        }
 
+       ads->auth.tgs_expire = LONG_MAX;
+       end_nt_time = gensec_expire_time(auth_generic_state->gensec_security);
+       if (end_nt_time != GENSEC_EXPIRE_TIME_INFINITY) {
+               struct timeval tv;
+               nttime_to_timeval(&tv, end_nt_time);
+               ads->auth.tgs_expire = tv.tv_sec;
+       }
+
        if (ads->ldap.wrap_type > ADS_SASLWRAP_TYPE_PLAIN) {
                size_t max_wrapped = 
gensec_max_wrapped_size(auth_generic_state->gensec_security);
                ads->ldap.out.max_unwrapped = 
gensec_max_input_size(auth_generic_state->gensec_security);
diff --git a/source3/passdb/wscript_build b/source3/passdb/wscript_build
index 9bbd5ca..105777a 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 talloc pyrpc_util',
+                  public_deps='samba-util tdb talloc pyrpc_util pytalloc-util',
                   realname='samba/samba3/passdb.so'
                   )
diff --git a/source3/wscript_build b/source3/wscript_build
index cb71655..d415220 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -1490,13 +1490,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 9a3b509..b7c9d87 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 adcb2cc..86877af 100644
--- a/source4/lib/messaging/wscript_build
+++ b/source4/lib/messaging/wscript_build
@@ -9,7 +9,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 59b0bc7..6ac7e19 100755
--- a/source4/libcli/wscript_build
+++ b/source4/libcli/wscript_build
@@ -33,7 +33,7 @@ bld.SAMBA_SUBSYSTEM('LIBCLI_SMB_COMPOSITE',
 
 bld.SAMBA_PYTHON('pysmb',
     source='pysmb.c',
-    deps='LIBCLI_SMB_COMPOSITE LIBCLI_SMB2 tevent-util pyparam_util',
+    deps='LIBCLI_SMB_COMPOSITE LIBCLI_SMB2 tevent-util pyparam_util 
pytalloc-util',
        public_deps='cli_composite samba-credentials gensec LIBCLI_RESOLVE 
tevent param_options',
     realname='samba/smb.so'
     )
diff --git a/source4/libnet/wscript_build b/source4/libnet/wscript_build
index ed38c40..6cca50d 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