From: Douglas Bagnall Date: Sun, 11 Apr 2021 11:39:24 +0000 (+1200) Subject: dns scavenging: ensure tombstoned node has one record X-Git-Tag: tevent-0.11.0~288 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3dd5ae46c91cc00db4809db9b2fadae4281a1feb;p=thirdparty%2Fsamba.git dns scavenging: ensure tombstoned node has one record Signed-off-by: Douglas Bagnall Reviewed-by: Andrew Bartlett --- diff --git a/source4/dsdb/kcc/scavenge_dns_records.c b/source4/dsdb/kcc/scavenge_dns_records.c index 6865cedd187..57078695cf9 100644 --- a/source4/dsdb/kcc/scavenge_dns_records.c +++ b/source4/dsdb/kcc/scavenge_dns_records.c @@ -449,7 +449,29 @@ NTSTATUS dns_delete_tombstones(TALLOC_CTX *mem_ctx, } for (i = 0; i < res->count; i++) { - el = ldb_msg_find_element(res->msgs[i], "dnsRecord"); + struct ldb_message *msg = res->msgs[i]; + el = ldb_msg_find_element(msg, "dnsRecord"); + if (el == NULL) { + DBG_ERR("The tombstoned dns node %s has no dns " + "records, which should not happen.\n", + ldb_dn_get_linearized(msg->dn) + ); + continue; + } + /* + * Below we assume the element has one value, which we + * expect because when we tombstone a node we remove + * all the records except for the tombstone. + */ + if (el->num_values != 1) { + DBG_ERR("The tombstoned dns node %s has %u " + "dns records, expected one.\n", + ldb_dn_get_linearized(msg->dn), + el->num_values + ); + continue; + } + ndr_err = ndr_pull_struct_blob( el->values, tmp_ctx, @@ -491,7 +513,7 @@ NTSTATUS dns_delete_tombstones(TALLOC_CTX *mem_ctx, continue; } - ret = dsdb_delete(samdb, res->msgs[i]->dn, 0); + ret = dsdb_delete(samdb, msg->dn, 0); if (ret != LDB_ERR_NO_SUCH_OBJECT && ret != LDB_SUCCESS) { TALLOC_FREE(tmp_ctx);