diff options
-rw-r--r-- | source4/dns_server/dns_query.c | 43 | ||||
-rw-r--r-- | source4/dns_server/dns_server.h | 5 | ||||
-rw-r--r-- | source4/dns_server/dns_utils.c | 46 |
3 files changed, 58 insertions, 36 deletions
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c index b233b25a81..5320e21f5c 100644 --- a/source4/dns_server/dns_query.c +++ b/source4/dns_server/dns_query.c @@ -89,48 +89,22 @@ static WERROR handle_question(struct dns_server *dns, struct dns_res_rec **answers, uint16_t *ancount) { struct dns_res_rec *ans; - struct ldb_dn *dn = NULL; WERROR werror; - static const char * const attrs[] = { "dnsRecord", NULL}; - int ret; - uint16_t ai = *ancount; unsigned int ri; - struct ldb_message *msg = NULL; struct dnsp_DnssrvRpcRecord *recs; - struct ldb_message_element *el; + uint16_t rec_count, ai = 0; + struct ldb_dn *dn = NULL; werror = dns_name2dn(dns, mem_ctx, question->name, &dn); W_ERROR_NOT_OK_RETURN(werror); - ret = dsdb_search_one(dns->samdb, mem_ctx, &msg, dn, - LDB_SCOPE_BASE, attrs, 0, "%s", "(objectClass=dnsNode)"); - if (ret != LDB_SUCCESS) { - return DNS_ERR(NAME_ERROR); - } - - el = ldb_msg_find_element(msg, attrs[0]); - if (el == NULL) { - return DNS_ERR(NAME_ERROR); - } - - recs = talloc_array(mem_ctx, struct dnsp_DnssrvRpcRecord, el->num_values); - for (ri = 0; ri < el->num_values; ri++) { - struct ldb_val *v = &el->values[ri]; - enum ndr_err_code ndr_err; - - ndr_err = ndr_pull_struct_blob(v, recs, &recs[ri], - (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - DEBUG(0, ("Failed to grab dnsp_DnssrvRpcRecord\n")); - return DNS_ERR(SERVER_FAILURE); - } - } + werror = dns_lookup_records(dns, mem_ctx, dn, &recs, &rec_count); + W_ERROR_NOT_OK_RETURN(werror); - ans = talloc_realloc(mem_ctx, *answers, struct dns_res_rec, - ai + el->num_values); + ans = talloc_zero_array(mem_ctx, struct dns_res_rec, rec_count); W_ERROR_HAVE_NO_MEMORY(ans); - for (ri = 0; ri < el->num_values; ri++) { + for (ri = 0; ri < rec_count; ri++) { if ((question->question_type != DNS_QTYPE_ALL) && (recs[ri].wType != question->question_type)) { continue; @@ -138,7 +112,7 @@ static WERROR handle_question(struct dns_server *dns, create_response_rr(question, &recs[ri], &ans, &ai); } - if (*ancount == ai) { + if (ai == 0) { return DNS_ERR(NAME_ERROR); } @@ -169,9 +143,6 @@ WERROR dns_server_process_query(struct dns_server *dns, return DNS_ERR(NOT_IMPLEMENTED); } - ans = talloc_array(mem_ctx, struct dns_res_rec, 0); - W_ERROR_HAVE_NO_MEMORY(ans); - werror = handle_question(dns, mem_ctx, &in->questions[0], &ans, &num_answers); W_ERROR_NOT_OK_GOTO(werror, query_failed); diff --git a/source4/dns_server/dns_server.h b/source4/dns_server/dns_server.h index 7387641c63..f1e9da5ffd 100644 --- a/source4/dns_server/dns_server.h +++ b/source4/dns_server/dns_server.h @@ -59,6 +59,11 @@ bool dns_name_match(const char *zone, const char *name, size_t *host_part_len); bool dns_name_equal(const char *name1, const char *name2); bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2); +WERROR dns_lookup_records(struct dns_server *dns, + TALLOC_CTX *mem_ctx, + struct ldb_dn *dn, + struct dnsp_DnssrvRpcRecord **records, + uint16_t *rec_count); WERROR dns_name2dn(struct dns_server *dns, TALLOC_CTX *mem_ctx, const char *name, diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c index 5da32c0c53..c0e7ff7583 100644 --- a/source4/dns_server/dns_utils.c +++ b/source4/dns_server/dns_utils.c @@ -163,6 +163,52 @@ bool dns_records_match(struct dnsp_DnssrvRpcRecord *rec1, return false; } +WERROR dns_lookup_records(struct dns_server *dns, + TALLOC_CTX *mem_ctx, + struct ldb_dn *dn, + struct dnsp_DnssrvRpcRecord **records, + uint16_t *rec_count) +{ + static const char * const attrs[] = { "dnsRecord", NULL}; + struct ldb_message_element *el; + uint16_t ri; + int ret; + struct ldb_message *msg = NULL; + struct dnsp_DnssrvRpcRecord *recs; + + ret = dsdb_search_one(dns->samdb, mem_ctx, &msg, dn, + LDB_SCOPE_BASE, attrs, 0, "%s", "(objectClass=dnsNode)"); + if (ret != LDB_SUCCESS) { + /* TODO: we need to check if there's a glue record we need to + * create a referral to */ + return DNS_ERR(NAME_ERROR); + } + + el = ldb_msg_find_element(msg, attrs[0]); + if (el == NULL) { + *records = NULL; + *rec_count = 0; + return WERR_OK; + } + + recs = talloc_zero_array(mem_ctx, struct dnsp_DnssrvRpcRecord, el->num_values); + W_ERROR_HAVE_NO_MEMORY(recs); + for (ri = 0; ri < el->num_values; ri++) { + struct ldb_val *v = &el->values[ri]; + enum ndr_err_code ndr_err; + + ndr_err = ndr_pull_struct_blob(v, recs, &recs[ri], + (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + DEBUG(0, ("Failed to grab dnsp_DnssrvRpcRecord\n")); + return DNS_ERR(SERVER_FAILURE); + } + } + *records = recs; + *rec_count = el->num_values; + return WERR_OK; +} + WERROR dns_name2dn(struct dns_server *dns, TALLOC_CTX *mem_ctx, const char *name, |