From b4eee348c4d36e67ba83651c250366e84e7125dd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 18 Jun 2005 10:38:06 +0000 Subject: r7720: - simplify the asn1 decode of ldap_search() a lot, taking advantage of the fact that the ldap data structures now use ldb_message_element. - fixed null termination of elements in ildap (This used to be commit 09060994c1ed12073ae6e1131d7074db8fdc523c) --- source4/ldap_server/ldap_rootdse.c | 20 ++++---------------- source4/libcli/ldap/ldap.c | 4 +++- source4/libcli/ldap/ldap_msg.c | 5 +++-- source4/libcli/util/asn1.c | 1 - 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/source4/ldap_server/ldap_rootdse.c b/source4/ldap_server/ldap_rootdse.c index 39e299ece1..d4e11e429a 100644 --- a/source4/ldap_server/ldap_rootdse.c +++ b/source4/ldap_server/ldap_rootdse.c @@ -309,28 +309,16 @@ static NTSTATUS rootdse_Search(struct ldapsrv_partition *partition, struct ldaps goto queue_reply; } ent->num_attributes = res[0]->num_elements; - ent->attributes = talloc_array(ent_r, struct ldb_message_element, ent->num_attributes); - NT_STATUS_HAVE_NO_MEMORY(ent->attributes); + ent->attributes = talloc_steal(ent_r, res[0]->elements); + for (j=0; j < ent->num_attributes; j++) { - 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[0]->elements[j].num_values; if (ent->attributes[j].num_values == 1 && - strncmp(res[0]->elements[j].values[0].data, "_DYNAMIC_", 9) == 0) { + ent->attributes[j].values[0].length >= 9 && + strncmp(ent->attributes[j].values[0].data, "_DYNAMIC_", 9) == 0) { status = fill_dynamic_values(ent->attributes, &(ent->attributes[j])); if (!NT_STATUS_IS_OK(status)) { return status; } - } else { - ent->attributes[j].values = talloc_array(ent->attributes, - DATA_BLOB, ent->attributes[j].num_values); - NT_STATUS_HAVE_NO_MEMORY(ent->attributes[j].values); - for (y=0; y < ent->attributes[j].num_values; y++) { - 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[0]->elements[j].values[y].data); - } } } queue_reply: diff --git a/source4/libcli/ldap/ldap.c b/source4/libcli/ldap/ldap.c index c642fc3e4b..83858b1768 100644 --- a/source4/libcli/ldap/ldap.c +++ b/source4/libcli/ldap/ldap.c @@ -98,6 +98,9 @@ static BOOL ldap_push_filter(struct asn1_data *data, struct ldb_parse_tree *tree asn1_pop_tag(data); break; + case LDB_OP_NOT: + #warning "OP_NOT missing" + default: return False; } @@ -605,7 +608,6 @@ static void ldap_decode_attrib(TALLOC_CTX *mem_ctx, struct asn1_data *data, DATA_BLOB blob; asn1_read_OctetString(data, &blob); add_value_to_attrib(mem_ctx, &blob, attrib); - data_blob_free(&blob); } asn1_end_tag(data); asn1_end_tag(data); diff --git a/source4/libcli/ldap/ldap_msg.c b/source4/libcli/ldap/ldap_msg.c index 901c42a62a..9b531f3138 100644 --- a/source4/libcli/ldap/ldap_msg.c +++ b/source4/libcli/ldap/ldap_msg.c @@ -43,8 +43,9 @@ BOOL add_value_to_attrib(TALLOC_CTX *mem_ctx, struct ldb_val *value, if (attrib->values == NULL) return False; - attrib->values[attrib->num_values] = - data_blob_talloc(attrib->values, value->data, value->length); + attrib->values[attrib->num_values].data = talloc_steal(attrib->values, + value->data); + attrib->values[attrib->num_values].length = value->length; attrib->num_values += 1; return True; } diff --git a/source4/libcli/util/asn1.c b/source4/libcli/util/asn1.c index 510ffa37cf..92f9a8c389 100644 --- a/source4/libcli/util/asn1.c +++ b/source4/libcli/util/asn1.c @@ -576,7 +576,6 @@ BOOL asn1_read_Integer(struct asn1_data *data, int *i) if (!asn1_start_tag(data, ASN1_INTEGER)) return False; if (!asn1_read_implicit_Integer(data, i)) return False; return asn1_end_tag(data); - } /* read an interger */ -- cgit