]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Exercise ISC_R_NOSPACE path in dns_sdlz_putrr
authorMark Andrews <marka@isc.org>
Thu, 25 Nov 2021 02:16:56 +0000 (13:16 +1100)
committerMark Andrews <marka@isc.org>
Thu, 25 Nov 2021 20:47:14 +0000 (07:47 +1100)
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)

bin/tests/system/dlzexternal/driver.c
bin/tests/system/dlzexternal/ns1/dlzs.conf.in

index 26da9c5debf783f1bf11bf667969fb40de03df08..9c8ed0080f8a826b000af45fc67e9cc7c8c0425b 100644 (file)
@@ -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);
        }
 
index 07bf329b50504346ecc23b76a0d6ad574f524d94..c679498118dbbe0bd8a0c1edf722a909ffdaf4db 100644 (file)
@@ -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;