summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2014-07-31 08:19:50 +0200
committerKarolin Seeger <kseeger@samba.org>2014-09-08 07:49:10 +0200
commitd3abd55d2511fb3353baaed524bef0b3f319243f (patch)
treed2411f0bb29241f5f542047672e3f6e020857beb /source4
parente6adf09984855717a076604f313185019543681b (diff)
downloadsamba-d3abd55d2511fb3353baaed524bef0b3f319243f.tar.gz
s4:dns_server: map LDB_ERR_NO_SUCH_OBJECT to WERR_DNS_ERROR_NAME_DOES_NOT_EXIST
This is the correct fix for commit 8b24c43b382740106474e26dec59e1419ba77306 and Bug: https://bugzilla.samba.org/show_bug.cgi?id=9559 With this change we have a consistent behavior between internal server and the bind dlz module. We keep a dangling LDAP object without dnsRecord attribute arround forever. This will be fixed in the following commits. Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749 Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Michael Adam <obnox@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org> (cherry picked from commit d0f424a23dc915d9fce625438d2bd63519757cba)
Diffstat (limited to 'source4')
-rw-r--r--source4/dns_server/dns_update.c21
-rw-r--r--source4/dns_server/dns_utils.c17
2 files changed, 24 insertions, 14 deletions
diff --git a/source4/dns_server/dns_update.c b/source4/dns_server/dns_update.c
index 9edc40bc341..c439d8d27ba 100644
--- a/source4/dns_server/dns_update.c
+++ b/source4/dns_server/dns_update.c
@@ -82,6 +82,9 @@ static WERROR check_one_prerequisite(struct dns_server *dns,
/*
*/
werror = dns_lookup_records(dns, mem_ctx, dn, &ans, &acount);
+ if (W_ERROR_EQUAL(werror, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
+ return DNS_ERR(NAME_ERROR);
+ }
W_ERROR_NOT_OK_RETURN(werror);
if (acount == 0) {
@@ -91,6 +94,9 @@ static WERROR check_one_prerequisite(struct dns_server *dns,
/*
*/
werror = dns_lookup_records(dns, mem_ctx, dn, &ans, &acount);
+ if (W_ERROR_EQUAL(werror, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
+ return DNS_ERR(NXRRSET);
+ }
if (W_ERROR_EQUAL(werror, DNS_ERR(NAME_ERROR))) {
return DNS_ERR(NXRRSET);
}
@@ -131,10 +137,11 @@ static WERROR check_one_prerequisite(struct dns_server *dns,
/*
*/
werror = dns_lookup_records(dns, mem_ctx, dn, &ans, &acount);
+ if (W_ERROR_EQUAL(werror, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
+ werror = WERR_OK;
+ }
if (W_ERROR_EQUAL(werror, DNS_ERR(NAME_ERROR))) {
werror = WERR_OK;
- ans = NULL;
- acount = 0;
}
for (i = 0; i < acount; i++) {
@@ -163,6 +170,9 @@ static WERROR check_one_prerequisite(struct dns_server *dns,
*final_result = false;
werror = dns_lookup_records(dns, mem_ctx, dn, &ans, &acount);
+ if (W_ERROR_EQUAL(werror, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
+ return DNS_ERR(NXRRSET);
+ }
if (W_ERROR_EQUAL(werror, DNS_ERR(NAME_ERROR))) {
return DNS_ERR(NXRRSET);
}
@@ -421,12 +431,13 @@ static WERROR handle_one_update(struct dns_server *dns,
W_ERROR_NOT_OK_RETURN(werror);
werror = dns_lookup_records(dns, mem_ctx, dn, &recs, &rcount);
- if (W_ERROR_EQUAL(werror, DNS_ERR(NAME_ERROR))) {
- recs = NULL;
- rcount = 0;
+ if (W_ERROR_EQUAL(werror, WERR_DNS_ERROR_NAME_DOES_NOT_EXIST)) {
needs_add = true;
werror = WERR_OK;
}
+ if (W_ERROR_EQUAL(werror, DNS_ERR(NAME_ERROR))) {
+ werror = WERR_OK;
+ }
W_ERROR_NOT_OK_RETURN(werror);
if (update->rr_class == zone->question_class) {
diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c
index 86f7e7cd192..14ca2f41738 100644
--- a/source4/dns_server/dns_utils.c
+++ b/source4/dns_server/dns_utils.c
@@ -194,8 +194,14 @@ WERROR dns_lookup_records(struct dns_server *dns,
struct ldb_message *msg = NULL;
struct dnsp_DnssrvRpcRecord *recs;
+ *records = NULL;
+ *rec_count = 0;
+
ret = dsdb_search_one(dns->samdb, mem_ctx, &msg, dn,
LDB_SCOPE_BASE, attrs, 0, "%s", "(objectClass=dnsNode)");
+ if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+ return WERR_DNS_ERROR_NAME_DOES_NOT_EXIST;
+ }
if (ret != LDB_SUCCESS) {
/* TODO: we need to check if there's a glue record we need to
* create a referral to */
@@ -204,8 +210,6 @@ WERROR dns_lookup_records(struct dns_server *dns,
el = ldb_msg_find_element(msg, attrs[0]);
if (el == NULL) {
- *records = NULL;
- *rec_count = 0;
return DNS_ERR(NAME_ERROR);
}
@@ -278,13 +282,8 @@ WERROR dns_replace_records(struct dns_server *dns,
if (needs_add) {
return WERR_OK;
}
- /* No entries left, delete the dnsNode object */
- ret = ldb_delete(dns->samdb, msg->dn);
- if (ret != LDB_SUCCESS) {
- DEBUG(0, ("Deleting record failed; %d\n", ret));
- return DNS_ERR(SERVER_FAILURE);
- }
- return WERR_OK;
+ /* TODO: Delete object? */
+ el->flags = LDB_FLAG_MOD_DELETE;
}
if (needs_add) {