summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Nagy <mnagy@redhat.com>2009-02-17 18:30:12 +0100
committerMartin Nagy <mnagy@redhat.com>2009-02-18 18:20:54 +0100
commit5547d52f8f4893e361f1a09f7afd4f285e1f0f02 (patch)
tree0923b550829130d4724974fef10821dd0462d3f2
parentc724705f8310f59525d08f9e0c5721c4db5beb2b (diff)
downloadldap_driver_testing-5547d52f8f4893e361f1a09f7afd4f285e1f0f02.tar.gz
ldap_driver_testing-5547d52f8f4893e361f1a09f7afd4f285e1f0f02.tar.xz
ldap_driver_testing-5547d52f8f4893e361f1a09f7afd4f285e1f0f02.zip
Allocate rdataset separately from rdlist.
We need to do this in order to be able to free ldapnode and keep rdataset preserved. As a TODO, we need to overwrite rdataset methods, specifically the disassociate method that will free the rdlist inside. For now, every memory allocated for the rdataset will be leaked.
-rw-r--r--ldap_driver.c73
1 files changed, 67 insertions, 6 deletions
diff --git a/ldap_driver.c b/ldap_driver.c
index 1e10d83..40dfa79 100644
--- a/ldap_driver.c
+++ b/ldap_driver.c
@@ -23,6 +23,7 @@
#include <isc/util.h>
#include <dns/db.h>
+#include <dns/rdata.h>
#include <dns/rdatalist.h>
#include <dns/result.h>
#include <dns/types.h>
@@ -97,6 +98,65 @@ cleanup:
}
/*
+ * Clone rdlist and convert it into rdataset.
+ */
+static isc_result_t
+clone_rdatalist_to_rdataset(isc_mem_t *mctx, dns_rdatalist_t *rdlist,
+ dns_rdataset_t *rdataset)
+{
+ isc_result_t result;
+ dns_rdatalist_t *new_rdlist;
+ dns_rdata_t *rdata;
+ dns_rdata_t *new_rdata;
+
+ REQUIRE(mctx != NULL);
+
+ CHECKED_MEM_GET_PTR(mctx, new_rdlist);
+
+ new_rdlist->rdclass = rdlist->rdclass;
+ new_rdlist->type = rdlist->type;
+ new_rdlist->covers = rdlist->covers;
+ new_rdlist->ttl = rdlist->ttl;
+
+ INIT_LIST(new_rdlist->rdata);
+ INIT_LINK(new_rdlist, link);
+
+ for (rdata = HEAD(rdlist->rdata);
+ rdata != NULL;
+ rdata = NEXT(rdata, link)) {
+ CHECKED_MEM_GET_PTR(mctx, new_rdata);
+ ZERO_PTR(new_rdata);
+
+ CHECKED_MEM_GET(mctx, new_rdata->data, rdata->length);
+ memcpy(new_rdata->data, rdata->data, rdata->length);
+ new_rdata->length = rdata->length;
+ new_rdata->rdclass = rdata->rdclass;
+ new_rdata->type = rdata->type;
+ new_rdata->flags = rdata->flags;
+ INIT_LINK(new_rdata, link);
+
+ APPEND(new_rdlist->rdata, new_rdata, link);
+ }
+
+ result = dns_rdatalist_tordataset(new_rdlist, rdataset);
+
+ return result;
+
+cleanup:
+ if (new_rdlist != NULL) {
+ for (rdata = HEAD(new_rdlist->rdata);
+ rdata != NULL;
+ rdata = NEXT(rdata, link)) {
+ SAFE_MEM_PUT(mctx, rdata->data, rdata->length);
+ SAFE_MEM_PUT_PTR(mctx, rdata);
+ }
+ }
+ SAFE_MEM_PUT_PTR(mctx, new_rdlist);
+
+ return result;
+}
+
+/*
* Functions.
*
* Most of them don't need db parameter but we are checking if it is valid.
@@ -304,9 +364,8 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
log_func_enter();
REQUIRE(VALID_LDAPDB(ldapdb));
-
- /* XXX not yet implemented */
- INSIST(type != dns_rdatatype_any);
+ REQUIRE(!(node != NULL && type == dns_rdatatype_any));
+ //REQUIRE(!(node == NULL && rdataset != NULL));
if (version != NULL) {
REQUIRE(version == ldapdb_version);
@@ -343,10 +402,10 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
if (result != ISC_R_SUCCESS)
goto cleanup;
- if (rdataset != NULL) {
+ if (rdataset != NULL && type != dns_rdatatype_any) {
/* dns_rdatalist_tordataset returns success only */
- result = dns_rdatalist_tordataset(rdlist, rdataset);
- INSIST(result == ISC_R_SUCCESS);
+ CHECK(clone_rdatalist_to_rdataset(ldapdb->common.mctx, rdlist,
+ rdataset));
}
if (nodep != NULL) {
@@ -356,6 +415,8 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
}
memcpy(&node->rdatalist, &rdatalist, sizeof(rdatalist));
*nodep = node;
+ } else {
+ ldapdb_rdatalist_destroy(ldapdb->common.mctx, &rdatalist);
}
return (is_cname == ISC_TRUE) ? DNS_R_CNAME : ISC_R_SUCCESS;