summaryrefslogtreecommitdiff
path: root/source3/lib/ldb/common
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2006-10-21 00:10:19 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:15:35 -0500
commit7a390a0dabcdadb30196662b6cdec512bf81dcb4 (patch)
tree8ed126e072e4446ad47d25f277059af5ccd556cc /source3/lib/ldb/common
parentaa3ca346d82da2501406cc1f482643b20905e467 (diff)
downloadsamba-7a390a0dabcdadb30196662b6cdec512bf81dcb4.tar.gz
samba-7a390a0dabcdadb30196662b6cdec512bf81dcb4.tar.bz2
samba-7a390a0dabcdadb30196662b6cdec512bf81dcb4.zip
r19430: merge recent ldb changes from Samba4. This includes memory leak fixes
and significant speedups (This used to be commit bb5c205fef90aa8b89ba400fb9f2f37a111676a8)
Diffstat (limited to 'source3/lib/ldb/common')
-rw-r--r--source3/lib/ldb/common/ldb.c18
-rw-r--r--source3/lib/ldb/common/ldb_attributes.c14
-rw-r--r--source3/lib/ldb/common/ldb_dn.c9
-rw-r--r--source3/lib/ldb/common/ldb_ldif.c12
-rw-r--r--source3/lib/ldb/common/ldb_modules.c1
5 files changed, 44 insertions, 10 deletions
diff --git a/source3/lib/ldb/common/ldb.c b/source3/lib/ldb/common/ldb.c
index 28d1c7235a..7648abf795 100644
--- a/source3/lib/ldb/common/ldb.c
+++ b/source3/lib/ldb/common/ldb.c
@@ -208,7 +208,8 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co
}
if (ldb_load_modules(ldb, options) != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to load modules for '%s'\n", url);
+ ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to load modules for %s: %s\n",
+ url, ldb_errstring(ldb));
return LDB_ERR_OTHER;
}
@@ -536,8 +537,9 @@ static int ldb_search_callback(struct ldb_context *ldb, void *context, struct ld
if (!res || !ares) {
goto error;
}
-
- if (ares->type == LDB_REPLY_ENTRY) {
+
+ switch (ares->type) {
+ case LDB_REPLY_ENTRY:
res->msgs = talloc_realloc(res, res->msgs, struct ldb_message *, res->count + 2);
if (! res->msgs) {
goto error;
@@ -547,9 +549,8 @@ static int ldb_search_callback(struct ldb_context *ldb, void *context, struct ld
res->msgs[res->count] = talloc_move(res->msgs, &ares->message);
res->count++;
- }
-
- if (ares->type == LDB_REPLY_REFERRAL) {
+ break;
+ case LDB_REPLY_REFERRAL:
if (res->refs) {
for (n = 0; res->refs[n]; n++) /*noop*/ ;
} else {
@@ -563,8 +564,11 @@ static int ldb_search_callback(struct ldb_context *ldb, void *context, struct ld
res->refs[n] = talloc_move(res->refs, &ares->referral);
res->refs[n + 1] = NULL;
+ case LDB_REPLY_DONE:
+ /* Should do something here to detect if this never
+ * happens */
+ break;
}
-
talloc_steal(res, ares->controls);
talloc_free(ares);
return LDB_SUCCESS;
diff --git a/source3/lib/ldb/common/ldb_attributes.c b/source3/lib/ldb/common/ldb_attributes.c
index c8a7909b4c..2d9f0e6cf8 100644
--- a/source3/lib/ldb/common/ldb_attributes.c
+++ b/source3/lib/ldb/common/ldb_attributes.c
@@ -39,6 +39,7 @@ int ldb_set_attrib_handlers(struct ldb_context *ldb,
const struct ldb_attrib_handler *handlers,
unsigned num_handlers)
{
+ int i;
struct ldb_attrib_handler *h;
h = talloc_realloc(ldb, ldb->schema.attrib_handlers,
struct ldb_attrib_handler,
@@ -50,6 +51,16 @@ int ldb_set_attrib_handlers(struct ldb_context *ldb,
ldb->schema.attrib_handlers = h;
memcpy(h + ldb->schema.num_attrib_handlers,
handlers, sizeof(*h) * num_handlers);
+ for (i=0;i<num_handlers;i++) {
+ if (h[ldb->schema.num_attrib_handlers+i].flags & LDB_ATTR_FLAG_ALLOCATED) {
+ h[ldb->schema.num_attrib_handlers+i].attr = talloc_strdup(ldb->schema.attrib_handlers,
+ h[ldb->schema.num_attrib_handlers+i].attr);
+ if (h[ldb->schema.num_attrib_handlers+i].attr == NULL) {
+ ldb_oom(ldb);
+ return -1;
+ }
+ }
+ }
ldb->schema.num_attrib_handlers += num_handlers;
return 0;
}
@@ -129,6 +140,9 @@ void ldb_remove_attrib_handler(struct ldb_context *ldb, const char *attrib)
if (h == &ldb_default_attrib_handler) {
return;
}
+ if (h->flags & LDB_ATTR_FLAG_ALLOCATED) {
+ talloc_free(h->attr);
+ }
i = h - ldb->schema.attrib_handlers;
if (i < ldb->schema.num_attrib_handlers - 1) {
memmove(&ldb->schema.attrib_handlers[i],
diff --git a/source3/lib/ldb/common/ldb_dn.c b/source3/lib/ldb/common/ldb_dn.c
index d035b0d3c2..e937a2b7fc 100644
--- a/source3/lib/ldb/common/ldb_dn.c
+++ b/source3/lib/ldb/common/ldb_dn.c
@@ -337,6 +337,9 @@ failed:
return NULL;
}
+/*
+ explode a DN string into a ldb_dn structure
+*/
struct ldb_dn *ldb_dn_explode(void *mem_ctx, const char *dn)
{
struct ldb_dn *edn; /* the exploded dn */
@@ -848,7 +851,7 @@ failed:
struct ldb_dn *ldb_dn_string_compose(void *mem_ctx, const struct ldb_dn *base, const char *child_fmt, ...)
{
- struct ldb_dn *dn;
+ struct ldb_dn *dn, *dn1;
char *child_str;
va_list ap;
@@ -860,9 +863,11 @@ struct ldb_dn *ldb_dn_string_compose(void *mem_ctx, const struct ldb_dn *base, c
if (child_str == NULL) return NULL;
- dn = ldb_dn_compose(mem_ctx, ldb_dn_explode(mem_ctx, child_str), base);
+ dn1 = ldb_dn_explode(mem_ctx, child_str);
+ dn = ldb_dn_compose(mem_ctx, dn1, base);
talloc_free(child_str);
+ talloc_free(dn1);
return dn;
}
diff --git a/source3/lib/ldb/common/ldb_ldif.c b/source3/lib/ldb/common/ldb_ldif.c
index 0c31f25cc7..4992eb01ad 100644
--- a/source3/lib/ldb/common/ldb_ldif.c
+++ b/source3/lib/ldb/common/ldb_ldif.c
@@ -232,6 +232,8 @@ static int fold_string(int (*fprintf_fn)(void *, const char *, ...), void *priva
return total;
}
+#undef CHECK_RET
+
/*
encode as base64 to a file
*/
@@ -264,6 +266,9 @@ static const struct {
{NULL, 0}
};
+/* this macro is used to handle the return checking on fprintf_fn() */
+#define CHECK_RET do { if (ret < 0) { talloc_free(mem_ctx); return ret; } total += ret; } while (0)
+
/*
write to ldif, using a caller supplied write method
*/
@@ -272,10 +277,13 @@ int ldb_ldif_write(struct ldb_context *ldb,
void *private_data,
const struct ldb_ldif *ldif)
{
+ TALLOC_CTX *mem_ctx;
unsigned int i, j;
int total=0, ret;
const struct ldb_message *msg;
+ mem_ctx = talloc_named_const(NULL, 0, "ldb_ldif_write");
+
msg = ldif->msg;
ret = fprintf_fn(private_data, "dn: %s\n", ldb_dn_linearize(msg->dn, msg->dn));
@@ -290,6 +298,7 @@ int ldb_ldif_write(struct ldb_context *ldb,
if (!ldb_changetypes[i].name) {
ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Invalid ldif changetype %d\n",
ldif->changetype);
+ talloc_free(mem_ctx);
return -1;
}
ret = fprintf_fn(private_data, "changetype: %s\n", ldb_changetypes[i].name);
@@ -320,7 +329,7 @@ int ldb_ldif_write(struct ldb_context *ldb,
for (j=0;j<msg->elements[i].num_values;j++) {
struct ldb_val v;
- ret = h->ldif_write_fn(ldb, ldb, &msg->elements[i].values[j], &v);
+ ret = h->ldif_write_fn(ldb, mem_ctx, &msg->elements[i].values[j], &v);
CHECK_RET;
if (ldb_should_b64_encode(&v)) {
ret = fprintf_fn(private_data, "%s:: ",
@@ -541,6 +550,7 @@ struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
if (!chunk) {
goto failed;
}
+ talloc_steal(ldif, chunk);
msg->private_data = chunk;
s = chunk;
diff --git a/source3/lib/ldb/common/ldb_modules.c b/source3/lib/ldb/common/ldb_modules.c
index d627f3b9fa..325cab6dfd 100644
--- a/source3/lib/ldb/common/ldb_modules.c
+++ b/source3/lib/ldb/common/ldb_modules.c
@@ -266,6 +266,7 @@ int ldb_load_modules_list(struct ldb_context *ldb, const char **module_list, str
if (current == NULL) {
return LDB_ERR_OPERATIONS_ERROR;
}
+ talloc_set_name(current, "ldb_module: %s", module_list[i]);
current->ldb = ldb;
current->ops = ops;