From: Greg Hazel Date: Tue, 29 May 2012 19:39:12 +0000 (-0700) Subject: check for arc4random_buf at runtime, on OS X X-Git-Tag: release-2.0.20-stable~26 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bff5f9407341030c77a29fc1c398083ccdb4e277;p=libevent check for arc4random_buf at runtime, on OS X (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.) --- diff --git a/evutil_rand.c b/evutil_rand.c index 3cc163d3..e2bf605f 100644 --- a/evutil_rand.c +++ b/evutil_rand.c @@ -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) {