passman

dead simple password manager using state of the art encryption
git clone git://kqueue.dev/passman.git
Log | Files | Refs | README | LICENSE

arc4random_linux.h (2502B)


      1 /*	$OpenBSD: arc4random_linux.h,v 1.10 2016/01/04 02:04:56 bcook Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1996, David Mazieres <dm@uun.org>
      5  * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
      6  * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
      7  * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
      8  *
      9  * Permission to use, copy, modify, and distribute this software for any
     10  * purpose with or without fee is hereby granted, provided that the above
     11  * copyright notice and this permission notice appear in all copies.
     12  *
     13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     20  */
     21 
     22 /*
     23  * Stub functions for portability.
     24  */
     25 
     26 #include <sys/mman.h>
     27 
     28 #include <pthread.h>
     29 #include <signal.h>
     30 
     31 static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
     32 #define _ARC4_LOCK()   pthread_mutex_lock(&arc4random_mtx)
     33 #define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
     34 
     35 #ifdef __GLIBC__
     36 extern void *__dso_handle;
     37 extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
     38 #define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle)
     39 #else
     40 #define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
     41 #endif
     42 
     43 static inline void
     44 _getentropy_fail(void)
     45 {
     46 	raise(SIGKILL);
     47 }
     48 
     49 static volatile sig_atomic_t _rs_forked;
     50 
     51 static inline void
     52 _rs_forkhandler(void)
     53 {
     54 	_rs_forked = 1;
     55 }
     56 
     57 static inline void
     58 _rs_forkdetect(void)
     59 {
     60 	static pid_t _rs_pid = 0;
     61 	pid_t pid = getpid();
     62 
     63         /* XXX unusual calls to clone() can bypass checks */
     64 	if (_rs_pid == 0 || _rs_pid == 1 || _rs_pid != pid || _rs_forked) {
     65 		_rs_pid = pid;
     66 		_rs_forked = 0;
     67 		if (rs)
     68 			memset(rs, 0, sizeof(*rs));
     69 	}
     70 }
     71 
     72 static inline int
     73 _rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
     74 {
     75 	if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
     76 	    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
     77 		return (-1);
     78 
     79 	if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
     80 	    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
     81 		munmap(*rsp, sizeof(**rsp));
     82 		*rsp = NULL;
     83 		return (-1);
     84 	}
     85 
     86 	_ARC4_ATFORK(_rs_forkhandler);
     87 	return (0);
     88 }