]> 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 19:48:20 +0000 (19:48 +0000)
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.

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

index 3a98a32f5b2410888bd524b3640ae5a30b23bd46..220ee223dba548dfea6d10484056db133eebb8b7 100644 (file)
@@ -255,10 +255,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);
 
@@ -292,19 +291,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 1fa0d458090dec3bd4351a42df4bd57393d547de..1721e31b71494420675a5f1d6fd9efd8ea78c87c 100644 (file)
@@ -46,6 +46,11 @@ dlz "example three" {
        database "dlopen ../driver/.libs/dlzexternal.so example.org";
 };
 
+dlz "example four" {
+       // Long zone name to trigger ISC_R_NOSPACE in dns_sdlz_putrr.
+        database "dlopen ../driver/.libs/dlzexternal.so 123456789.123456789.123456789.123456789.123456789.example.foo";
+};
+
 dlz "unsearched1" {
        database "dlopen ../driver/.libs/dlzexternal.so other.nil";
        search no;