Commit 913cebc8 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

rand/rand_unix.c: bypass DSO_global_lookup on ELF systems.



If built with no-dso, syscall_random remains "blind" to getentropy.
Since it's possible to detect symbol availability on ELF-based systems
without involving DSO module, bypass it.

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
Reviewed-by: default avatarKurt Roeckx <kurt@roeckx.be>
(Merged from https://github.com/openssl/openssl/pull/6436)
parent 46ceca3c
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -229,17 +229,9 @@ static size_t sysctl_random(char *buf, size_t buflen)
 */
int syscall_random(void *buf, size_t buflen)
{
    union {
        void *p;
        int (*f)(void *buffer, size_t length);
    } p_getentropy;

    /*
     * Do runtime detection to find getentropy().
     *
     * We could cache the result of the lookup, but we normally don't
     * call this function often.
     *
     * Known OSs that should support this:
     * - Darwin since 16 (OSX 10.12, IOS 10.0).
     * - Solaris since 11.3
@@ -247,11 +239,27 @@ int syscall_random(void *buf, size_t buflen)
     * - Linux since 3.17 with glibc 2.25
     * - FreeBSD since 12.0 (1200061)
     */
#  if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
    extern int getentropy(void *bufer, size_t length) __attribute__((weak));

    if (getentropy != NULL)
        return getentropy(buf, buflen) == 0 ? buflen : 0;
#  else
    union {
        void *p;
        int (*f)(void *buffer, size_t length);
    } p_getentropy;

    /*
     * We could cache the result of the lookup, but we normally don't
     * call this function often.
     */
    ERR_set_mark();
    p_getentropy.p = DSO_global_lookup("getentropy");
    ERR_pop_to_mark();
    if (p_getentropy.p != NULL)
        return p_getentropy.f(buf, buflen) == 0 ? buflen : 0;
#  endif

    /* Linux supports this since version 3.17 */
#  if defined(__linux) && defined(SYS_getrandom)