]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
use the zone file's basename as origin in dnssec tools
authorEvan Hunt <each@isc.org>
Wed, 10 Dec 2025 00:52:44 +0000 (16:52 -0800)
committerEvan Hunt <each@isc.org>
Wed, 1 Apr 2026 19:29:33 +0000 (12:29 -0700)
In dnssec-signzone and dnssec-verify, if the zone origin is not
specified using the `-o` parameter, the default behavior is to try
to use the zone's file name as the origin. So, for example,
`dnssec-signzone -S example.com` or 'dnssec-verify example.com'
will work, so long as the file name matches the zone name.

This now also works if the zone is in a different directory.
For example, `dnssec-signzone -S zones/example.com` or
'dnssec-verify zones/example.com' will set the origin value
to `example.com`.

bin/dnssec/dnssec-signzone.c
bin/dnssec/dnssec-verify.c

index bd54700c0ef7ad2c00405ba79b79345f717a9565..f16fcbf636ba877e62e2ffd71487e7f4576cc842 100644 (file)
@@ -2451,7 +2451,8 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
  * Load the zone file from disk
  */
 static void
-loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
+loadzone(char *file, const char *origin, dns_rdataclass_t rdclass,
+        dns_db_t **db) {
        isc_buffer_t b;
        int len;
        dns_fixedname_t fname;
@@ -2459,7 +2460,7 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
        isc_result_t result;
 
        len = strlen(origin);
-       isc_buffer_init(&b, origin, len);
+       isc_buffer_constinit(&b, origin, len);
        isc_buffer_add(&b, len);
 
        name = dns_fixedname_initname(&fname);
@@ -3212,7 +3213,8 @@ main(int argc, char *argv[]) {
        int ch;
        char *startstr = NULL, *endstr = NULL, *classname = NULL;
        char *dnskey_endstr = NULL;
-       char *origin = NULL, *file = NULL, *output = NULL;
+       const char *origin = NULL;
+       char *file = NULL, *output = NULL;
        char *inputformatstr = NULL, *outputformatstr = NULL;
        char *serialformatstr = NULL;
        char *dskeyfile[MAXDSKEYS];
@@ -3612,7 +3614,7 @@ main(int argc, char *argv[]) {
        argv += 1;
 
        if (origin == NULL) {
-               origin = file;
+               origin = isc_file_basename(file);
        }
 
        if (output == NULL) {
index c4950da38911ae7772443ac97e37a4cbdc474696..0aea7802b2597e860e233dbd3b46853892ac8595 100644 (file)
@@ -20,6 +20,7 @@
 #include <isc/attributes.h>
 #include <isc/base32.h>
 #include <isc/commandline.h>
+#include <isc/file.h>
 #include <isc/hash.h>
 #include <isc/hex.h>
 #include <isc/lib.h>
@@ -89,7 +90,8 @@ report(const char *format, ...) {
  * Load the zone file from disk
  */
 static void
-loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
+loadzone(char *file, const char *origin, bool origin_is_file,
+        dns_rdataclass_t rdclass, dns_db_t **db) {
        isc_buffer_t b;
        int len;
        dns_fixedname_t fname;
@@ -97,7 +99,7 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
        isc_result_t result;
 
        len = strlen(origin);
-       isc_buffer_init(&b, origin, len);
+       isc_buffer_constinit(&b, origin, len);
        isc_buffer_add(&b, len);
 
        name = dns_fixedname_initname(&fname);
@@ -117,12 +119,7 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
        case ISC_R_SUCCESS:
                break;
        case DNS_R_NOTZONETOP:
-               /*
-                * Comparing pointers (vs. using strcmp()) is intentional: we
-                * want to check whether -o was supplied on the command line,
-                * not whether origin and file contain the same string.
-                */
-               if (origin == file) {
+               if (origin_is_file) {
                        fatal("failed loading zone '%s' from file '%s': "
                              "use -o to specify a different zone origin",
                              origin, file);
@@ -164,13 +161,15 @@ usage(int ret) {
 
 int
 main(int argc, char *argv[]) {
-       char *origin = NULL, *file = NULL;
+       const char *origin = NULL;
+       char *file = NULL;
        char *inputformatstr = NULL;
        isc_result_t result;
        char *classname = NULL;
        dns_rdataclass_t rdclass;
        char *endp;
        int ch;
+       bool origin_is_file = false;
 
        isc_commandline_init(argc, argv);
 
@@ -295,7 +294,8 @@ main(int argc, char *argv[]) {
        POST(argv);
 
        if (origin == NULL) {
-               origin = file;
+               origin = isc_file_basename(file);
+               origin_is_file = true;
        }
 
        if (inputformatstr != NULL) {
@@ -310,7 +310,7 @@ main(int argc, char *argv[]) {
 
        gdb = NULL;
        report("Loading zone '%s' from file '%s'\n", origin, file);
-       loadzone(file, origin, rdclass, &gdb);
+       loadzone(file, origin, origin_is_file, rdclass, &gdb);
        if (journal != NULL) {
                loadjournal(isc_g_mctx, gdb, journal);
        }