X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/70221324f0971ccf4ac4017da5e34297b1e2af65..a90d420cbe87490c844ae422c966e746d3134b07:/rand/noise.c diff --git a/rand/noise.c b/rand/noise.c index f01af651..c120e6f2 100644 --- a/rand/noise.c +++ b/rand/noise.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -65,12 +66,27 @@ #define NOISE_KIDLIFE 100000 /* @noise_filter@ child lifetime */ +#if HAVE_CLOCK_GETTIME && _POSIX_TIMERS > 0 +# define TIMESTRUCT timespec +# define tv_SEC tv_sec +# define tv_FRAC tv_nsec +# define TIMERES 1000000000 +# if _POSIX_MONOTONIC_CLOCK > 0 +# define GETTIME(tv) (clock_gettime(CLOCK_MONOTONIC, (tv))) +# else +# define GETTIME(tv) (clock_gettime(CLOCK_REALTIME, (tv))) +# endif +# define TOTIMEVAL(tv, xx) \ + ((tv)->tv_sec = (xx)->tv_sec, \ + (tv)->tv_usec = ((xx)->tv_nsec + 500)/1000) +#else # define TIMESTRUCT timeval # define tv_SEC tv_sec # define tv_FRAC tv_usec # define TIMERES 1000000 # define GETTIME(tv) (gettimeofday((tv), 0)) # define TOTIMEVAL(tv, xx) (*(tv) = *(xx)) +#endif /*----- Noise source definition -------------------------------------------*/ @@ -201,7 +217,7 @@ int noise_devrandom(rand_pool *r) /* --- OpenBSD-flavoured shinies --- */ while (n < sizeof(buf)) { - nn = sizeof(buf) - nn; + nn = sizeof(buf) - n; if (nn > 256) nn = 256; if (getentropy(buf + n, nn)) break; n += nn; @@ -372,16 +388,15 @@ int noise_filter(rand_pool *r, int good, const char *c) /* --- Play games with uids --- */ if (noise_gid != NOISE_NOSETGID) { - setgid(noise_gid); - setegid(noise_gid); + if (setgid(noise_gid) || setegid(noise_gid) #ifdef HAVE_SETGROUPS - setgroups(1, &noise_gid); + || setgroups(1, &noise_gid) #endif + ) _exit(127); } if (noise_uid != NOISE_NOSETUID) { - setuid(noise_uid); - seteuid(noise_uid); + if (setuid(noise_uid) || seteuid(noise_uid)) _exit(127); } /* --- Start the process up --- */