summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/kdc/hdb-ldb.c5
-rw-r--r--source4/lib/ldb/common/ldb_dn.c25
-rw-r--r--source4/lib/ldb/include/ldb.h2
-rw-r--r--source4/libnet/libnet_samsync_ldb.c21
-rw-r--r--source4/ntptr/simple_ldb/ntptr_simple_ldb.c6
-rw-r--r--source4/rpc_server/lsa/dcesrv_lsa.c5
-rw-r--r--source4/rpc_server/samr/dcesrv_samr.c14
7 files changed, 36 insertions, 42 deletions
diff --git a/source4/kdc/hdb-ldb.c b/source4/kdc/hdb-ldb.c
index 78084f2e89..f138373cc3 100644
--- a/source4/kdc/hdb-ldb.c
+++ b/source4/kdc/hdb-ldb.c
@@ -624,10 +624,9 @@ static krb5_error_code LDB_lookup_spn_alias(krb5_context context, struct ldb_con
int count;
struct ldb_message **msg;
struct ldb_message_element *spnmappings;
- struct ldb_dn *service_dn = ldb_dn_compose_string_dn(mem_ctx,
+ struct ldb_dn *service_dn = ldb_dn_string_compose(mem_ctx, realm_dn,
"CN=Directory Service,CN=Windows NT"
- ",CN=Services,CN=Configuration",
- realm_dn);
+ ",CN=Services,CN=Configuration");
char *service_dn_str = ldb_dn_linearize(mem_ctx, service_dn);
const char *directory_attrs[] = {
"sPNMappings",
diff --git a/source4/lib/ldb/common/ldb_dn.c b/source4/lib/ldb/common/ldb_dn.c
index dae79fd9e1..df95e37dac 100644
--- a/source4/lib/ldb/common/ldb_dn.c
+++ b/source4/lib/ldb/common/ldb_dn.c
@@ -771,7 +771,9 @@ struct ldb_dn *ldb_dn_compose(void *mem_ctx, const struct ldb_dn *dn1, const str
new->comp_num = dn1->comp_num;
new->components = talloc_array(new, struct ldb_dn_component, new->comp_num);
} else {
- new = ldb_dn_copy_partial(mem_ctx, dn2, dn2->comp_num + dn1?dn1->comp_num:0);
+ int comp_num = dn2->comp_num;
+ if (dn1 != NULL) comp_num += dn1->comp_num;
+ new = ldb_dn_copy_partial(mem_ctx, dn2, comp_num);
}
if (dn1 == NULL) {
@@ -790,11 +792,26 @@ failed:
return NULL;
}
-struct ldb_dn *ldb_dn_compose_string_dn(void *mem_ctx, const char *dn1, const struct ldb_dn *dn2)
+struct ldb_dn *ldb_dn_string_compose(void *mem_ctx, const struct ldb_dn *base, const char *child_fmt, ...)
{
- if (dn1 == NULL) return NULL;
+ struct ldb_dn *dn;
+ char *child_str;
+ va_list ap;
+ int ret;
+
+ if (child_fmt == NULL) return NULL;
+
+ va_start(ap, child_fmt);
+ ret = vasprintf(&child_str, child_fmt, ap);
+ va_end(ap);
+
+ if (ret <= 0) return NULL;
- return ldb_dn_compose(mem_ctx, ldb_dn_explode(mem_ctx, dn1), dn2);
+ dn = ldb_dn_compose(mem_ctx, ldb_dn_explode(mem_ctx, child_str), base);
+
+ free(child_str);
+
+ return dn;
}
struct ldb_dn_component *ldb_dn_get_rdn(void *mem_ctx, const struct ldb_dn *dn)
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index 13c9b72e6d..e7862522e4 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -371,7 +371,7 @@ struct ldb_dn *ldb_dn_make_child(void *mem_ctx,
const struct ldb_dn_component *component,
const struct ldb_dn *base);
struct ldb_dn *ldb_dn_compose(void *mem_ctx, const struct ldb_dn *dn1, const struct ldb_dn *dn2);
-struct ldb_dn *ldb_dn_compose_string_dn(void *mem_ctx, const char *dn1, const struct ldb_dn *dn2);
+struct ldb_dn *ldb_dn_string_compose(void *mem_ctx, const struct ldb_dn *base, const char *child_fmt, ...);
struct ldb_dn_component *ldb_dn_get_rdn(void *mem_ctx, const struct ldb_dn *dn);
/* useful functions for ldb_message structure manipulation */
diff --git a/source4/libnet/libnet_samsync_ldb.c b/source4/libnet/libnet_samsync_ldb.c
index 4ec7c60715..8d06ec84b6 100644
--- a/source4/libnet/libnet_samsync_ldb.c
+++ b/source4/libnet/libnet_samsync_ldb.c
@@ -337,11 +337,8 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
if (add) {
samdb_msg_add_string(state->sam_ldb, mem_ctx, msg,
"objectClass", obj_class);
- msg->dn = ldb_dn_build_child(mem_ctx,
- "CN", cn_name,
- ldb_dn_build_child(mem_ctx,
- "CN", container,
- state->base_dn[database]));
+ msg->dn = ldb_dn_string_compose(mem_ctx, state->base_dn[database],
+ "CN=%s, CN=%s", cn_name, container);
if (!msg->dn) {
return NT_STATUS_NO_MEMORY;
}
@@ -477,11 +474,8 @@ static NTSTATUS samsync_ldb_handle_group(TALLOC_CTX *mem_ctx,
if (add) {
samdb_msg_add_string(state->sam_ldb, mem_ctx, msg,
"objectClass", obj_class);
- msg->dn = ldb_dn_build_child(mem_ctx,
- "CN", cn_name,
- ldb_dn_build_child(mem_ctx,
- "CN", container,
- state->base_dn[database]));
+ msg->dn = ldb_dn_string_compose(mem_ctx, state->base_dn[database],
+ "CN=%s, CN=%s", cn_name, container);
if (!msg->dn) {
return NT_STATUS_NO_MEMORY;
}
@@ -694,11 +688,8 @@ static NTSTATUS samsync_ldb_handle_alias(TALLOC_CTX *mem_ctx,
if (add) {
samdb_msg_add_string(state->sam_ldb, mem_ctx, msg,
"objectClass", obj_class);
- msg->dn = ldb_dn_build_child(mem_ctx,
- "CN", cn_name,
- ldb_dn_build_child(mem_ctx,
- "CN", container,
- state->base_dn[database]));
+ msg->dn = ldb_dn_string_compose(mem_ctx, state->base_dn[database],
+ "CN=%s, CN=%s", cn_name, container);
if (!msg->dn) {
return NT_STATUS_NO_MEMORY;
}
diff --git a/source4/ntptr/simple_ldb/ntptr_simple_ldb.c b/source4/ntptr/simple_ldb/ntptr_simple_ldb.c
index c0ae2e078d..78280e294b 100644
--- a/source4/ntptr/simple_ldb/ntptr_simple_ldb.c
+++ b/source4/ntptr/simple_ldb/ntptr_simple_ldb.c
@@ -710,11 +710,7 @@ static WERROR sptr_GetPrinterForm(struct ntptr_GenericHandle *printer, TALLOC_CT
* }
*/
- base_dn = ldb_dn_compose_string_dn(mem_ctx,
- "CN=Forms",
- ldb_dn_build_child(mem_ctx,
- "CN", printer->object_name,
- ldb_dn_explode(mem_ctx, "CN=Printers")));
+ base_dn = ldb_dn_string_compose(mem_ctx, NULL, "CN=Forms, CN=%s, CN=Printers", printer->object_name);
W_ERROR_HAVE_NO_MEMORY(base_dn);
count = sptr_db_search(sptr_db, mem_ctx, base_dn, &msgs, NULL,
diff --git a/source4/rpc_server/lsa/dcesrv_lsa.c b/source4/rpc_server/lsa/dcesrv_lsa.c
index 9ee0d6faec..bac25fcc24 100644
--- a/source4/rpc_server/lsa/dcesrv_lsa.c
+++ b/source4/rpc_server/lsa/dcesrv_lsa.c
@@ -1774,10 +1774,7 @@ static NTSTATUS lsa_CreateSecret(struct dcesrv_call_state *dce_call, TALLOC_CTX
return NT_STATUS_INTERNAL_DB_CORRUPTION;
}
- msg->dn = ldb_dn_build_child(mem_ctx,
- "cn", name,
- ldb_dn_build_child(mem_ctx,
- "cn", "LSA Secrets", NULL));
+ msg->dn = ldb_dn_string_compose(mem_ctx, NULL, "cn=%s,cn=LSA Secrets", name);
samdb_msg_add_string(secret_state->sam_ldb, mem_ctx, msg, "cn", name);
}
diff --git a/source4/rpc_server/samr/dcesrv_samr.c b/source4/rpc_server/samr/dcesrv_samr.c
index 81db2b386b..ff15eb43bb 100644
--- a/source4/rpc_server/samr/dcesrv_samr.c
+++ b/source4/rpc_server/samr/dcesrv_samr.c
@@ -554,11 +554,8 @@ static NTSTATUS samr_CreateDomainGroup(struct dcesrv_call_state *dce_call, TALLO
}
/* add core elements to the ldb_message for the user */
- msg->dn = ldb_dn_build_child(mem_ctx,
- "CN", groupname,
- ldb_dn_build_child(mem_ctx,
- "CN", "Users",
- d_state->domain_dn));
+ msg->dn = ldb_dn_string_compose(mem_ctx, d_state->domain_dn,
+ "CN=%s, CN=Users", groupname);
if (!msg->dn) {
return NT_STATUS_NO_MEMORY;
}
@@ -991,11 +988,8 @@ static NTSTATUS samr_CreateDomAlias(struct dcesrv_call_state *dce_call, TALLOC_C
}
/* add core elements to the ldb_message for the alias */
- msg->dn = ldb_dn_build_child(mem_ctx,
- "CN", alias_name,
- ldb_dn_build_child(mem_ctx,
- "CN", "Users",
- d_state->domain_dn));
+ msg->dn = ldb_dn_string_compose(mem_ctx, d_state->domain_dn,
+ "CN=%s, CN=Users", alias_name);
if (!msg->dn) {
return NT_STATUS_NO_MEMORY;
}