]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Revert "Move random number re-seeding out of the hot path"
authorTony Finch <fanf@isc.org>
Mon, 25 Apr 2022 14:18:58 +0000 (15:18 +0100)
committerTony Finch <fanf@isc.org>
Mon, 25 Apr 2022 14:18:58 +0000 (15:18 +0100)
This reverts commit b1bb41603e76a86ec73419418d1e2db52e864058.

lib/isc/Makefile.am
lib/isc/lib.c
lib/isc/random.c
lib/isc/random_p.h [deleted file]
lib/isc/tests/random_test.c
lib/isc/trampoline.c

index 94f0a74d3f6d7215fdedbfda23e52d4178ba7b08..c0bb69fa4ab3d33c33cc1c99a4192656146409a4 100644 (file)
@@ -170,7 +170,6 @@ libisc_la_SOURCES =         \
        quota.c                 \
        radix.c                 \
        random.c                \
-       random_p.h              \
        ratelimiter.c           \
        regex.c                 \
        region.c                \
index 4d52c5bc2fcb7941006e5e7f400e9a5cc321bbca..7f6b12c4aa08235c8e726cefc439f114e0e0f24b 100644 (file)
@@ -22,7 +22,6 @@
 #include "config.h"
 #include "mem_p.h"
 #include "os_p.h"
-#include "random_p.h"
 #include "tls_p.h"
 #include "trampoline_p.h"
 
@@ -43,7 +42,6 @@ void
 isc__initialize(void) {
        isc__os_initialize();
        isc__mem_initialize();
-       isc__random_initialize();
        isc__tls_initialize();
        isc__trampoline_initialize();
        (void)isc_os_ncpus();
index 8f804360dbd953846317b1d5ed8aa3403b83cb1b..842f4e4fe3f9b0e3be394eedefde735c7b8bfa4d 100644 (file)
@@ -35,6 +35,7 @@
 #include <string.h>
 #include <unistd.h>
 
+#include <isc/once.h>
 #include <isc/random.h>
 #include <isc/result.h>
 #include <isc/thread.h>
@@ -42,7 +43,6 @@
 #include <isc/util.h>
 
 #include "entropy_private.h"
-#include "random_p.h"
 
 /*
  * Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org)
@@ -88,8 +88,11 @@ next(void) {
 
        return (result_starstar);
 }
-void
-isc__random_initialize(void) {
+
+static thread_local isc_once_t isc_random_once = ISC_ONCE_INIT;
+
+static void
+isc_random_initialize(void) {
        int useed[4] = { 0, 0, 0, 1 };
 #if FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
        /*
@@ -105,16 +108,22 @@ isc__random_initialize(void) {
 
 uint8_t
 isc_random8(void) {
+       RUNTIME_CHECK(isc_once_do(&isc_random_once, isc_random_initialize) ==
+                     ISC_R_SUCCESS);
        return ((uint8_t)next());
 }
 
 uint16_t
 isc_random16(void) {
+       RUNTIME_CHECK(isc_once_do(&isc_random_once, isc_random_initialize) ==
+                     ISC_R_SUCCESS);
        return ((uint16_t)next());
 }
 
 uint32_t
 isc_random32(void) {
+       RUNTIME_CHECK(isc_once_do(&isc_random_once, isc_random_initialize) ==
+                     ISC_R_SUCCESS);
        return (next());
 }
 
@@ -126,6 +135,9 @@ isc_random_buf(void *buf, size_t buflen) {
        REQUIRE(buf != NULL);
        REQUIRE(buflen > 0);
 
+       RUNTIME_CHECK(isc_once_do(&isc_random_once, isc_random_initialize) ==
+                     ISC_R_SUCCESS);
+
        for (i = 0; i + sizeof(r) <= buflen; i += sizeof(r)) {
                r = next();
                memmove((uint8_t *)buf + i, &r, sizeof(r));
@@ -137,6 +149,8 @@ isc_random_buf(void *buf, size_t buflen) {
 
 uint32_t
 isc_random_uniform(uint32_t limit) {
+       RUNTIME_CHECK(isc_once_do(&isc_random_once, isc_random_initialize) ==
+                     ISC_R_SUCCESS);
        /*
         * Daniel Lemire's nearly-divisionless unbiased bounded random numbers.
         *
diff --git a/lib/isc/random_p.h b/lib/isc/random_p.h
deleted file mode 100644 (file)
index 3e4917f..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * SPDX-License-Identifier: MPL-2.0
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, you can obtain one at https://mozilla.org/MPL/2.0/.
- *
- * See the COPYRIGHT file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-#pragma once
-
-#include <isc/lang.h>
-
-/*! \file isc/random_p.h
- * \brief For automatically seeding and re-seeding when required.
- */
-
-ISC_LANG_BEGINDECLS
-
-void
-isc__random_initialize(void);
-/*!<
- * \brief Seed the thread-local random number state with fresh entropy.
- */
-
-ISC_LANG_ENDDECLS
index 3d8cfdb260e38d261bbe2305627a35e392e77103..040e1a5f7735bd0f5f8f0b2f048e6dd3a620124b 100644 (file)
@@ -87,11 +87,6 @@ _setup(void **state) {
        result = isc_test_begin(NULL, true, 0);
        assert_int_equal(result, ISC_R_SUCCESS);
 
-       /*
-        * Ensure the RNG has been seeded.
-        */
-       assert_int_not_equal(isc_random32(), 0);
-
        return (0);
 }
 
index a718e097e2a41de999fdcc471b38c4cecdb0e498..fe01394b9e3c2c629f445af54e4b473a563e7f7c 100644 (file)
@@ -22,7 +22,6 @@
 #include <isc/thread.h>
 #include <isc/util.h>
 
-#include "random_p.h"
 #include "trampoline_p.h"
 
 #define ISC__TRAMPOLINE_UNUSED 0
@@ -186,11 +185,6 @@ isc__trampoline_attach(isc__trampoline_t *trampoline) {
         * malloc() + free() calls altogether, as it would foil the fix.
         */
        trampoline->jemalloc_enforce_init = malloc(8);
-
-       /*
-        * Re-seed the random number generator in each thread.
-        */
-       isc__random_initialize();
 }
 
 isc_threadresult_t