bind/backport-0001-Exercise-ISC_R_NOSPACE-path-in-dns_sdlz_putrr.patch
2023-01-09 16:44:23 +08:00

83 lines
2.7 KiB
Diff

From bf1eaf46611bdbfcc2a6f6f77871eebf8351a629 Mon Sep 17 00:00:00 2001
From: Mark Andrews <marka@isc.org>
Date: Thu, 25 Nov 2021 13:16:56 +1100
Subject: [PATCH] Exercise ISC_R_NOSPACE path in dns_sdlz_putrr
Use relative names when adding SOA record and a long domain
name to create SOA RR where the wire format is longer than
the initial buffer allocation in dns_sdlz_putrr.
(cherry picked from commit 6dc524860622277bd24fe17d4a82454b30f5f1b5)
Conflict: NA
Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/bf1eaf46611bdbfcc2a6f6f77871eebf8351a629
---
bin/tests/system/dlzexternal/driver.c | 23 +++++++++----------
bin/tests/system/dlzexternal/ns1/dlzs.conf.in | 5 ++++
2 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/bin/tests/system/dlzexternal/driver.c b/bin/tests/system/dlzexternal/driver.c
index 26da9c5deb..9c8ed0080f 100644
--- a/bin/tests/system/dlzexternal/driver.c
+++ b/bin/tests/system/dlzexternal/driver.c
@@ -238,10 +238,9 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], void **dbdata,
struct dlz_example_data *state;
const char *helper_name;
va_list ap;
- char soa_data[1024];
- const char *extra;
+ char soa_data[sizeof("@ hostmaster.root 123 900 600 86400 3600")];
isc_result_t result;
- int n;
+ size_t n;
UNUSED(dlzname);
@@ -275,19 +274,19 @@ dlz_create(const char *dlzname, unsigned int argc, char *argv[], void **dbdata,
sprintf(state->zone_name, "%s.", argv[1]);
}
+ /*
+ * Use relative names to trigger ISC_R_NOSPACE in dns_sdlz_putrr.
+ */
if (strcmp(state->zone_name, ".") == 0) {
- extra = ".root";
+ n = strlcpy(soa_data,
+ "@ hostmaster.root 123 900 600 86400 3600",
+ sizeof(soa_data));
} else {
- extra = ".";
+ n = strlcpy(soa_data, "@ hostmaster 123 900 600 86400 3600",
+ sizeof(soa_data));
}
- n = sprintf(soa_data, "%s hostmaster%s%s 123 900 600 86400 3600",
- state->zone_name, extra, state->zone_name);
-
- if (n < 0) {
- CHECK(ISC_R_FAILURE);
- }
- if ((unsigned)n >= sizeof(soa_data)) {
+ if (n >= sizeof(soa_data)) {
CHECK(ISC_R_NOSPACE);
}
diff --git a/bin/tests/system/dlzexternal/ns1/dlzs.conf.in b/bin/tests/system/dlzexternal/ns1/dlzs.conf.in
index 07bf329b50..c679498118 100644
--- a/bin/tests/system/dlzexternal/ns1/dlzs.conf.in
+++ b/bin/tests/system/dlzexternal/ns1/dlzs.conf.in
@@ -21,6 +21,11 @@ dlz "example three" {
database "dlopen ../driver.@SO@ example.org";
};
+dlz "example four" {
+ // Long zone name to trigger ISC_R_NOSPACE in dns_sdlz_putrr.
+ database "dlopen ../driver.@SO@ 123456789.123456789.123456789.123456789.123456789.example.foo";
+};
+
dlz "unsearched1" {
database "dlopen ../driver.@SO@ other.nil";
search no;
--
2.23.0