From dc3e65b25295f68d0c7c5d3a7cc9bade638661f4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Oct 2005 08:11:45 +0000 Subject: r10917: copy the element name in a ldb_msg_rename_attr() and ldb_msg_copy_attr() to ensure that callers (like the ldap server) can talloc_steal the name (This used to be commit 9c914542cc346758c82f89990c80eb096a9c0959) --- source4/lib/ldb/common/ldb_msg.c | 14 +++++++++----- source4/lib/ldb/include/ldb.h | 2 +- source4/lib/ldb/modules/operational.c | 11 ++++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/source4/lib/ldb/common/ldb_msg.c b/source4/lib/ldb/common/ldb_msg.c index 1c7ae3920a..a72a4616fb 100644 --- a/source4/lib/ldb/common/ldb_msg.c +++ b/source4/lib/ldb/common/ldb_msg.c @@ -587,12 +587,17 @@ int ldb_attr_in_list(const char * const *attrs, const char *attr) /* rename the specified attribute in a search result */ -void ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace) +int ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace) { struct ldb_message_element *el = ldb_msg_find_element(msg, attr); - if (el != NULL) { - el->name = replace; + if (el == NULL) { + return 0; + } + el->name = talloc_strdup(msg->elements, replace); + if (el->name == NULL) { + return -1; } + return 0; } @@ -608,8 +613,7 @@ int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *rep if (ldb_msg_add(msg, el, 0) != 0) { return -1; } - ldb_msg_rename_attr(msg, attr, replace); - return 0; + return ldb_msg_rename_attr(msg, attr, replace); } diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h index d346d0edac..3629d9ec47 100644 --- a/source4/lib/ldb/include/ldb.h +++ b/source4/lib/ldb/include/ldb.h @@ -497,7 +497,7 @@ void ldb_parse_tree_attr_replace(struct ldb_parse_tree *tree, const char *attr, const char *replace); -void ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace); +int ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace); int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *replace); char *ldb_timestring(TALLOC_CTX *mem_ctx, time_t t); diff --git a/source4/lib/ldb/modules/operational.c b/source4/lib/ldb/modules/operational.c index d1e83c02e0..09f9a9e62c 100644 --- a/source4/lib/ldb/modules/operational.c +++ b/source4/lib/ldb/modules/operational.c @@ -113,6 +113,8 @@ static int operational_search_bytree(struct ldb_module *module, int ret; const char **search_attrs = NULL; + (*res) = NULL; + /* replace any attributes in the parse tree that are searchable, but are stored using a different name in the backend */ @@ -165,9 +167,11 @@ static int operational_search_bytree(struct ldb_module *module, goto oom; } } else { - ldb_msg_rename_attr((*res)[r], - search_sub[i].replace, - search_sub[i].attr); + if (ldb_msg_rename_attr((*res)[r], + search_sub[i].replace, + search_sub[i].attr) != 0) { + goto oom; + } } } } @@ -179,6 +183,7 @@ static int operational_search_bytree(struct ldb_module *module, oom: talloc_free(search_attrs); + talloc_free(*res); ldb_oom(module->ldb); return -1; } -- cgit