]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3886. [bug] rbtdb_write_header should use a once to initialize
authorMark Andrews <marka@isc.org>
Tue, 24 Jun 2014 09:58:25 +0000 (19:58 +1000)
committerMark Andrews <marka@isc.org>
Tue, 24 Jun 2014 09:59:39 +0000 (19:59 +1000)
                        FILE_VERSION. [RT #36374]

(cherry picked from commit ba5c73b383b08326ab6b5ad2d7ca43e117e212f1)

CHANGES
lib/dns/rbtdb.c

diff --git a/CHANGES b/CHANGES
index 8523ecf0b2effe74a15c84c067c9f6cf6b7f07f0..d62cc067653d80896719a6f6f43009c7b1ea6da8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3886.  [bug]           rbtdb_write_header should use a once to initialize
+                       FILE_VERSION. [RT #36374]
+
        --- 9.10.1b1 released ---
 
 3885.  [port]          Use 'open()' rather than 'file()' to open files in
index 36fd348cd6aa6f2b2073155c98e15ec4d8b17464..b9fb3f339df2005682419c36771a40821ddb8c81 100644 (file)
@@ -36,6 +36,7 @@
 #include <isc/hex.h>
 #include <isc/mem.h>
 #include <isc/mutex.h>
+#include <isc/once.h>
 #include <isc/platform.h>
 #include <isc/print.h>
 #include <isc/random.h>
@@ -7452,6 +7453,18 @@ rbtdb_zero_header(FILE *rbtfile) {
        return (result);
 }
 
+static isc_once_t once = ISC_ONCE_INIT;
+
+static void
+init_file_version(void) {
+       int n;
+
+       memset(FILE_VERSION, 0, sizeof(FILE_VERSION));
+       n = snprintf(FILE_VERSION, sizeof(FILE_VERSION),
+                "RBTDB Image %s %s", dns_major, dns_mapapi);
+       INSIST(n < sizeof(FILE_VERSION));
+}
+
 /*
  * Write the file header out, recording the locations of the three
  * RBT's used in the rbtdb: tree, nsec, and nsec3, and including NodeDump
@@ -7465,11 +7478,7 @@ rbtdb_write_header(FILE *rbtfile, off_t tree_location, off_t nsec_location,
        rbtdb_file_header_t header;
        isc_result_t result;
 
-       if (FILE_VERSION[0] == '\0') {
-               memset(FILE_VERSION, 0, sizeof(FILE_VERSION));
-               snprintf(FILE_VERSION, sizeof(FILE_VERSION),
-                        "RBTDB Image %s %s", dns_major, dns_mapapi);
-       }
+       RUNTIME_CHECK(isc_once_do(&once, init_file_version) == ISC_R_SUCCESS);
 
        memset(&header, 0, sizeof(rbtdb_file_header_t));
        memmove(header.version1, FILE_VERSION, sizeof(header.version1));