#include <dns/clientinfo.h>
#include <dns/db.h>
#include <dns/master.h>
+#include <dns/rdata.h>
+#include <dns/rdataclass.h>
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
(db->methods->setmaxtypepername)(db, value);
}
}
+
+void
+dns__db_logtoomanyrecords(dns_db_t *db, const dns_name_t *name,
+ dns_rdatatype_t type, const char *op,
+ uint32_t limit) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char originbuf[DNS_NAME_FORMATSIZE];
+ char typebuf[DNS_RDATATYPE_FORMATSIZE];
+ char clsbuf[DNS_RDATACLASS_FORMATSIZE];
+
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ dns_name_format(&db->origin, originbuf, sizeof(originbuf));
+ dns_rdatatype_format(type, typebuf, sizeof(typebuf));
+ dns_rdataclass_format(db->rdclass, clsbuf, sizeof(clsbuf));
+
+ isc_log_write(
+ DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_RBTDB, ISC_LOG_ERROR,
+ "error %s '%s/%s' in '%s/%s' (%s): %s (must not exceed %u)", op,
+ namebuf, typebuf, originbuf, clsbuf,
+ (db->attributes & DNS_DBATTR_CACHE) != 0 ? "cache" : "zone",
+ isc_result_totext(DNS_R_TOOMANYRECORDS), limit);
+}
return false;
}
+void
+dns__db_logtoomanyrecords(dns_db_t *db, const dns_name_t *name,
+ dns_rdatatype_t type, const char *op, uint32_t limit);
+/*
+ * Emit a log message when adding an rdataset of name/type would exceed the
+ * 'maxrrperset' limit. 'op' is 'adding' or 'updating' depending on whether
+ * the addition is to create a new rdataset or to merge to an existing one.
+ */
+
ISC_LANG_ENDDECLS
®ion, sizeof(dns_slabheader_t),
qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
+ if (result == DNS_R_TOOMANYRECORDS) {
+ dns__db_logtoomanyrecords((dns_db_t *)qpdb,
+ &qpnode->name, rdataset->type,
+ "adding", qpdb->maxrrperset);
+ }
return result;
}
header->resign_lsb;
}
} else {
+ if (result == DNS_R_TOOMANYRECORDS) {
+ dns__db_logtoomanyrecords(
+ (dns_db_t *)qpdb, nodename,
+ (dns_rdatatype_t)header->type,
+ "updating", qpdb->maxrrperset);
+ }
dns_slabheader_destroy(&newheader);
return result;
}
®ion, sizeof(dns_slabheader_t),
qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
+ if (result == DNS_R_TOOMANYRECORDS) {
+ dns__db_logtoomanyrecords((dns_db_t *)qpdb, name,
+ rdataset->type, "adding",
+ qpdb->maxrrperset);
+ }
return result;
}
®ion, sizeof(dns_slabheader_t),
qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
+ if (result == DNS_R_TOOMANYRECORDS) {
+ dns__db_logtoomanyrecords((dns_db_t *)qpdb, &node->name,
+ rdataset->type, "adding",
+ qpdb->maxrrperset);
+ }
return result;
}