summaryrefslogtreecommitdiff
path: root/source4/ldap_server/ldap_rootdse.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/ldap_server/ldap_rootdse.c')
-rw-r--r--source4/ldap_server/ldap_rootdse.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/source4/ldap_server/ldap_rootdse.c b/source4/ldap_server/ldap_rootdse.c
index b936c92da3..631b38d383 100644
--- a/source4/ldap_server/ldap_rootdse.c
+++ b/source4/ldap_server/ldap_rootdse.c
@@ -100,7 +100,7 @@ void *rootdse_db_connect(TALLOC_CTX *mem_ctx)
return NULL;
}
- DEBUG(10, ("opening %s", db_path));
+ DEBUG(10, ("opening %s\n", db_path));
ctx->ldb = ldb_connect(db_path, 0, NULL);
if (ctx->ldb == NULL) {
talloc_free(ctx);
@@ -291,7 +291,6 @@ static NTSTATUS fill_dynamic_values(void *mem_ctx, struct ldap_attribute *attrs)
* 2
*/
-def:
{
DATA_BLOB *x = talloc_array_p(mem_ctx, DATA_BLOB, 1);
x[0] = ATTR_BLOB_CONST("0");
@@ -312,7 +311,8 @@ static NTSTATUS rootdse_Search(struct ldapsrv_partition *partition, struct ldaps
struct ldapsrv_reply *ent_r, *done_r;
struct rootdse_db_context *rootdsedb;
const char *errstr = NULL;
- int count, i, j, y;
+ int count, j, y;
+ const char **attrs = NULL;
if (r->scope != LDAP_SEARCH_SCOPE_BASE) {
count = -1;
@@ -325,10 +325,21 @@ static NTSTATUS rootdse_Search(struct ldapsrv_partition *partition, struct ldaps
rootdsedb = rootdse_db_connect(local_ctx);
ALLOC_CHECK(rootdsedb);
+ if (r->num_attributes >= 1) {
+ attrs = talloc_array_p(rootdsedb, const char *, r->num_attributes+1);
+ ALLOC_CHECK(attrs);
+
+ for (j=0; j < r->num_attributes; j++) {
+ DEBUG(10,("rootDSE_Search: attrs: [%s]\n",r->attributes[j]));
+ attrs[j] = r->attributes[j];
+ }
+ attrs[j] = NULL;
+ }
+
ldb_set_alloc(rootdsedb->ldb, talloc_realloc_fn, rootdsedb);
- count = ldb_search(rootdsedb->ldb, "", 0, "dn=rootDSE", NULL, &res);
+ count = ldb_search(rootdsedb->ldb, "", 0, "dn=cn=rootDSE", attrs, &res);
- for (i = 0; i < count; i++) {
+ if (count == 1) {
ent_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultEntry);
if (!ent_r) {
return NT_STATUS_NO_MEMORY;
@@ -338,19 +349,19 @@ static NTSTATUS rootdse_Search(struct ldapsrv_partition *partition, struct ldaps
ent->dn = "";
ent->num_attributes = 0;
ent->attributes = NULL;
- if (res[i]->num_elements == 0) {
+ if (res[0]->num_elements == 0) {
goto queue_reply;
}
- ent->num_attributes = res[i]->num_elements;
+ ent->num_attributes = res[0]->num_elements;
ent->attributes = talloc_array_p(ent_r, struct ldap_attribute, ent->num_attributes);
ALLOC_CHECK(ent->attributes);
for (j=0; j < ent->num_attributes; j++) {
- ent->attributes[j].name = talloc_steal(ent->attributes, res[i]->elements[j].name);
+ ent->attributes[j].name = talloc_steal(ent->attributes, res[0]->elements[j].name);
ent->attributes[j].num_values = 0;
ent->attributes[j].values = NULL;
- ent->attributes[j].num_values = res[i]->elements[j].num_values;
+ ent->attributes[j].num_values = res[0]->elements[j].num_values;
if (ent->attributes[j].num_values == 1 &&
- strncmp(res[i]->elements[j].values[0].data, "_DYNAMIC_", 9) == 0) {
+ strncmp(res[0]->elements[j].values[0].data, "_DYNAMIC_", 9) == 0) {
fill_dynamic_values(ent->attributes, &(ent->attributes[j]));
if (ent->attributes[j].values[0].data == NULL) {
DEBUG (10, ("ARRGHH!\n"));
@@ -360,9 +371,9 @@ static NTSTATUS rootdse_Search(struct ldapsrv_partition *partition, struct ldaps
DATA_BLOB, ent->attributes[j].num_values);
ALLOC_CHECK(ent->attributes[j].values);
for (y=0; y < ent->attributes[j].num_values; y++) {
- ent->attributes[j].values[y].length = res[i]->elements[j].values[y].length;
+ ent->attributes[j].values[y].length = res[0]->elements[j].values[y].length;
ent->attributes[j].values[y].data = talloc_steal(ent->attributes[j].values,
- res[i]->elements[j].values[y].data);
+ res[0]->elements[j].values[y].data);
}
}
}
@@ -382,10 +393,14 @@ no_base_scope:
return NT_STATUS_NO_MEMORY;
}
- if (count > 0) {
+ if (count == 1) {
DEBUG(10,("rootdse_Search: results: [%d]\n",count));
result = 0;
errstr = NULL;
+ } else if (count > 1) {
+ DEBUG(10,("rootdse_Search: to many results[%d]\n", count));
+ result = 80; /* nosuchobject */
+ errstr = talloc_strdup(done_r, "internal error");
} else if (count == 0) {
DEBUG(10,("rootdse_Search: no results\n"));
result = 32; /* nosuchobject */
@@ -396,7 +411,6 @@ no_base_scope:
errstr = talloc_strdup(done_r, ldb_errstring(rootdsedb->ldb));
}
-
done = &done_r->msg.r.SearchResultDone;
done->resultcode = result;
done->dn = NULL;