The branch, master has been updated
       via  3641978dfa88398dbc494845fe611dd87f2317b7 (commit)
       via  1174177c8f5851762ab0d3724df9efbdc0f34b1c (commit)
       via  15d73317ea90cdc02083cb132663ef198ef5e60d (commit)
      from  7048165e7a7849a7a97041bcffca91586f1c8fa1 (commit)

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


- Log -----------------------------------------------------------------
commit 3641978dfa88398dbc494845fe611dd87f2317b7
Author: Ricardo Jorge <rvelh...@gmail.com>
Date:   Tue Aug 4 00:03:04 2009 +0200

    param/pyparam: Cope with string list parameters being empty.
    
    Signed-off-by: Jelmer Vernooij <jel...@samba.org>

commit 1174177c8f5851762ab0d3724df9efbdc0f34b1c
Author: Ricardo Jorge <rvelh...@gmail.com>
Date:   Tue Aug 4 00:00:25 2009 +0200

    python/loadparm: Get shares listing working.
    
    Signed-off-by: Jelmer Vernooij <jel...@samba.org>

commit 15d73317ea90cdc02083cb132663ef198ef5e60d
Author: Jelmer Vernooij <jel...@samba.org>
Date:   Mon Aug 3 23:58:16 2009 +0200

    pyldb: Properly keep copies of Python string contents, rather than
    relying on reference leaks :-)

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

Summary of changes:
 source4/lib/ldb/pyldb.c |   30 +++++++++++++++++++++---------
 source4/param/pyparam.c |   19 +++++++++++++------
 2 files changed, 34 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
index c7b9b45..a05aab5 100644
--- a/source4/lib/ldb/pyldb.c
+++ b/source4/lib/ldb/pyldb.c
@@ -538,7 +538,8 @@ static const char **PyList_AsStringList(TALLOC_CTX 
*mem_ctx, PyObject *list,
                        PyErr_Format(PyExc_TypeError, "%s should be strings", 
paramname);
                        return NULL;
                }
-               ret[i] = PyString_AsString(item);
+               ret[i] = talloc_strndup(ret, PyString_AsString(item),
+                                                          PyString_Size(item));
        }
        ret[i] = NULL;
        return ret;
