From: Guillem Jover Date: Mon, 14 May 2018 22:41:26 +0000 (+0200) Subject: Update arc4random() headers from OpenBSD X-Git-Tag: 0.9.0~13 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=3d88c999b4a0ac2820c84732262ba7a0ad44e421;p=thirdparty%2Flibbsd.git Update arc4random() headers from OpenBSD Split Linux support into its own header separate from the generic Unix to fix a Linux-specific issue with clone(). Reset rsp to NULL on failure. --- diff --git a/COPYING b/COPYING index 021e67e..b768093 100644 --- a/COPYING +++ b/COPYING @@ -429,6 +429,7 @@ Files: man/strlcpy.3bsd man/strtonum.3bsd src/arc4random.c + src/arc4random_linux.h src/arc4random_openbsd.h src/arc4random_uniform.c src/arc4random_unix.h diff --git a/src/Makefile.am b/src/Makefile.am index ad83dbf..d72802e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -60,9 +60,10 @@ libbsd_la_LDFLAGS = \ libbsd_la_SOURCES = \ arc4random.c \ arc4random.h \ - arc4random_unix.h \ + arc4random_linux.h \ arc4random_openbsd.h \ arc4random_uniform.c \ + arc4random_unix.h \ bsd_getopt.c \ chacha_private.h \ closefrom.c \ diff --git a/src/arc4random.h b/src/arc4random.h index 073f90e..803ef86 100644 --- a/src/arc4random.h +++ b/src/arc4random.h @@ -34,6 +34,8 @@ getentropy(void *buf, size_t len); #if defined(__OpenBSD__) #include "arc4random_openbsd.h" +#elif defined(__linux__) +#include "arc4random_linux.h" #else #include "arc4random_unix.h" #endif diff --git a/src/arc4random_linux.h b/src/arc4random_linux.h new file mode 100644 index 0000000..7a2ca1e --- /dev/null +++ b/src/arc4random_linux.h @@ -0,0 +1,88 @@ +/* $OpenBSD: arc4random_linux.h,v 1.11 2016/06/30 12:19:51 bcook Exp $ */ + +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Stub functions for portability. + */ + +#include + +#include +#include + +static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; +#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx) +#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx) + +#ifdef __GLIBC__ +extern void *__dso_handle; +extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *); +#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle) +#else +#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) +#endif + +static inline void +_getentropy_fail(void) +{ + raise(SIGKILL); +} + +static volatile sig_atomic_t _rs_forked; + +static inline void +_rs_forkhandler(void) +{ + _rs_forked = 1; +} + +static inline void +_rs_forkdetect(void) +{ + static pid_t _rs_pid = 0; + pid_t pid = getpid(); + + /* XXX unusual calls to clone() can bypass checks */ + if (_rs_pid == 0 || _rs_pid == 1 || _rs_pid != pid || _rs_forked) { + _rs_pid = pid; + _rs_forked = 0; + if (rs) + memset(rs, 0, sizeof(*rs)); + } +} + +static inline int +_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) +{ + if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) + return (-1); + + if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { + munmap(*rsp, sizeof(**rsp)); + *rsp = NULL; + return (-1); + } + + _ARC4_ATFORK(_rs_forkhandler); + return (0); +} diff --git a/src/arc4random_unix.h b/src/arc4random_unix.h index 73b0cd5..0e37683 100644 --- a/src/arc4random_unix.h +++ b/src/arc4random_unix.h @@ -1,4 +1,4 @@ -/* $OpenBSD: arc4random_linux.h,v 1.8 2014/08/13 06:04:10 deraadt Exp $ */ +/* $OpenBSD: arc4random_freebsd.h,v 1.4 2016/06/30 12:19:51 bcook Exp $ */ /* * Copyright (c) 1996, David Mazieres @@ -84,6 +84,7 @@ _rs_allocate(struct _rs **rsp, struct _rsx **rsxp) if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { munmap(*rsp, sizeof(**rsp)); + *rsp = NULL; return (-1); }