]> granicus.if.org Git - libevent/commitdiff
check for arc4random_buf at runtime, on OS X
authorGreg Hazel <ghazel@gmail.com>
Tue, 29 May 2012 19:39:12 +0000 (12:39 -0700)
committerNick Mathewson <nickm@torproject.org>
Thu, 31 May 2012 04:48:24 +0000 (00:48 -0400)
(Tweaked by nickm: Fix up the arcr4andom_buf OSX hack so that the
fallback case isn't compiled into the code when we have
arc4random_buf() and we are not on OSX.  Also add a comment
explaining what's up.)

evutil_rand.c

index 3cc163d30e62a0bd86021a3b2e6c7df15aa54a2d..e2bf605f3d6d4902d6fb4d39ea140f2d7412f166 100644 (file)
@@ -58,10 +58,22 @@ evutil_secure_rng_global_setup_locks_(const int enable_locks)
 static void
 ev_arc4random_buf(void *buf, size_t n)
 {
-#ifdef _EVENT_HAVE_ARC4RANDOM_BUF
+       unsigned char *b = buf;
+#if defined(_EVENT_HAVE_ARC4RANDOM_BUF) && !defined(__APPLE__)
        return arc4random_buf(buf, n);
 #else
-       unsigned char *b = buf;
+
+#if defined(_EVENT_HAVE_ARC4RANDOM_BUF)
+       /* OSX 10.7 introducd arc4random_buf, so if you build your program
+        * there, you'll get surprised when older versions of OSX fail to run.
+        * To solve this, we can check whether the function pointer is set,
+        * and fall back otherwise.  (OSX does this using some linker
+        * trickery.)
+        */
+       if (arc4random_buf) {
+               return arc4random_buf(buf, n);
+       }
+#endif
        /* Make sure that we start out with b at a 4-byte alignment; plenty
         * of CPUs care about this for 32-bit access. */
        if (n >= 4 && ((ev_uintptr_t)b) & 3) {