@@ -1397,13 +1398,14 @@ struct ldb_message_element 
*PyObject_AsMessageElement(TALLOC_CTX *mem_ctx,
 
        me = talloc(mem_ctx, struct ldb_message_element);
 
-       me->name = attr_name;
+       me->name = talloc_strdup(me, attr_name);
        me->flags = flags;
        if (PyString_Check(set_obj)) {
                me->num_values = 1;
                me->values = talloc_array(me, struct ldb_val, me->num_values);
                me->values[0].length = PyString_Size(set_obj);
-               me->values[0].data = (uint8_t *)PyString_AsString(set_obj);
+               me->values[0].data = talloc_memdup(me, 
+                       (uint8_t *)PyString_AsString(set_obj), 
me->values[0].length);
        } else if (PySequence_Check(set_obj)) {
                int i;
                me->num_values = PySequence_Size(set_obj);
@@ -1412,7 +1414,8 @@ struct ldb_message_element 
*PyObject_AsMessageElement(TALLOC_CTX *mem_ctx,
                        PyObject *obj = PySequence_GetItem(set_obj, i);
 
                        me->values[i].length = PyString_Size(obj);
-                       me->values[i].data = (uint8_t *)PyString_AsString(obj);
+                       me->values[i].data = talloc_memdup(me, 
+                               (uint8_t *)PyString_AsString(obj), 
me->values[i].length);
                }
        } else {
                talloc_free(me);
@@ -1533,14 +1536,16 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject 
*type, PyObject *args, PyOb
                if (PyString_Check(py_elements)) {
                        el->num_values = 1;
                        el->values = talloc_array(el, struct ldb_val, 1);
-                       el->values[0].data = (uint8_t 
*)PyString_AsString(py_elements);
                        el->values[0].length = PyString_Size(py_elements);
+                       el->values[0].data = talloc_memdup(el, 
+                               (uint8_t *)PyString_AsString(py_elements), 
el->values[0].length);
                } else if (PySequence_Check(py_elements)) {
                        el->num_values = PySequence_Size(py_elements);
                        el->values = talloc_array(el, struct ldb_val, 
el->num_values);
                        for (i = 0; i < el->num_values; i++) {
                                PyObject *item = 
PySequence_GetItem(py_elements, i);
-                               el->values[i].data = (uint8_t 
*)PyString_AsString(item);
+                               el->values[i].data = talloc_memdup(el, 
+                                       (uint8_t *)PyString_AsString(item), 
el->values[i].length);
                                el->values[i].length = PyString_Size(item);
                        }
                } else {
@@ -1717,15 +1722,22 @@ static PyObject *py_ldb_msg_iter(PyLdbMessageObject 
*self)
 
 static int py_ldb_msg_setitem(PyLdbMessageObject *self, PyObject *name, 
PyObject *value)
 {
-       char *attr_name = PyString_AsString(name);
+       char *attr_name;
+
+       if (!PyString_Check(name)) {
+               PyErr_SetNone(PyExc_TypeError);
+               return -1;
+       }
+       
+       attr_name = PyString_AsString(name);
        if (value == NULL) {
+               /* delitem */
                ldb_msg_remove_attr(self->msg, attr_name);
        } else {
-               struct ldb_message_element *el = PyObject_AsMessageElement(NULL,
+               struct ldb_message_element *el = 
PyObject_AsMessageElement(self->msg,
                                                                                
        value, 0, attr_name);
                if (el == NULL)
                        return -1;
-               talloc_steal(self->msg, el);
                ldb_msg_remove_attr(PyLdbMessage_AsMessage(self), attr_name);
                ldb_msg_add(PyLdbMessage_AsMessage(self), el, el->flags);
        }
diff --git a/source4/param/pyparam.c b/source4/param/pyparam.c
index 979182c..58799f8 100644
--- a/source4/param/pyparam.c
+++ b/source4/param/pyparam.c
@@ -129,7 +129,13 @@ static PyObject *py_lp_ctx_get_helper(struct 
loadparm_context *lp_ctx, const cha
        {
            int j;
            const char **strlist = *(const char ***)parm_ptr;
-           PyObject *pylist = PyList_New(str_list_length(strlist));
+           PyObject *pylist;
+               
+               if(strlist == NULL) {
+                       return PyList_New(0);
+               }
+               
+               pylist = PyList_New(str_list_length(strlist));
            for (j = 0; strlist[j]; j++) 
                PyList_SetItem(pylist, j, 
                               PyString_FromString(strlist[j]));
@@ -235,13 +241,14 @@ static PyObject *py_lp_ctx_private_path(py_talloc_Object 
*self, PyObject *args)
 static PyObject *py_lp_ctx_services(py_talloc_Object *self)
 {
        struct loadparm_context *lp_ctx = 
PyLoadparmContext_AsLoadparmContext(self);
-       const char **names;
        PyObject *ret;
        int i;
-       names = lp_server_services(lp_ctx);
-       ret = PyList_New(str_list_length(names));
-       for (i = 0; names[i]; i++) {
-               PyList_SetItem(ret, i, PyString_FromString(names[i]));
+       ret = PyList_New(lp_numservices(lp_ctx));
+       for (i = 0; i < lp_numservices(lp_ctx); i++) {
+               struct loadparm_service *service = lp_servicebynum(lp_ctx, i);
+               if (service != NULL) {
+                       PyList_SetItem(ret, i, 
PyString_FromString(lp_servicename(service)));
+               }
        }
        return ret;
 }


-- 
Samba Shared Repository

Reply via email to