summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libc/crypt/arc4random.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/lib/libc/crypt/arc4random.c b/src/lib/libc/crypt/arc4random.c
index a306c6d8ab..ee47b2df34 100644
--- a/src/lib/libc/crypt/arc4random.c
+++ b/src/lib/libc/crypt/arc4random.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: arc4random.c,v 1.37 2014/06/25 04:22:08 deraadt Exp $ */ 1/* $OpenBSD: arc4random.c,v 1.38 2014/06/26 19:23:15 deraadt Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1996, David Mazieres <dm@uun.org> 4 * Copyright (c) 1996, David Mazieres <dm@uun.org>
@@ -74,8 +74,10 @@ _rs_init(u_char *buf, size_t n)
74 if ((rs = mmap(NULL, sizeof(*rs), PROT_READ|PROT_WRITE, 74 if ((rs = mmap(NULL, sizeof(*rs), PROT_READ|PROT_WRITE,
75 MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) 75 MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
76 abort(); 76 abort();
77#ifdef MAP_INHERIT_ZERO
77 if (minherit(rs, sizeof(*rs), MAP_INHERIT_ZERO) == -1) 78 if (minherit(rs, sizeof(*rs), MAP_INHERIT_ZERO) == -1)
78 abort(); 79 abort();
80#endif
79 } 81 }
80 if (rsx == NULL) { 82 if (rsx == NULL) {
81 if ((rsx = mmap(NULL, sizeof(*rsx), PROT_READ|PROT_WRITE, 83 if ((rsx = mmap(NULL, sizeof(*rsx), PROT_READ|PROT_WRITE,
@@ -111,6 +113,16 @@ _rs_stir(void)
111static inline void 113static inline void
112_rs_stir_if_needed(size_t len) 114_rs_stir_if_needed(size_t len)
113{ 115{
116#ifndef MAP_INHERIT_ZERO
117 static pid_t _rs_pid = 0;
118 pid_t pid = getpid();
119
120 /* If a system lacks MAP_INHERIT_ZERO, resort to getpid() */
121 if (_rs_pid == 0 || _rs_pid != pid) {
122 _rs_pid = pid;
123 rs->rs_count = 0;
124 }
125#endif
114 if (!rs || rs->rs_count <= len) 126 if (!rs || rs->rs_count <= len)
115 _rs_stir(); 127 _rs_stir();
116 if (rs->rs_count <= len) 128 if (rs->rs_count <= len)