summaryrefslogtreecommitdiff
path: root/source4/dsdb/pydsdb.c
diff options
context:
space:
mode:
authorMatthias Dieter Wallnöfer <mdw@samba.org>2010-12-12 18:31:37 +0100
committerMatthias Dieter Wallnöfer <mdw@samba.org>2010-12-12 20:06:24 +0100
commitb974966cc2b4d0b5b0d83206070b5f7c5c6495d1 (patch)
tree79d8f7232c1f80047fa1ca6e636a44c649068c57 /source4/dsdb/pydsdb.c
parentb56a6f2eda228698a2433ea2365fda5967bd904c (diff)
downloadsamba-b974966cc2b4d0b5b0d83206070b5f7c5c6495d1.tar.gz
samba-b974966cc2b4d0b5b0d83206070b5f7c5c6495d1.tar.bz2
samba-b974966cc2b4d0b5b0d83206070b5f7c5c6495d1.zip
s4:dsdb/pydsdb.c - clean up memory handling
- Remove memory contexts when not really useful (if only one allocation) - Try to find out OOM conditions and return correct error codes - Move the parameter parsing always to the beginning (to prevent unneeded allocations in case of errors)
Diffstat (limited to 'source4/dsdb/pydsdb.c')
-rw-r--r--source4/dsdb/pydsdb.c124
1 files changed, 70 insertions, 54 deletions
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index f5832d1d39..bdac7902aa 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -17,11 +17,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <Python.h>
+#include "lib/ldb/pyldb.h"
#include "includes.h"
-#include "libcli/util/pyerrors.h"
#include "dsdb/samdb/samdb.h"
-#include "lib/ldb/pyldb.h"
#include "libcli/security/security.h"
#include "librpc/ndr/libndr.h"
#include "system/kerberos.h"
@@ -81,6 +79,10 @@ static PyObject *py_samdb_server_site_name(PyObject *self, PyObject *args)
PyErr_LDB_OR_RAISE(py_ldb, ldb);
mem_ctx = talloc_new(NULL);
+ if (mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
site = samdb_server_site_name(ldb, mem_ctx);
if (site == NULL) {
@@ -133,6 +135,10 @@ static PyObject *py_samdb_set_domain_sid(PyLdbObject *self, PyObject *args)
PyErr_LDB_OR_RAISE(py_ldb, ldb);
sid = dom_sid_parse_talloc(NULL, PyString_AsString(py_sid));
+ if (sid == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
ret = samdb_set_domain_sid(ldb, sid);
talloc_free(sid);
@@ -153,7 +159,7 @@ static PyObject *py_samdb_set_ntds_settings_dn(PyLdbObject *self, PyObject *args
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_ntds_settings_dn))
return NULL;
-
+
PyErr_LDB_OR_RAISE(py_ldb, ldb);
tmp_ctx = talloc_new(NULL);
@@ -163,6 +169,8 @@ static PyObject *py_samdb_set_ntds_settings_dn(PyLdbObject *self, PyObject *args
}
if (!PyObject_AsDn(tmp_ctx, py_ntds_settings_dn, ldb, &ntds_settings_dn)) {
+ PyErr_NoMemory();
+ talloc_free(tmp_ctx);
return NULL;
}
@@ -185,15 +193,20 @@ static PyObject *py_samdb_get_domain_sid(PyLdbObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O", &py_ldb))
return NULL;
-
+
PyErr_LDB_OR_RAISE(py_ldb, ldb);
sid = samdb_domain_sid(ldb);
if (!sid) {
PyErr_SetString(PyExc_RuntimeError, "samdb_domain_sid failed");
return NULL;
- }
+ }
+
retstr = dom_sid_string(NULL, sid);
+ if (retstr == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
ret = PyString_FromString(retstr);
talloc_free(retstr);
return ret;
@@ -203,17 +216,10 @@ static PyObject *py_samdb_ntds_invocation_id(PyObject *self, PyObject *args)
{
PyObject *py_ldb, *result;
struct ldb_context *ldb;
- TALLOC_CTX *mem_ctx;
const struct GUID *guid;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
+ char *retstr;
if (!PyArg_ParseTuple(args, "O", &py_ldb)) {
- talloc_free(mem_ctx);
return NULL;
}
@@ -223,12 +229,16 @@ static PyObject *py_samdb_ntds_invocation_id(PyObject *self, PyObject *args)
if (guid == NULL) {
PyErr_SetString(PyExc_RuntimeError,
"Failed to find NTDS invocation ID");
- talloc_free(mem_ctx);
return NULL;
}
- result = PyString_FromString(GUID_string(mem_ctx, guid));
- talloc_free(mem_ctx);
+ retstr = GUID_string(NULL, guid);
+ if (retstr == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ result = PyString_FromString(retstr);
+ talloc_free(retstr);
return result;
}
@@ -240,7 +250,6 @@ static PyObject *py_dsdb_get_oid_from_attid(PyObject *self, PyObject *args)
struct dsdb_schema *schema;
const char *oid;
PyObject *ret;
- TALLOC_CTX *mem_ctx;
WERROR status;
if (!PyArg_ParseTuple(args, "Oi", &py_ldb, &attid))
@@ -248,27 +257,19 @@ static PyObject *py_dsdb_get_oid_from_attid(PyObject *self, PyObject *args)
PyErr_LDB_OR_RAISE(py_ldb, ldb);
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
schema = dsdb_get_schema(ldb, NULL);
if (!schema) {
PyErr_SetString(PyExc_RuntimeError, "Failed to find a schema from ldb \n");
- talloc_free(mem_ctx);
return NULL;
}
status = dsdb_schema_pfm_oid_from_attid(schema->prefixmap, attid,
- mem_ctx, &oid);
+ NULL, &oid);
PyErr_WERROR_IS_ERR_RAISE(status);
ret = PyString_FromString(oid);
-
- talloc_free(mem_ctx);
+ talloc_free(discard_const_p(char, oid));
return ret;
}
@@ -361,11 +362,28 @@ static PyObject *py_dsdb_DsReplicaAttribute(PyObject *self, PyObject *args)
syntax_ctx.is_schema_nc = false;
tmp_ctx = talloc_new(ldb);
+ if (tmp_ctx == NULL) {
+ PyErr_NoMemory();
+ 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);
+
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)) {
@@ -377,13 +395,18 @@ static PyObject *py_dsdb_DsReplicaAttribute(PyObject *self, PyObject *args)
}
attr = talloc_zero(tmp_ctx, struct drsuapi_DsReplicaAttribute);
+ if (attr == NULL) {
+ PyErr_NoMemory();
+ talloc_free(tmp_ctx);
+ return NULL;
+ }
werr = a->syntax->ldb_to_drsuapi(&syntax_ctx, a, el, attr, attr);
PyErr_WERROR_IS_ERR_RAISE(werr);
ret = py_return_ndr_struct("samba.dcerpc.drsuapi", "DsReplicaAttribute", attr, attr);
- talloc_unlink(ldb, tmp_ctx);
+ talloc_free(tmp_ctx);
return ret;
}
@@ -412,8 +435,8 @@ static PyObject *py_samdb_ntds_objectGUID(PyObject *self, PyObject *args)
{
PyObject *py_ldb, *result;
struct ldb_context *ldb;
- TALLOC_CTX *mem_ctx;
const struct GUID *guid;
+ char *retstr;
if (!PyArg_ParseTuple(args, "O", &py_ldb)) {
return NULL;
@@ -421,21 +444,19 @@ static PyObject *py_samdb_ntds_objectGUID(PyObject *self, PyObject *args)
PyErr_LDB_OR_RAISE(py_ldb, ldb);
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
guid = samdb_ntds_objectGUID(ldb);
if (guid == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Failed to find NTDS GUID");
- talloc_free(mem_ctx);
return NULL;
}
- result = PyString_FromString(GUID_string(mem_ctx, guid));
- talloc_free(mem_ctx);
+ retstr = GUID_string(NULL, guid);
+ if (retstr == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ result = PyString_FromString(retstr);
+ talloc_free(retstr);
return result;
}
@@ -464,19 +485,18 @@ static PyObject *py_dsdb_load_partition_usn(PyObject *self, PyObject *args)
TALLOC_CTX *mem_ctx;
int ret;
+ if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_dn)) {
+ return NULL;
+ }
+
+ PyErr_LDB_OR_RAISE(py_ldb, ldb);
+
mem_ctx = talloc_new(NULL);
if (mem_ctx == NULL) {
PyErr_NoMemory();
return NULL;
}
- if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_dn)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- PyErr_LDB_OR_RAISE(py_ldb, ldb);
-
if (!PyObject_AsDn(mem_ctx, py_dn, ldb, &dn)) {
talloc_free(mem_ctx);
return NULL;
@@ -597,7 +617,6 @@ static PyObject *py_dsdb_get_partitions_dn(PyObject *self, PyObject *args)
struct ldb_context *ldb;
struct ldb_dn *dn;
PyObject *py_ldb, *ret;
- TALLOC_CTX *tmp_ctx;
PyObject *mod;
mod = PyImport_ImportModule("ldb");
@@ -607,16 +626,13 @@ static PyObject *py_dsdb_get_partitions_dn(PyObject *self, PyObject *args)
PyErr_LDB_OR_RAISE(py_ldb, ldb);
- tmp_ctx = talloc_new(NULL);
-
- dn = samdb_partitions_dn(ldb, tmp_ctx);
-
+ dn = samdb_partitions_dn(ldb, NULL);
if (dn == NULL) {
- talloc_free(tmp_ctx);
- Py_RETURN_NONE;
+ PyErr_NoMemory();
+ return NULL;
}
ret = PyLdbDn_FromDn(dn);
- talloc_free(tmp_ctx);
+ talloc_free(dn);
return ret;
}