1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-01 04:58:35 +03:00

pyldb: Fix three more (minor) memory leaks.

This commit is contained in:
Jelmer Vernooij 2009-06-17 20:43:25 +02:00
parent 4d2baca7be
commit 832b929dde
2 changed files with 44 additions and 16 deletions

View File

@ -575,17 +575,19 @@ static PyObject *py_ldb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs
{
PyLdbObject *ret;
struct ldb_context *ldb;
ldb = ldb_init(NULL, NULL);
if (ldb == NULL) {
PyErr_NoMemory();
return NULL;
}
ret = (PyLdbObject *)type->tp_alloc(type, 0);
if (ret == NULL) {
PyErr_NoMemory();
return NULL;
}
ret->mem_ctx = talloc_new(NULL);
ldb = ldb_init(ret->mem_ctx, NULL);
if (ldb == NULL) {
PyErr_NoMemory();
return NULL;
}
ret->ldb_ctx = ldb;
return (PyObject *)ret;
}
@ -646,22 +648,27 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
struct ldb_message_element *msgel;
struct ldb_message *msg;
PyObject *key, *value;
TALLOC_CTX *mem_ctx;
if (!PyArg_ParseTuple(args, "O", &py_msg))
return NULL;
mem_ctx = talloc_new(NULL);
if (PyDict_Check(py_msg)) {
PyObject *dn_value = PyDict_GetItemString(py_msg, "dn");
msg = ldb_msg_new(NULL);
msg = ldb_msg_new(mem_ctx);
msg->elements = talloc_zero_array(msg, struct ldb_message_element, PyDict_Size(py_msg));
msg_pos = dict_pos = 0;
if (dn_value) {
if (!PyObject_AsDn(msg, dn_value, PyLdb_AsLdbContext(self), &msg->dn)) {
PyErr_SetString(PyExc_TypeError, "unable to import dn object");
talloc_free(mem_ctx);
return NULL;
}
if (msg->dn == NULL) {
PyErr_SetString(PyExc_TypeError, "dn set but not found");
talloc_free(mem_ctx);
return NULL;
}
}
@ -672,6 +679,7 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
msgel = PyObject_AsMessageElement(msg->elements, value, 0, key_str);
if (msgel == NULL) {
PyErr_SetString(PyExc_TypeError, "unable to import element");
talloc_free(mem_ctx);
return NULL;
}
memcpy(&msg->elements[msg_pos], msgel, sizeof(*msgel));
@ -681,6 +689,7 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
if (msg->dn == NULL) {
PyErr_SetString(PyExc_TypeError, "no dn set");
talloc_free(mem_ctx);
return NULL;
}
@ -690,6 +699,7 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args)
}
ret = ldb_add(PyLdb_AsLdbContext(self), msg);
talloc_free(mem_ctx);
PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
Py_RETURN_NONE;
@ -721,17 +731,28 @@ static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args)
struct ldb_dn *dn1, *dn2;
int ret;
struct ldb_context *ldb;
TALLOC_CTX *mem_ctx;
if (!PyArg_ParseTuple(args, "OO", &py_dn1, &py_dn2))
return NULL;
mem_ctx = talloc_new(NULL);
if (mem_ctx == NULL) {
PyErr_NoMemory();
return NULL;
}
ldb = PyLdb_AsLdbContext(self);
if (!PyObject_AsDn(NULL, py_dn1, ldb, &dn1))
if (!PyObject_AsDn(mem_ctx, py_dn1, ldb, &dn1)) {
talloc_free(mem_ctx);
return NULL;
}
if (!PyObject_AsDn(NULL, py_dn2, ldb, &dn2))
if (!PyObject_AsDn(mem_ctx, py_dn2, ldb, &dn2)) {
talloc_free(mem_ctx);
return NULL;
}
ret = ldb_rename(ldb, dn1, dn2);
talloc_free(mem_ctx);
PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb);
Py_RETURN_NONE;
@ -1467,13 +1488,20 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
char *name = NULL;
const char * const kwnames[] = { "elements", "flags", "name", NULL };
PyLdbMessageElementObject *ret;
TALLOC_CTX *mem_ctx;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Ois",
discard_const_p(char *, kwnames),
&py_elements, &flags, &name))
return NULL;
el = talloc_zero(NULL, struct ldb_message_element);
mem_ctx = talloc_new(NULL);
if (mem_ctx == NULL) {
PyErr_NoMemory();
return NULL;
}
el = talloc_zero(mem_ctx, struct ldb_message_element);
if (py_elements != NULL) {
int i;
@ -1493,7 +1521,7 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
} else {
PyErr_SetString(PyExc_TypeError,
"Expected string or list");
talloc_free(el);
talloc_free(mem_ctx);
return NULL;
}
}
@ -1504,12 +1532,12 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
ret = (PyLdbMessageElementObject *)PyLdbMessageElement.tp_alloc(&PyLdbMessageElement, 0);
if (ret == NULL) {
PyErr_NoMemory();
talloc_free(el);
talloc_free(mem_ctx);
return NULL;
}
ret->mem_ctx = talloc_new(NULL);
ret->el = talloc_reference(ret->mem_ctx, el);
ret->mem_ctx = mem_ctx;
ret->el = el;
return (PyObject *)ret;
}

View File

@ -372,11 +372,11 @@ class DnTests(unittest.TestCase):
def test_canonical_string(self):
x = ldb.Dn(self.ldb, "dc=foo25,bar=bloe")
self.assertEquals("/bloe/foo", x.canonical_str())
self.assertEquals("/bloe/foo25", x.canonical_str())
def test_canonical_ex_string(self):
x = ldb.Dn(self.ldb, "dc=foo26,bar=bloe")
self.assertEquals("/bloe\nfoo", x.canonical_ex_str())
self.assertEquals("/bloe\nfoo26", x.canonical_ex_str())
class LdbMsgTests(unittest.TestCase):