diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2008-12-23 05:34:21 +0100 |
---|---|---|
committer | Jelmer Vernooij <jelmer@samba.org> | 2008-12-23 05:36:27 +0100 |
commit | 8ce77a57ccc4d5ff4a216d74c4fc58782fc9098c (patch) | |
tree | f26438fabb53dbe513857ecf4928b95b46bce1ec /source4/lib/ldb | |
parent | 112feeaa35ace32da7620289c676c068dd9585e5 (diff) | |
download | samba-8ce77a57ccc4d5ff4a216d74c4fc58782fc9098c.tar.gz samba-8ce77a57ccc4d5ff4a216d74c4fc58782fc9098c.tar.bz2 samba-8ce77a57ccc4d5ff4a216d74c4fc58782fc9098c.zip |
pyldb: Fix segfault because of incorrect reference counting.
Diffstat (limited to 'source4/lib/ldb')
-rw-r--r-- | source4/lib/ldb/Makefile.in | 2 | ||||
-rw-r--r-- | source4/lib/ldb/pyldb.c | 27 |
2 files changed, 21 insertions, 8 deletions
diff --git a/source4/lib/ldb/Makefile.in b/source4/lib/ldb/Makefile.in index 5f59def4af..6155f6e49c 100644 --- a/source4/lib/ldb/Makefile.in +++ b/source4/lib/ldb/Makefile.in @@ -88,7 +88,7 @@ STATICLIB = lib/libldb.a lib/$(SONAME): $(LIBSOLIB) ln -fs libldb.$(SHLIBEXT).$(PACKAGE_VERSION) $@ -lib/libldb.$(SHLIBEXT): $(LIBSOLIB) +lib/libldb.$(SHLIBEXT): $(LIBSOLIB) lib/$(SONAME) ln -fs libldb.$(SHLIBEXT).$(PACKAGE_VERSION) $@ lib/libnss_ldb.$(SHLIBEXT).2: $(NSS_OBJ) $(LIBSOLIB) diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c index 4d4550eb72..a60307c9eb 100644 --- a/source4/lib/ldb/pyldb.c +++ b/source4/lib/ldb/pyldb.c @@ -1243,14 +1243,16 @@ struct ldb_message_element *PyObject_AsMessageElement(TALLOC_CTX *mem_ctx, 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 *)talloc_strdup(me->values, - PyString_AsString(set_obj)); + me->values[0].data = (uint8_t *)talloc_strndup(me->values, + PyString_AsString(set_obj), + me->values[0].length); } else if (PySequence_Check(set_obj)) { int i; me->num_values = PySequence_Size(set_obj); me->values = talloc_array(me, struct ldb_val, me->num_values); for (i = 0; i < me->num_values; i++) { PyObject *obj = PySequence_GetItem(set_obj, i); + me->values[i].length = PyString_Size(obj); me->values[i].data = (uint8_t *)PyString_AsString(obj); } @@ -1336,7 +1338,11 @@ PyObject *PyLdbMessageElement_FromMessageElement(struct ldb_message_element *el, PyErr_NoMemory(); return NULL; } - ret->mem_ctx = talloc_reference(mem_ctx, el); + ret->mem_ctx = talloc_new(NULL); + if (talloc_reference(ret->mem_ctx, mem_ctx) == NULL) { + PyErr_NoMemory(); + return NULL; + } ret->el = el; return (PyObject *)ret; } @@ -1356,12 +1362,12 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb if (py_elements != NULL) { int i; - if (!PySequence_Check(py_elements)) { + 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); - } else { + } 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++) { @@ -1369,6 +1375,11 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb el->values[i].data = (uint8_t *)PyString_AsString(item); el->values[i].length = PyString_Size(item); } + } else { + PyErr_SetString(PyExc_TypeError, + "Expected string or list"); + talloc_free(el); + return NULL; } } @@ -1382,7 +1393,8 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb return NULL; } - ret->mem_ctx = ret->el = el; + ret->mem_ctx = talloc_new(NULL); + ret->el = talloc_reference(ret->mem_ctx, el); return (PyObject *)ret; } @@ -1588,7 +1600,8 @@ static PyObject *py_ldb_msg_new(PyTypeObject *type, PyObject *args, PyObject *kw return NULL; } - py_ret->mem_ctx = py_ret->msg = ret; + py_ret->mem_ctx = talloc_new(NULL); + py_ret->msg = talloc_reference(py_ret->mem_ctx, ret); return (PyObject *)py_ret; } |