Use __NR_getrandom rather than SYS_getrandom. The former is defined by the kernel and is a straightforward number. The latter is defined by glibc as: #define SYS_getrandom __NR_getrandom which does not work when kernel headers are older than glibc headers. Instead, use the kernel values. Bug: chromium:742260 Change-Id: Id162f125db660643269e0b1329633437048575c4 Reviewed-on: https://boringssl-review.googlesource.com/17864 Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/fipsmodule/rand/urandom.c b/crypto/fipsmodule/rand/urandom.c index 2ea8730..8cbf727 100644 --- a/crypto/fipsmodule/rand/urandom.c +++ b/crypto/fipsmodule/rand/urandom.c
@@ -45,33 +45,33 @@ #if defined(OPENSSL_LINUX) #if defined(OPENSSL_X86_64) -#define EXPECTED_SYS_getrandom 318 +#define EXPECTED_NR_getrandom 318 #elif defined(OPENSSL_X86) -#define EXPECTED_SYS_getrandom 355 +#define EXPECTED_NR_getrandom 355 #elif defined(OPENSSL_AARCH64) -#define EXPECTED_SYS_getrandom 278 +#define EXPECTED_NR_getrandom 278 #elif defined(OPENSSL_ARM) -#define EXPECTED_SYS_getrandom 384 +#define EXPECTED_NR_getrandom 384 #elif defined(OPENSSL_PPC64LE) -#define EXPECTED_SYS_getrandom 359 +#define EXPECTED_NR_getrandom 359 #endif -#if defined(EXPECTED_SYS_getrandom) -#define USE_SYS_getrandom +#if defined(EXPECTED_NR_getrandom) +#define USE_NR_getrandom -#if defined(SYS_getrandom) +#if defined(__NR_getrandom) -#if SYS_getrandom != EXPECTED_SYS_getrandom +#if __NR_getrandom != EXPECTED_NR_getrandom #error "system call number for getrandom is not the expected value" #endif -#else /* SYS_getrandom */ +#else /* __NR_getrandom */ -#define SYS_getrandom EXPECTED_SYS_getrandom +#define __NR_getrandom EXPECTED_NR_getrandom -#endif /* SYS_getrandom */ +#endif /* __NR_getrandom */ -#endif /* EXPECTED_SYS_getrandom */ +#endif /* EXPECTED_NR_getrandom */ #if !defined(GRND_NONBLOCK) #define GRND_NONBLOCK 1 @@ -95,7 +95,7 @@ DEFINE_STATIC_ONCE(rand_once); -#if defined(USE_SYS_getrandom) || defined(BORINGSSL_FIPS) +#if defined(USE_NR_getrandom) || defined(BORINGSSL_FIPS) /* message writes |msg| to stderr. We use this because referencing |stderr| * with |fprintf| generates relocations, which is a problem inside the FIPS * module. */ @@ -116,10 +116,10 @@ int fd = *urandom_fd_requested_bss_get(); CRYPTO_STATIC_MUTEX_unlock_read(rand_lock_bss_get()); -#if defined(USE_SYS_getrandom) +#if defined(USE_NR_getrandom) uint8_t dummy; long getrandom_ret = - syscall(SYS_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK); + syscall(__NR_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK); if (getrandom_ret == 1) { *urandom_fd_bss_get() = kHaveGetrandom; @@ -132,7 +132,7 @@ do { getrandom_ret = - syscall(SYS_getrandom, &dummy, sizeof(dummy), 0 /* no flags */); + syscall(__NR_getrandom, &dummy, sizeof(dummy), 0 /* no flags */); } while (getrandom_ret == -1 && errno == EINTR); if (getrandom_ret == 1) { @@ -140,7 +140,7 @@ return; } } -#endif /* USE_SYS_getrandom */ +#endif /* USE_NR_getrandom */ if (fd == kUnset) { do { @@ -234,7 +234,7 @@ } } -#if defined(USE_SYS_getrandom) && defined(OPENSSL_MSAN) +#if defined(USE_NR_getrandom) && defined(OPENSSL_MSAN) void __msan_unpoison(void *, size_t); #endif @@ -245,9 +245,9 @@ ssize_t r; if (*urandom_fd_bss_get() == kHaveGetrandom) { -#if defined(USE_SYS_getrandom) +#if defined(USE_NR_getrandom) do { - r = syscall(SYS_getrandom, out, len, 0 /* no flags */); + r = syscall(__NR_getrandom, out, len, 0 /* no flags */); } while (r == -1 && errno == EINTR); #if defined(OPENSSL_MSAN) @@ -258,7 +258,7 @@ } #endif /* OPENSSL_MSAN */ -#else /* USE_SYS_getrandom */ +#else /* USE_NR_getrandom */ abort(); #endif } else {