diff options
author | Ondřej Surý <ondrej@sury.org> | 2016-08-30 10:25:36 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2016-08-30 10:25:36 +0200 |
commit | 7d6202bfa85e8f0bf90590a9381757f15e296a33 (patch) | |
tree | 1949eb9256ab93dbe512a37b1e75720dbdce5e8e /src | |
parent | 6de837ba4e208260ac6043d521b0a1d79ffd58a7 (diff) | |
download | luaossl-7d6202bfa85e8f0bf90590a9381757f15e296a33.tar.gz luaossl-7d6202bfa85e8f0bf90590a9381757f15e296a33.tar.bz2 luaossl-7d6202bfa85e8f0bf90590a9381757f15e296a33.zip |
Reinstate sysctl call for older Linux kernels
Diffstat (limited to 'src')
-rw-r--r-- | src/openssl.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/openssl.c b/src/openssl.c index 6addcaa..7c28c84 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
@@ -60,6 +60,8 @@ | |||
60 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) | 60 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) |
61 | #define HAVE_GETRANDOM | 61 | #define HAVE_GETRANDOM |
62 | #include <linux/random.h> | 62 | #include <linux/random.h> |
63 | #else | ||
64 | #define HAVE_SYS_SYSCTL_H | ||
63 | #endif | 65 | #endif |
64 | #endif | 66 | #endif |
65 | 67 | ||
@@ -7824,13 +7826,20 @@ static struct randL_state *randL_getstate(lua_State *L) { | |||
7824 | return lua_touserdata(L, lua_upvalueindex(1)); | 7826 | return lua_touserdata(L, lua_upvalueindex(1)); |
7825 | } /* randL_getstate() */ | 7827 | } /* randL_getstate() */ |
7826 | 7828 | ||
7829 | #if HAVE_SYS_SYSCTL_H | ||
7830 | #include <sys/sysctl.h> /* CTL_KERN KERN_RANDOM RANDOM_UUID KERN_URND KERN_ARND sysctl(2) */ | ||
7831 | #endif | ||
7832 | |||
7833 | #ifndef HAVE_RANDOM_UUID | ||
7834 | #define HAVE_RANDOM_UUID (HAVE_SYS_SYSCTL_H && defined __linux__) /* RANDOM_UUID is an enum, not macro */ | ||
7835 | #endif | ||
7827 | 7836 | ||
7828 | static int randL_stir(struct randL_state *st, unsigned rqstd) { | 7837 | static int randL_stir(struct randL_state *st, unsigned rqstd) { |
7829 | unsigned count = 0; | 7838 | unsigned count = 0; |
7830 | int error; | 7839 | int error; |
7831 | unsigned char data[256]; | 7840 | unsigned char data[256]; |
7832 | #if HAVE_ARC4RANDOM | 7841 | #if defined(HAVE_ARC4RANDOM) |
7833 | while (count < rqst) { | 7842 | while (count < rqstd) { |
7834 | size_t n = MIN(rqstd - count, sizeof data); | 7843 | size_t n = MIN(rqstd - count, sizeof data); |
7835 | 7844 | ||
7836 | arc4random(data, n); | 7845 | arc4random(data, n); |
@@ -7839,22 +7848,34 @@ static int randL_stir(struct randL_state *st, unsigned rqstd) { | |||
7839 | 7848 | ||
7840 | count += n; | 7849 | count += n; |
7841 | } | 7850 | } |
7842 | #endif | 7851 | #elif defined(HAVE_GETRANDOM) |
7843 | 7852 | while (count < rqstd) { | |
7844 | #if HAVE_GETRANDOM | ||
7845 | while (count < rqst) { | ||
7846 | size_t n = MIN(rqstd - count, sizeof data); | 7853 | size_t n = MIN(rqstd - count, sizeof data); |
7847 | 7854 | ||
7848 | n = getrandom(data, n, 0); | 7855 | n = getrandom(data, n, 0); |
7849 | 7856 | ||
7850 | if (n == -1) { | 7857 | if (n == -1) { |
7851 | break; | 7858 | break; |
7852 | } | 7859 | } |
7853 | 7860 | ||
7854 | RAND_add(data, n, n); | 7861 | RAND_add(data, n, n); |
7862 | |||
7863 | count += n; | ||
7864 | } | ||
7865 | #elif HAVE_RANDOM_UUID | ||
7866 | int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; | ||
7867 | |||
7868 | while (count < rqstd) { | ||
7869 | size_t n = MIN(rqstd - count, sizeof data); | ||
7870 | |||
7871 | if (0 != sysctl(mib, countof(mib), data, &n, (void *)0, 0)) | ||
7872 | break; | ||
7873 | |||
7874 | RAND_add(data, n, n); | ||
7855 | 7875 | ||
7856 | count += n; | 7876 | count += n; |
7857 | } | 7877 | } |
7878 | |||
7858 | #endif | 7879 | #endif |
7859 | 7880 | ||
7860 | if (count < rqstd) { | 7881 | if (count < rqstd) { |