From: =?utf-8?b?T25kxZllaiBTdXLDvQ==?= <ondrej@isc.org>
Date: Tue, 28 May 2024 15:23:24 +0200
Subject: Add a test for not caching large number of RRsets

Send a recursive query for a large number of RRsets, which should
fail when using the default max-types-per-name setting of 100, but
succeed when the cap is disabled.

(cherry picked from commit 7e4530f847c8dc541c5e5bf9f790deed520aaa16)
---
 bin/tests/system/reclimit/ns1/big.db         | 256 +++++++++++++++++++++++++++
 bin/tests/system/reclimit/ns1/named.conf.in  |   1 +
 bin/tests/system/reclimit/ns3/named5.conf.in |   1 +
 bin/tests/system/reclimit/ns3/named6.conf.in |  43 +++++
 bin/tests/system/reclimit/tests.sh           |  34 ++++
 5 files changed, 335 insertions(+)
 create mode 100644 bin/tests/system/reclimit/ns3/named6.conf.in

diff --git a/bin/tests/system/reclimit/ns1/big.db b/bin/tests/system/reclimit/ns1/big.db
index bddceb7..c256594 100644
--- a/bin/tests/system/reclimit/ns1/big.db
+++ b/bin/tests/system/reclimit/ns1/big.db
@@ -2513,3 +2513,259 @@ biganswer.big.	60	IN	A	10.10.50.47
 biganswer.big.	60	IN	A	10.10.50.48
 biganswer.big.	60	IN	A	10.10.50.49
 biganswer.big.	60	IN	A	10.10.50.50
