It reduces binary by ~80 bytes on x86_64 :-) --- src/config.h | 8 ++++++++ src/util.c | 25 ++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-)
diff --git src/config.h src/config.h index e722e986..b86a53f3 100644 --- src/config.h +++ src/config.h @@ -144,6 +144,9 @@ HAVE_LOOP HAVE_INOTIFY use the Linux inotify facility to efficiently re-read configuration files. +HAVE_GETENTROPY + use getentropy() call instead of RANDFILE. It is non-standard by widely available. + NO_ID Don't report *.bind CHAOS info to clients, forward such requests upstream instead. NO_TFTP @@ -187,6 +190,7 @@ RESOLVFILE #define HAVE_IPSET #define HAVE_LOOP #define HAVE_DUMPFILE +#define HAVE_GETENTROPY /* Build options which require external libraries. @@ -362,6 +366,10 @@ HAVE_SOCKADDR_SA_LEN #undef HAVE_DUMPFILE #endif +#ifdef NO_GETENTROPY +#undef HAVE_GETENTROPY +#endif + #if defined (HAVE_LINUX_NETWORK) && !defined(NO_INOTIFY) #define HAVE_INOTIFY #endif diff --git src/util.c src/util.c index c27d77c4..71b1dd57 100644 --- src/util.c +++ src/util.c @@ -34,6 +34,23 @@ #include <sys/utsname.h> #endif +#ifndef HAVE_GETENTROPY +// Non-standard libc getentropy() might use getrandom() avoiding filesystem access, that's great +// for jails and chroots. However, a fallback implemetation is required for older systems that have +// no getentropy() in libc. Also, getentropy() might block if the kernel has not initialized random +// pool yet. However, dnsmasq is never started that early during the OpenWRT boot process (at least). +#define getentropy(a, b) getentropy_fallback(a, b) +static int getentropy_fallback(void *buffer, size_t length) +{ + const int fd = open(RANDFILE, O_RDONLY); + if (fd == -1) + return -1; + const int okay = read_write(fd, buffer, length, 1); + close(fd); + return okay ? 0 : -1; +} +#endif // HAVE_GETENTROPY + /* SURF random number generator */ static u32 seed[32]; @@ -43,14 +60,8 @@ static int outleft = 0; void rand_init() { - int fd = open(RANDFILE, O_RDONLY); - - if (fd == -1 || - !read_write(fd, (unsigned char *)&seed, sizeof(seed), 1) || - !read_write(fd, (unsigned char *)&in, sizeof(in), 1)) + if (getentropy(&seed, sizeof(seed)) + getentropy(&in, sizeof(in)) < 0) die(_("failed to seed the random number generator: %s"), NULL, EC_MISC); - - close(fd); } #define ROTATE(x,b) (((x) << (b)) | ((x) >> (32 - (b)))) -- 2.34.1 _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss