]> 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 (GitLab job 7135405) <each@isc.org>
Wed, 1 Apr 2026 20:48:09 +0000 (20:48 +0000)
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`.

(cherry picked from commit b8cb65db93a3daeb01f55d157580f492ded066fa)

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

index 26d98b2958cc75a4d829af6aba678e0786cefe71..d0493074d6e28e5ac1a4b88774204bd5b5faed2d 100644 (file)
@@ -2575,7 +2575,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;
@@ -2583,7 +2584,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);
@@ -3377,7 +3378,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];
@@ -3806,7 +3808,7 @@ main(int argc, char *argv[]) {
        argv += 1;
 
        if (origin == NULL) {
-               origin = file;
+               origin = isc_file_basename(file);
        }
 
        if (output == NULL) {
index 27c17e905df943d0b718fe87ca5ee7cc57d3913c..01d86edf8d79afa5dfa3db2227cbf698fd08763f 100644 (file)
@@ -92,7 +92,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;
@@ -100,7 +101,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);
@@ -120,12 +121,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);
@@ -168,7 +164,8 @@ 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;
        isc_log_t *log = NULL;
@@ -177,6 +174,7 @@ main(int argc, char *argv[]) {
        dns_rdataclass_t rdclass;
        char *endp;
        int ch;
+       bool origin_is_file = false;
 
 #define CMDLINE_FLAGS "c:E:hJ:m:o:I:qv:Vxz"
 
@@ -305,7 +303,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) {
@@ -320,7 +319,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(mctx, gdb, journal);
        }