+
+manytypes.big.	IN	TYPE65280	\# 0
+manytypes.big.	IN	TYPE65281	\# 0
+manytypes.big.	IN	TYPE65282	\# 0
+manytypes.big.	IN	TYPE65283	\# 0
+manytypes.big.	IN	TYPE65284	\# 0
+manytypes.big.	IN	TYPE65285	\# 0
+manytypes.big.	IN	TYPE65286	\# 0
+manytypes.big.	IN	TYPE65287	\# 0
+manytypes.big.	IN	TYPE65288	\# 0
+manytypes.big.	IN	TYPE65289	\# 0
+manytypes.big.	IN	TYPE65290	\# 0
+manytypes.big.	IN	TYPE65291	\# 0
+manytypes.big.	IN	TYPE65292	\# 0
+manytypes.big.	IN	TYPE65293	\# 0
+manytypes.big.	IN	TYPE65294	\# 0
+manytypes.big.	IN	TYPE65295	\# 0
+manytypes.big.	IN	TYPE65296	\# 0
+manytypes.big.	IN	TYPE65297	\# 0
+manytypes.big.	IN	TYPE65298	\# 0
+manytypes.big.	IN	TYPE65299	\# 0
+manytypes.big.	IN	TYPE65300	\# 0
+manytypes.big.	IN	TYPE65301	\# 0
+manytypes.big.	IN	TYPE65302	\# 0
+manytypes.big.	IN	TYPE65303	\# 0
+manytypes.big.	IN	TYPE65304	\# 0
+manytypes.big.	IN	TYPE65305	\# 0
+manytypes.big.	IN	TYPE65306	\# 0
+manytypes.big.	IN	TYPE65307	\# 0
+manytypes.big.	IN	TYPE65308	\# 0
+manytypes.big.	IN	TYPE65309	\# 0
+manytypes.big.	IN	TYPE65310	\# 0
+manytypes.big.	IN	TYPE65311	\# 0
+manytypes.big.	IN	TYPE65312	\# 0
+manytypes.big.	IN	TYPE65313	\# 0
+manytypes.big.	IN	TYPE65314	\# 0
+manytypes.big.	IN	TYPE65315	\# 0
+manytypes.big.	IN	TYPE65316	\# 0
+manytypes.big.	IN	TYPE65317	\# 0
+manytypes.big.	IN	TYPE65318	\# 0
+manytypes.big.	IN	TYPE65319	\# 0
+manytypes.big.	IN	TYPE65320	\# 0
+manytypes.big.	IN	TYPE65321	\# 0
+manytypes.big.	IN	TYPE65322	\# 0
+manytypes.big.	IN	TYPE65323	\# 0
+manytypes.big.	IN	TYPE65324	\# 0
+manytypes.big.	IN	TYPE65325	\# 0
+manytypes.big.	IN	TYPE65326	\# 0
+manytypes.big.	IN	TYPE65327	\# 0
+manytypes.big.	IN	TYPE65328	\# 0
+manytypes.big.	IN	TYPE65329	\# 0
+manytypes.big.	IN	TYPE65330	\# 0
+manytypes.big.	IN	TYPE65331	\# 0
+manytypes.big.	IN	TYPE65332	\# 0
+manytypes.big.	IN	TYPE65333	\# 0
+manytypes.big.	IN	TYPE65334	\# 0
+manytypes.big.	IN	TYPE65335	\# 0
+manytypes.big.	IN	TYPE65336	\# 0
+manytypes.big.	IN	TYPE65337	\# 0
+manytypes.big.	IN	TYPE65338	\# 0
+manytypes.big.	IN	TYPE65339	\# 0
+manytypes.big.	IN	TYPE65340	\# 0
+manytypes.big.	IN	TYPE65341	\# 0
+manytypes.big.	IN	TYPE65342	\# 0
+manytypes.big.	IN	TYPE65343	\# 0
+manytypes.big.	IN	TYPE65344	\# 0
+manytypes.big.	IN	TYPE65345	\# 0
+manytypes.big.	IN	TYPE65346	\# 0
+manytypes.big.	IN	TYPE65347	\# 0
+manytypes.big.	IN	TYPE65348	\# 0
+manytypes.big.	IN	TYPE65349	\# 0
+manytypes.big.	IN	TYPE65350	\# 0
+manytypes.big.	IN	TYPE65351	\# 0
+manytypes.big.	IN	TYPE65352	\# 0
+manytypes.big.	IN	TYPE65353	\# 0
+manytypes.big.	IN	TYPE65354	\# 0
+manytypes.big.	IN	TYPE65355	\# 0
+manytypes.big.	IN	TYPE65356	\# 0
+manytypes.big.	IN	TYPE65357	\# 0
+manytypes.big.	IN	TYPE65358	\# 0
+manytypes.big.	IN	TYPE65359	\# 0
+manytypes.big.	IN	TYPE65360	\# 0
+manytypes.big.	IN	TYPE65361	\# 0
+manytypes.big.	IN	TYPE65362	\# 0
+manytypes.big.	IN	TYPE65363	\# 0
+manytypes.big.	IN	TYPE65364	\# 0
+manytypes.big.	IN	TYPE65365	\# 0
+manytypes.big.	IN	TYPE65366	\# 0
+manytypes.big.	IN	TYPE65367	\# 0
+manytypes.big.	IN	TYPE65368	\# 0
+manytypes.big.	IN	TYPE65369	\# 0
+manytypes.big.	IN	TYPE65370	\# 0
+manytypes.big.	IN	TYPE65371	\# 0
+manytypes.big.	IN	TYPE65372	\# 0
+manytypes.big.	IN	TYPE65373	\# 0
+manytypes.big.	IN	TYPE65374	\# 0
+manytypes.big.	IN	TYPE65375	\# 0
+manytypes.big.	IN	TYPE65376	\# 0
+manytypes.big.	IN	TYPE65377	\# 0
+manytypes.big.	IN	TYPE65378	\# 0
+manytypes.big.	IN	TYPE65379	\# 0
+manytypes.big.	IN	TYPE65380	\# 0
+manytypes.big.	IN	TYPE65381	\# 0
+manytypes.big.	IN	TYPE65382	\# 0
+manytypes.big.	IN	TYPE65383	\# 0
+manytypes.big.	IN	TYPE65384	\# 0
+manytypes.big.	IN	TYPE65385	\# 0
+manytypes.big.	IN	TYPE65386	\# 0
+manytypes.big.	IN	TYPE65387	\# 0
+manytypes.big.	IN	TYPE65388	\# 0
+manytypes.big.	IN	TYPE65389	\# 0
+manytypes.big.	IN	TYPE65390	\# 0
+manytypes.big.	IN	TYPE65391	\# 0
+manytypes.big.	IN	TYPE65392	\# 0
+manytypes.big.	IN	TYPE65393	\# 0
+manytypes.big.	IN	TYPE65394	\# 0
+manytypes.big.	IN	TYPE65395	\# 0
+manytypes.big.	IN	TYPE65396	\# 0
+manytypes.big.	IN	TYPE65397	\# 0
+manytypes.big.	IN	TYPE65398	\# 0
+manytypes.big.	IN	TYPE65399	\# 0
+manytypes.big.	IN	TYPE65400	\# 0
+manytypes.big.	IN	TYPE65401	\# 0
+manytypes.big.	IN	TYPE65402	\# 0
+manytypes.big.	IN	TYPE65403	\# 0
+manytypes.big.	IN	TYPE65404	\# 0
+manytypes.big.	IN	TYPE65405	\# 0
+manytypes.big.	IN	TYPE65406	\# 0
+manytypes.big.	IN	TYPE65407	\# 0
+manytypes.big.	IN	TYPE65408	\# 0
+manytypes.big.	IN	TYPE65409	\# 0
+manytypes.big.	IN	TYPE65410	\# 0
+manytypes.big.	IN	TYPE65411	\# 0
+manytypes.big.	IN	TYPE65412	\# 0
+manytypes.big.	IN	TYPE65413	\# 0
+manytypes.big.	IN	TYPE65414	\# 0
+manytypes.big.	IN	TYPE65415	\# 0
+manytypes.big.	IN	TYPE65416	\# 0
+manytypes.big.	IN	TYPE65417	\# 0
+manytypes.big.	IN	TYPE65418	\# 0
+manytypes.big.	IN	TYPE65419	\# 0
+manytypes.big.	IN	TYPE65420	\# 0
+manytypes.big.	IN	TYPE65421	\# 0
+manytypes.big.	IN	TYPE65422	\# 0
+manytypes.big.	IN	TYPE65423	\# 0
+manytypes.big.	IN	TYPE65424	\# 0
+manytypes.big.	IN	TYPE65425	\# 0
+manytypes.big.	IN	TYPE65426	\# 0
+manytypes.big.	IN	TYPE65427	\# 0
+manytypes.big.	IN	TYPE65428	\# 0
+manytypes.big.	IN	TYPE65429	\# 0
+manytypes.big.	IN	TYPE65430	\# 0
+manytypes.big.	IN	TYPE65431	\# 0
+manytypes.big.	IN	TYPE65432	\# 0
+manytypes.big.	IN	TYPE65433	\# 0
+manytypes.big.	IN	TYPE65434	\# 0
+manytypes.big.	IN	TYPE65435	\# 0
+manytypes.big.	IN	TYPE65436	\# 0
+manytypes.big.	IN	TYPE65437	\# 0
+manytypes.big.	IN	TYPE65438	\# 0
+manytypes.big.	IN	TYPE65439	\# 0
+manytypes.big.	IN	TYPE65440	\# 0
+manytypes.big.	IN	TYPE65441	\# 0
+manytypes.big.	IN	TYPE65442	\# 0
+manytypes.big.	IN	TYPE65443	\# 0
+manytypes.big.	IN	TYPE65444	\# 0
+manytypes.big.	IN	TYPE65445	\# 0
+manytypes.big.	IN	TYPE65446	\# 0
+manytypes.big.	IN	TYPE65447	\# 0
+manytypes.big.	IN	TYPE65448	\# 0
+manytypes.big.	IN	TYPE65449	\# 0
+manytypes.big.	IN	TYPE65450	\# 0
+manytypes.big.	IN	TYPE65451	\# 0
+manytypes.big.	IN	TYPE65452	\# 0
+manytypes.big.	IN	TYPE65453	\# 0
+manytypes.big.	IN	TYPE65454	\# 0
+manytypes.big.	IN	TYPE65455	\# 0
+manytypes.big.	IN	TYPE65456	\# 0
+manytypes.big.	IN	TYPE65457	\# 0
+manytypes.big.	IN	TYPE65458	\# 0
+manytypes.big.	IN	TYPE65459	\# 0
+manytypes.big.	IN	TYPE65460	\# 0
+manytypes.big.	IN	TYPE65461	\# 0
+manytypes.big.	IN	TYPE65462	\# 0
+manytypes.big.	IN	TYPE65463	\# 0
+manytypes.big.	IN	TYPE65464	\# 0
+manytypes.big.	IN	TYPE65465	\# 0
+manytypes.big.	IN	TYPE65466	\# 0
+manytypes.big.	IN	TYPE65467	\# 0
+manytypes.big.	IN	TYPE65468	\# 0
+manytypes.big.	IN	TYPE65469	\# 0
+manytypes.big.	IN	TYPE65470	\# 0
+manytypes.big.	IN	TYPE65471	\# 0
+manytypes.big.	IN	TYPE65472	\# 0
+manytypes.big.	IN	TYPE65473	\# 0
+manytypes.big.	IN	TYPE65474	\# 0
+manytypes.big.	IN	TYPE65475	\# 0
+manytypes.big.	IN	TYPE65476	\# 0
+manytypes.big.	IN	TYPE65477	\# 0
+manytypes.big.	IN	TYPE65478	\# 0
+manytypes.big.	IN	TYPE65479	\# 0
+manytypes.big.	IN	TYPE65480	\# 0
+manytypes.big.	IN	TYPE65481	\# 0
+manytypes.big.	IN	TYPE65482	\# 0
+manytypes.big.	IN	TYPE65483	\# 0
+manytypes.big.	IN	TYPE65484	\# 0
+manytypes.big.	IN	TYPE65485	\# 0
+manytypes.big.	IN	TYPE65486	\# 0
+manytypes.big.	IN	TYPE65487	\# 0
+manytypes.big.	IN	TYPE65488	\# 0
+manytypes.big.	IN	TYPE65489	\# 0
+manytypes.big.	IN	TYPE65490	\# 0
+manytypes.big.	IN	TYPE65491	\# 0
+manytypes.big.	IN	TYPE65492	\# 0
+manytypes.big.	IN	TYPE65493	\# 0
+manytypes.big.	IN	TYPE65494	\# 0
+manytypes.big.	IN	TYPE65495	\# 0
+manytypes.big.	IN	TYPE65496	\# 0
+manytypes.big.	IN	TYPE65497	\# 0
+manytypes.big.	IN	TYPE65498	\# 0
+manytypes.big.	IN	TYPE65499	\# 0
+manytypes.big.	IN	TYPE65500	\# 0
+manytypes.big.	IN	TYPE65501	\# 0
+manytypes.big.	IN	TYPE65502	\# 0
+manytypes.big.	IN	TYPE65503	\# 0
+manytypes.big.	IN	TYPE65504	\# 0
+manytypes.big.	IN	TYPE65505	\# 0
+manytypes.big.	IN	TYPE65506	\# 0
+manytypes.big.	IN	TYPE65507	\# 0
+manytypes.big.	IN	TYPE65508	\# 0
+manytypes.big.	IN	TYPE65509	\# 0
+manytypes.big.	IN	TYPE65510	\# 0
+manytypes.big.	IN	TYPE65511	\# 0
+manytypes.big.	IN	TYPE65512	\# 0
+manytypes.big.	IN	TYPE65513	\# 0
+manytypes.big.	IN	TYPE65514	\# 0
+manytypes.big.	IN	TYPE65515	\# 0
+manytypes.big.	IN	TYPE65516	\# 0
+manytypes.big.	IN	TYPE65517	\# 0
+manytypes.big.	IN	TYPE65518	\# 0
+manytypes.big.	IN	TYPE65519	\# 0
+manytypes.big.	IN	TYPE65520	\# 0
+manytypes.big.	IN	TYPE65521	\# 0
+manytypes.big.	IN	TYPE65522	\# 0
+manytypes.big.	IN	TYPE65523	\# 0
+manytypes.big.	IN	TYPE65524	\# 0
+manytypes.big.	IN	TYPE65525	\# 0
+manytypes.big.	IN	TYPE65526	\# 0
+manytypes.big.	IN	TYPE65527	\# 0
+manytypes.big.	IN	TYPE65528	\# 0
+manytypes.big.	IN	TYPE65529	\# 0
+manytypes.big.	IN	TYPE65530	\# 0
+manytypes.big.	IN	TYPE65531	\# 0
+manytypes.big.	IN	TYPE65532	\# 0
+manytypes.big.	IN	TYPE65533	\# 0
+manytypes.big.	IN	TYPE65534	\# 0
diff --git a/bin/tests/system/reclimit/ns1/named.conf.in b/bin/tests/system/reclimit/ns1/named.conf.in
index c56c0db..65da2e5 100644
--- a/bin/tests/system/reclimit/ns1/named.conf.in
+++ b/bin/tests/system/reclimit/ns1/named.conf.in
@@ -23,6 +23,7 @@ options {
 	recursion no;
 	dnssec-validation no;
 	max-records-per-type 0;
+	max-types-per-name 0;
 };
 
 zone "." { type primary; file "root.db"; };
