]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2633. [bug] Handle 15 bit rand() functions. [RT #19783]
authorMark Andrews <marka@isc.org>
Thu, 16 Jul 2009 06:01:32 +0000 (06:01 +0000)
committerMark Andrews <marka@isc.org>
Thu, 16 Jul 2009 06:01:32 +0000 (06:01 +0000)
CHANGES
lib/isc/random.c

diff --git a/CHANGES b/CHANGES
index 39cb6d6b0cbf39e51092ba4cb64c65593fa31620..0335b120494d0abb40e9e15a52df19c3ebc36e9b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2633.  [bug]           Handle 15 bit rand() functions. [RT #19783]
+
 2632.  [func]          util/kit.sh: warn if documentation appears to be out of
                        date.  [RT #19922]
 
index f6c7d6e1266eac352e9c0cd0b37765c52dcf7da8..7679344c025e8e902b7ab6d83ef450111c36dd75 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: random.c,v 1.21.18.2 2005/04/29 00:16:48 marka Exp $ */
+/* $Id: random.c,v 1.21.18.3 2009/07/16 06:01:32 marka Exp $ */
 
 /*! \file */
 
@@ -84,7 +84,16 @@ isc_random_get(isc_uint32_t *val)
         * rand()'s lower bits are not random.
         * rand()'s upper bit is zero.
         */
+#if RAND_MAX >= 0xfffff
+       /* We have at least 20 bits.  Use lower 16 excluding lower most 4 */
        *val = ((rand() >> 4) & 0xffff) | ((rand() << 12) & 0xffff0000);
+#elif RAND_MAX >= 0x7fff
+       /* We have at least 15 bits.  Use lower 10/11 excluding lower most 4 */
+       *val = ((rand() >> 4) & 0x000007ff) | ((rand() << 7) & 0x003ff800) |
+               ((rand() << 18) & 0xffc00000);
+#else
+#error RAND_MAX is too small
+#endif
 #else
        *val = arc4random();
 #endif
@@ -92,13 +101,13 @@ isc_random_get(isc_uint32_t *val)
 
 isc_uint32_t
 isc_random_jitter(isc_uint32_t max, isc_uint32_t jitter) {
+       isc_uint32_t rnd;
+
        REQUIRE(jitter < max);
+
        if (jitter == 0)
                return (max);
-       else
-#ifndef HAVE_ARC4RANDOM
-               return (max - rand() % jitter);
-#else
-               return (max - arc4random() % jitter);
-#endif
+
+       isc_random_get(&rnd);
+       return (max - rnd % jitter);
 }