diff --git a/bin/tests/system/reclimit/ns3/named5.conf.in b/bin/tests/system/reclimit/ns3/named5.conf.in
index 56f704a..7cf0633 100644
--- a/bin/tests/system/reclimit/ns3/named5.conf.in
+++ b/bin/tests/system/reclimit/ns3/named5.conf.in
@@ -26,6 +26,7 @@ options {
 	recursion yes;
 	dnssec-validation yes;
 	max-records-per-type 0;
+	max-types-per-name 10;
 };
 
 trust-anchors { };
diff --git a/bin/tests/system/reclimit/ns3/named6.conf.in b/bin/tests/system/reclimit/ns3/named6.conf.in
new file mode 100644
index 0000000..e1607e2
--- /dev/null
+++ b/bin/tests/system/reclimit/ns3/named6.conf.in
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * SPDX-License-Identifier: MPL-2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, you can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+options {
+	directory ".";
+	query-source address 10.53.0.3;
+	notify-source 10.53.0.3;
+	transfer-source 10.53.0.3;
+	port @PORT@;
+	pid-file "named.pid";
+	listen-on { 10.53.0.3; };
+	listen-on-v6 { none; };
+	servfail-ttl 0;
+	qname-minimization disabled;
+	max-recursion-depth 12;
+	recursion yes;
+	dnssec-validation yes;
+	max-records-per-type 0;
+	max-types-per-name 0;
+};
+
+trust-anchors { };
+
+key rndc_key {
+	secret "1234abcd8765";
+	algorithm @DEFAULT_HMAC@;
+};
+
+controls {
+	inet 10.53.0.3 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
+};
+
+zone "." { type hint; file "hints.db"; };
diff --git a/bin/tests/system/reclimit/tests.sh b/bin/tests/system/reclimit/tests.sh
index b332e38..a13821a 100644
--- a/bin/tests/system/reclimit/tests.sh
+++ b/bin/tests/system/reclimit/tests.sh
@@ -232,5 +232,39 @@ grep 'status: NOERROR' dig.out.2.test$n >/dev/null || ret=1
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=$((status + ret))
 
+check_manytypes() (
+  i=$1
+  type=$2
+  expected=$3
+
+  $DIG $DIGOPTS @10.53.0.3 IN $type manytypes.big >dig.out.$i.$type.test$n || exit 1
+  grep 'status: '"${expected}"'' dig.out.$i.$type.test$n >/dev/null || exit 1
+
+  exit 0
+)
+
+n=$((n + 1))
+echo_i "checking name that exceeds max-types-per-name ($n)"
+ret=0
+
+# Limited to 10 types - these should be fine
+for ntype in $(seq 65280 65289); do
+  check_manytypes 1 "TYPE${ntype}" NOERROR || ret=1
+done
+# Everything on top of that should SERVFAIL
+for ntype in $(seq 65290 65534); do
+  check_manytypes 1 "TYPE${ntype}" SERVFAIL || ret=1
+done
+
+# Lift the limit
+ns3_reset ns3/named6.conf.in
+
+for ntype in $(seq 65280 65534); do
+  check_manytypes 2 "TYPE${ntype}" NOERROR || ret=1
+done
+
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=$((status + ret))
+
 echo_i "exit status: $status"
 [ $status -eq 0 ] || exit 1
