OpenCoverage

getentropy_linux.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/compat/getentropy_linux.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: getentropy_linux.c,v 1.45 2018/03/13 22:53:28 bcook Exp $ */-
2-
3/*-
4 * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>-
5 * Copyright (c) 2014 Bob Beck <beck@obtuse.com>-
6 *-
7 * Permission to use, copy, modify, and distribute this software for any-
8 * purpose with or without fee is hereby granted, provided that the above-
9 * copyright notice and this permission notice appear in all copies.-
10 *-
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
18 *-
19 * Emulation of getentropy(2) as documented at:-
20 * http://man.openbsd.org/getentropy.2-
21 */-
22-
23#define _POSIX_C_SOURCE 199309L-
24#define _GNU_SOURCE 1-
25#include <sys/types.h>-
26#include <sys/param.h>-
27#include <sys/ioctl.h>-
28#include <sys/resource.h>-
29#include <sys/syscall.h>-
30#ifdef SYS__sysctl-
31#include <linux/sysctl.h>-
32#endif-
33#include <sys/statvfs.h>-
34#include <sys/socket.h>-
35#include <sys/mount.h>-
36#include <sys/mman.h>-
37#include <sys/stat.h>-
38#include <sys/time.h>-
39#include <stdlib.h>-
40#include <stdint.h>-
41#include <stdio.h>-
42#include <link.h>-
43#include <termios.h>-
44#include <fcntl.h>-
45#include <signal.h>-
46#include <string.h>-
47#include <errno.h>-
48#include <unistd.h>-
49#include <time.h>-
50#include <openssl/sha.h>-
51-
52#include <linux/types.h>-
53#include <linux/random.h>-
54#ifdef HAVE_GETAUXVAL-
55#include <sys/auxv.h>-
56#endif-
57#include <sys/vfs.h>-
58-
59#define REPEAT 5-
60#define min(a, b) (((a) < (b)) ? (a) : (b))-
61-
62#define HX(a, b) \-
63 do { \-
64 if ((a)) \-
65 HD(errno); \-
66 else \-
67 HD(b); \-
68 } while (0)-
69-
70#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))-
71#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))-
72#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))-
73-
74int getentropy(void *buf, size_t len);-
75-
76static int gotdata(char *buf, size_t len);-
77#if defined(SYS_getrandom) && defined(GRND_NONBLOCK)-
78static int getentropy_getrandom(void *buf, size_t len);-
79#endif-
80static int getentropy_urandom(void *buf, size_t len);-
81#ifdef SYS__sysctl-
82static int getentropy_sysctl(void *buf, size_t len);-
83#endif-
84static int getentropy_fallback(void *buf, size_t len);-
85static int getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data);-
86-
87int-
88getentropy(void *buf, size_t len)-
89{-
90 int ret = -1;-
91-
92 if (len > 256) {
len > 256Description
TRUEnever evaluated
FALSEevaluated 182 times by 27 tests
Evaluated by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
0-182
93 errno = EIO;-
94 return (-1);
never executed: return (-1);
0
95 }-
96-
97#if defined(SYS_getrandom) && defined(GRND_NONBLOCK)-
98 /*-
99 * Try descriptor-less getrandom(), in non-blocking mode.-
100 *-
101 * The design of Linux getrandom is broken. It has an-
102 * uninitialized phase coupled with blocking behaviour, which-
103 * is unacceptable from within a library at boot time without-
104 * possible recovery. See http://bugs.python.org/issue26839#msg267745-
105 */-
106 ret = getentropy_getrandom(buf, len);-
107 if (ret != -1)
ret != -1Description
TRUEevaluated 182 times by 27 tests
Evaluated by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
FALSEnever evaluated
0-182
108 return (ret);
executed 182 times by 27 tests: return (ret);
Executed by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
182
109#endif-
110-
111 /*-
112 * Try to get entropy with /dev/urandom-
113 *-
114 * This can fail if the process is inside a chroot or if file-
115 * descriptors are exhausted.-
116 */-
117 ret = getentropy_urandom(buf, len);-
118 if (ret != -1)
ret != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
119 return (ret);
never executed: return (ret);
0
120-
121#ifdef SYS__sysctl-
122 /*-
123 * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID.-
124 * sysctl is a failsafe API, so it guarantees a result. This-
125 * should work inside a chroot, or when file descriptors are-
126 * exhausted.-
127 *-
128 * However this can fail if the Linux kernel removes support-
129 * for sysctl. Starting in 2007, there have been efforts to-
130 * deprecate the sysctl API/ABI, and push callers towards use-
131 * of the chroot-unavailable fd-using /proc mechanism ---
132 * essentially the same problems as /dev/urandom.-
133 *-
134 * Numerous setbacks have been encountered in their deprecation-
135 * schedule, so as of June 2014 the kernel ABI still exists on-
136 * most Linux architectures. The sysctl() stub in libc is missing-
137 * on some systems. There are also reports that some kernels-
138 * spew messages to the console.-
139 */-
140 ret = getentropy_sysctl(buf, len);-
141 if (ret != -1)
ret != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
142 return (ret);
never executed: return (ret);
0
143#endif /* SYS__sysctl */-
144-
145 /*-
146 * Entropy collection via /dev/urandom and sysctl have failed.-
147 *-
148 * No other API exists for collecting entropy. See the large-
149 * comment block above.-
150 *-
151 * We have very few options:-
152 * - Even syslog_r is unsafe to call at this low level, so-
153 * there is no way to alert the user or program.-
154 * - Cannot call abort() because some systems have unsafe-
155 * corefiles.-
156 * - Could raise(SIGKILL) resulting in silent program termination.-
157 * - Return EIO, to hint that arc4random's stir function-
158 * should raise(SIGKILL)-
159 * - Do the best under the circumstances....-
160 *-
161 * This code path exists to bring light to the issue that Linux-
162 * still does not provide a failsafe API for entropy collection.-
163 *-
164 * We hope this demonstrates that Linux should either retain their-
165 * sysctl ABI, or consider providing a new failsafe API which-
166 * works in a chroot or when file descriptors are exhausted.-
167 */-
168#undef FAIL_INSTEAD_OF_TRYING_FALLBACK-
169#ifdef FAIL_INSTEAD_OF_TRYING_FALLBACK-
170 raise(SIGKILL);-
171#endif-
172 ret = getentropy_fallback(buf, len);-
173 if (ret != -1)
ret != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
174 return (ret);
never executed: return (ret);
0
175-
176 errno = EIO;-
177 return (ret);
never executed: return (ret);
0
178}-
179-
180/*-
181 * Basic sanity checking; wish we could do better.-
182 */-
183static int-
184gotdata(char *buf, size_t len)-
185{-
186 char any_set = 0;-
187 size_t i;-
188-
189 for (i = 0; i < len; ++i)
i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
190 any_set |= buf[i];
never executed: any_set |= buf[i];
0
191 if (any_set == 0)
any_set == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
192 return (-1);
never executed: return (-1);
0
193 return (0);
never executed: return (0);
0
194}-
195-
196#if defined(SYS_getrandom) && defined(GRND_NONBLOCK)-
197static int-
198getentropy_getrandom(void *buf, size_t len)-
199{-
200 int pre_errno = errno;-
201 int ret;-
202 if (len > 256)
len > 256Description
TRUEnever evaluated
FALSEevaluated 182 times by 27 tests
Evaluated by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
0-182
203 return (-1);
never executed: return (-1);
0
204 do {-
205 ret = syscall(SYS_getrandom, buf, len, GRND_NONBLOCK);-
206 } while (ret == -1 && errno == EINTR);
executed 182 times by 27 tests: end of block
Executed by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
ret == -1Description
TRUEnever evaluated
FALSEevaluated 182 times by 27 tests
Evaluated by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0-182
207-
208 if (ret != len)
ret != lenDescription
TRUEnever evaluated
FALSEevaluated 182 times by 27 tests
Evaluated by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
0-182
209 return (-1);
never executed: return (-1);
0
210 errno = pre_errno;-
211 return (0);
executed 182 times by 27 tests: return (0);
Executed by:
  • arc4randomforktest
  • bntest
  • cipher_list
  • cipherstest
  • clienttest
  • configtest
  • dhtest
  • dsatest
  • ecdhtest
  • ecdsatest
  • ectest
  • exptest
  • igetest
  • libcrypto.so.44.0.1
  • mont
  • pkcs7test
  • randtest
  • rsa_test
  • servertest
  • ssl_versions
  • ssltest
  • timingsafe
  • tls_ext_alpn
  • tls_prf
  • tlsexttest
  • ...
182
212}-
213#endif-
214-
215static int-
216getentropy_urandom(void *buf, size_t len)-
217{-
218 struct stat st;-
219 size_t i;-
220 int fd, cnt, flags;-
221 int save_errno = errno;-
222-
223start:
code before this statement never executed: start:
0
224-
225 flags = O_RDONLY;-
226#ifdef O_NOFOLLOW-
227 flags |= O_NOFOLLOW;-
228#endif-
229#ifdef O_CLOEXEC-
230 flags |= O_CLOEXEC;-
231#endif-
232 fd = open("/dev/urandom", flags, 0);-
233 if (fd == -1) {
fd == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
234 if (errno == EINTR)
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
235 goto start;
never executed: goto start;
0
236 goto nodevrandom;
never executed: goto nodevrandom;
0
237 }-
238#ifndef O_CLOEXEC-
239 fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);-
240#endif-
241-
242 /* Lightly verify that the device node looks sane */-
243 if (fstat(fd, &st) == -1 || !S_ISCHR(st.st_mode)) {
fstat(fd, &st) == -1Description
TRUEnever evaluated
FALSEnever evaluated
! (((( st.st_m... == (0020000))Description
TRUEnever evaluated
FALSEnever evaluated
0
244 close(fd);-
245 goto nodevrandom;
never executed: goto nodevrandom;
0
246 }-
247 if (ioctl(fd, RNDGETENTCNT, &cnt) == -1) {
ioctl(fd, (((2... , &cnt) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
248 close(fd);-
249 goto nodevrandom;
never executed: goto nodevrandom;
0
250 }-
251 for (i = 0; i < len; ) {
i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
252 size_t wanted = len - i;-
253 ssize_t ret = read(fd, (char *)buf + i, wanted);-
254-
255 if (ret == -1) {
ret == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
256 if (errno == EAGAIN || errno == EINTR)
(*__errno_location ()) == 11Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
257 continue;
never executed: continue;
0
258 close(fd);-
259 goto nodevrandom;
never executed: goto nodevrandom;
0
260 }-
261 i += ret;-
262 }
never executed: end of block
0
263 close(fd);-
264 if (gotdata(buf, len) == 0) {
gotdata(buf, len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
265 errno = save_errno;-
266 return (0); /* satisfied */
never executed: return (0);
0
267 }-
268nodevrandom:
code before this statement never executed: nodevrandom:
0
269 errno = EIO;-
270 return (-1);
never executed: return (-1);
0
271}-
272-
273#ifdef SYS__sysctl-
274static int-
275getentropy_sysctl(void *buf, size_t len)-
276{-
277 static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };-
278 size_t i;-
279 int save_errno = errno;-
280-
281 for (i = 0; i < len; ) {
i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
282 size_t chunk = min(len - i, 16);
((len - i) < (16))Description
TRUEnever evaluated
FALSEnever evaluated
0
283-
284 /* SYS__sysctl because some systems already removed sysctl() */-
285 struct __sysctl_args args = {-
286 .name = mib,-
287 .nlen = 3,-
288 .oldval = (char *)buf + i,-
289 .oldlenp = &chunk,-
290 };-
291 if (syscall(SYS__sysctl, &args) != 0)
syscall( 156 , &args) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
292 goto sysctlfailed;
never executed: goto sysctlfailed;
0
293 i += chunk;-
294 }
never executed: end of block
0
295 if (gotdata(buf, len) == 0) {
gotdata(buf, len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
296 errno = save_errno;-
297 return (0); /* satisfied */
never executed: return (0);
0
298 }-
299sysctlfailed:
code before this statement never executed: sysctlfailed:
0
300 errno = EIO;-
301 return (-1);
never executed: return (-1);
0
302}-
303#endif /* SYS__sysctl */-
304-
305static const int cl[] = {-
306 CLOCK_REALTIME,-
307#ifdef CLOCK_MONOTONIC-
308 CLOCK_MONOTONIC,-
309#endif-
310#ifdef CLOCK_MONOTONIC_RAW-
311 CLOCK_MONOTONIC_RAW,-
312#endif-
313#ifdef CLOCK_TAI-
314 CLOCK_TAI,-
315#endif-
316#ifdef CLOCK_VIRTUAL-
317 CLOCK_VIRTUAL,-
318#endif-
319#ifdef CLOCK_UPTIME-
320 CLOCK_UPTIME,-
321#endif-
322#ifdef CLOCK_PROCESS_CPUTIME_ID-
323 CLOCK_PROCESS_CPUTIME_ID,-
324#endif-
325#ifdef CLOCK_THREAD_CPUTIME_ID-
326 CLOCK_THREAD_CPUTIME_ID,-
327#endif-
328};-
329-
330static int-
331getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data)-
332{-
333 SHA512_CTX *ctx = data;-
334-
335 SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr));-
336 return (0);
never executed: return (0);
0
337}-
338-
339static int-
340getentropy_fallback(void *buf, size_t len)-
341{-
342 uint8_t results[SHA512_DIGEST_LENGTH];-
343 int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat;-
344 static int cnt;-
345 struct timespec ts;-
346 struct timeval tv;-
347 struct rusage ru;-
348 sigset_t sigset;-
349 struct stat st;-
350 SHA512_CTX ctx;-
351 static pid_t lastpid;-
352 pid_t pid;-
353 size_t i, ii, m;-
354 char *p;-
355-
356 pid = getpid();-
357 if (lastpid == pid) {
lastpid == pidDescription
TRUEnever evaluated
FALSEnever evaluated
0
358 faster = 1;-
359 repeat = 2;-
360 } else {
never executed: end of block
0
361 faster = 0;-
362 lastpid = pid;-
363 repeat = REPEAT;-
364 }
never executed: end of block
0
365 for (i = 0; i < len; ) {
i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
366 int j;-
367 SHA512_Init(&ctx);-
368 for (j = 0; j < repeat; j++) {
j < repeatDescription
TRUEnever evaluated
FALSEnever evaluated
0
369 HX((e = gettimeofday(&tv, NULL)) == -1, tv);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(tv), sizeof (tv)));
((e = gettimeo...*)0) )) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
370 if (e != -1) {
e != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
371 cnt += (int)tv.tv_sec;-
372 cnt += (int)tv.tv_usec;-
373 }
never executed: end of block
0
374-
375 dl_iterate_phdr(getentropy_phdr, &ctx);-
376-
377 for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); ii++)
ii < sizeof(cl)/sizeof(cl[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
378 HX(clock_gettime(cl[ii], &ts) == -1, ts);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(ts), sizeof (ts)));
never executed: end of block
(clock_gettime...], &ts) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
379-
380 HX((pid = getpid()) == -1, pid);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(pid), sizeof (pid)));
((pid = getpid()) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
381 HX((pid = getsid(pid)) == -1, pid);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(pid), sizeof (pid)));
((pid = getsid(pid)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
382 HX((pid = getppid()) == -1, pid);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(pid), sizeof (pid)));
((pid = getppid()) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
383 HX((pid = getpgid(0)) == -1, pid);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(pid), sizeof (pid)));
((pid = getpgid(0)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
384 HX((e = getpriority(0, 0)) == -1, e);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(e), sizeof (e)));
((e = getprior...(0, 0)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
385-
386 if (!faster) {
!fasterDescription
TRUEnever evaluated
FALSEnever evaluated
0
387 ts.tv_sec = 0;-
388 ts.tv_nsec = 1;-
389 (void) nanosleep(&ts, NULL);-
390 }
never executed: end of block
0
391-
392 HX(sigpending(&sigset) == -1, sigset);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(sigset), sizeof (sigset)));
(sigpending(&sigset) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
393 HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(sigset), sizeof (sigset)));
(sigprocmask( ...sigset) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
394 sigset);-
395-
396 HF(getentropy); /* an addr in this library */-
397 HF(printf); /* an addr in libc */-
398 p = (char *)&p;-
399 HD(p); /* an addr on stack */-
400 p = (char *)&errno;-
401 HD(p); /* the addr of errno */-
402-
403 if (i == 0) {
i == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
404 struct sockaddr_storage ss;-
405 struct statvfs stvfs;-
406 struct termios tios;-
407 struct statfs stfs;-
408 socklen_t ssl;-
409 off_t off;-
410-
411 /*-
412 * Prime-sized mappings encourage fragmentation;-
413 * thus exposing some address entropy.-
414 */-
415 struct mm {-
416 size_t npg;-
417 void *p;-
418 } mm[] = {-
419 { 17, MAP_FAILED }, { 3, MAP_FAILED },-
420 { 11, MAP_FAILED }, { 2, MAP_FAILED },-
421 { 5, MAP_FAILED }, { 3, MAP_FAILED },-
422 { 7, MAP_FAILED }, { 1, MAP_FAILED },-
423 { 57, MAP_FAILED }, { 3, MAP_FAILED },-
424 { 131, MAP_FAILED }, { 1, MAP_FAILED },-
425 };-
426-
427 for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
m < sizeof mm/sizeof(mm[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
428 HX(mm[m].p = mmap(NULL,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(mm[m].p), sizeof (mm[m].p)));
(mm[m].p = mma...-1, (off_t)0))Description
TRUEnever evaluated
FALSEnever evaluated
0
429 mm[m].npg * pgs,-
430 PROT_READ|PROT_WRITE,-
431 MAP_PRIVATE|MAP_ANON, -1,-
432 (off_t)0), mm[m].p);-
433 if (mm[m].p != MAP_FAILED) {
mm[m].p != ((void *) -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
434 size_t mo;-
435-
436 /* Touch some memory... */-
437 p = mm[m].p;-
438 mo = cnt %-
439 (mm[m].npg * pgs - 1);-
440 p[mo] = 1;-
441 cnt += (int)((long)(mm[m].p)-
442 / pgs);-
443 }
never executed: end of block
0
444-
445 /* Check cnts and times... */-
446 for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
ii < sizeof(cl)/sizeof(cl[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
447 ii++) {-
448 HX((e = clock_gettime(cl[ii],
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(ts), sizeof (ts)));
((e = clock_ge..., &ts)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
449 &ts)) == -1, ts);-
450 if (e != -1)
e != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
451 cnt += (int)ts.tv_nsec;
never executed: cnt += (int)ts.tv_nsec;
0
452 }
never executed: end of block
0
453-
454 HX((e = getrusage(RUSAGE_SELF,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(ru), sizeof (ru)));
((e = getrusag..., &ru)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
455 &ru)) == -1, ru);-
456 if (e != -1) {
e != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
457 cnt += (int)ru.ru_utime.tv_sec;-
458 cnt += (int)ru.ru_utime.tv_usec;-
459 }
never executed: end of block
0
460 }
never executed: end of block
0
461-
462 for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
m < sizeof mm/sizeof(mm[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
463 if (mm[m].p != MAP_FAILED)
mm[m].p != ((void *) -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
464 munmap(mm[m].p, mm[m].npg * pgs);
never executed: munmap(mm[m].p, mm[m].npg * pgs);
0
465 mm[m].p = MAP_FAILED;-
466 }
never executed: end of block
0
467-
468 HX(stat(".", &st) == -1, st);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(st), sizeof (st)));
(stat(".", &st) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
469 HX(statvfs(".", &stvfs) == -1, stvfs);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stvfs), sizeof (stvfs)));
(statvfs(".", &stvfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
470 HX(statfs(".", &stfs) == -1, stfs);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stfs), sizeof (stfs)));
(statfs(".", &stfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
471-
472 HX(stat("/", &st) == -1, st);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(st), sizeof (st)));
(stat("/", &st) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
473 HX(statvfs("/", &stvfs) == -1, stvfs);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stvfs), sizeof (stvfs)));
(statvfs("/", &stvfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
474 HX(statfs("/", &stfs) == -1, stfs);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stfs), sizeof (stfs)));
(statfs("/", &stfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
475-
476 HX((e = fstat(0, &st)) == -1, st);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(st), sizeof (st)));
((e = fstat(0, &st)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
477 if (e == -1) {
e == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
478 if (S_ISREG(st.st_mode) ||
(((( st.st_mod... == (0100000))Description
TRUEnever evaluated
FALSEnever evaluated
0
479 S_ISFIFO(st.st_mode) ||
(((( st.st_mod... == (0010000))Description
TRUEnever evaluated
FALSEnever evaluated
0
480 S_ISSOCK(st.st_mode)) {
(((( st.st_mod... == (0140000))Description
TRUEnever evaluated
FALSEnever evaluated
0
481 HX(fstatvfs(0, &stvfs) == -1,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stvfs), sizeof (stvfs)));
(fstatvfs(0, &stvfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
482 stvfs);-
483 HX(fstatfs(0, &stfs) == -1,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(stfs), sizeof (stfs)));
(fstatfs(0, &stfs) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
484 stfs);-
485 HX((off = lseek(0, (off_t)0,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(off), sizeof (off)));
((off = lseek(...t)0, 1 )) < 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
486 SEEK_CUR)) < 0, off);-
487 }
never executed: end of block
0
488 if (S_ISCHR(st.st_mode)) {
(((( st.st_mod... == (0020000))Description
TRUEnever evaluated
FALSEnever evaluated
0
489 HX(tcgetattr(0, &tios) == -1,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(tios), sizeof (tios)));
(tcgetattr(0, &tios) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
490 tios);-
491 } else if (S_ISSOCK(st.st_mode)) {
never executed: end of block
(((( st.st_mod... == (0140000))Description
TRUEnever evaluated
FALSEnever evaluated
0
492 memset(&ss, 0, sizeof ss);-
493 ssl = sizeof(ss);-
494 HX(getpeername(0,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(ss), sizeof (ss)));
(getpeername(0..., &ssl) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
495 (void *)&ss, &ssl) == -1,-
496 ss);-
497 }
never executed: end of block
0
498 }
never executed: end of block
0
499-
500 HX((e = getrusage(RUSAGE_CHILDREN,
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(ru), sizeof (ru)));
((e = getrusag..., &ru)) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
501 &ru)) == -1, ru);-
502 if (e != -1) {
e != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
503 cnt += (int)ru.ru_utime.tv_sec;-
504 cnt += (int)ru.ru_utime.tv_usec;-
505 }
never executed: end of block
0
506 } else {
never executed: end of block
0
507 /* Subsequent hashes absorb previous result */-
508 HD(results);-
509 }
never executed: end of block
0
510-
511 HX((e = gettimeofday(&tv, NULL)) == -1, tv);
never executed: (SHA512_Update(&ctx, (char *)&( (*__errno_location ()) ), sizeof ( (*__errno_location ()) )));
never executed: (SHA512_Update(&ctx, (char *)&(tv), sizeof (tv)));
((e = gettimeo...*)0) )) == -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
512 if (e != -1) {
e != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
513 cnt += (int)tv.tv_sec;-
514 cnt += (int)tv.tv_usec;-
515 }
never executed: end of block
0
516-
517 HD(cnt);-
518 }
never executed: end of block
0
519#ifdef HAVE_GETAUXVAL-
520#ifdef AT_RANDOM-
521 /* Not as random as you think but we take what we are given */-
522 p = (char *) getauxval(AT_RANDOM);-
523 if (p)
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
524 HR(p, 16);
never executed: (SHA512_Update(&ctx, (char *)(p), (16)));
0
525#endif-
526#ifdef AT_SYSINFO_EHDR-
527 p = (char *) getauxval(AT_SYSINFO_EHDR);-
528 if (p)
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
529 HR(p, pgs);
never executed: (SHA512_Update(&ctx, (char *)(p), (pgs)));
0
530#endif-
531#ifdef AT_BASE-
532 p = (char *) getauxval(AT_BASE);-
533 if (p)
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
534 HD(p);
never executed: (SHA512_Update(&ctx, (char *)&(p), sizeof (p)));
0
535#endif-
536#endif-
537-
538 SHA512_Final(results, &ctx);-
539 memcpy((char *)buf + i, results, min(sizeof(results), len - i));-
540 i += min(sizeof(results), len - i);
((sizeof(resul...) < (len - i))Description
TRUEnever evaluated
FALSEnever evaluated
0
541 }
never executed: end of block
0
542 explicit_bzero(&ctx, sizeof ctx);-
543 explicit_bzero(results, sizeof results);-
544 if (gotdata(buf, len) == 0) {
gotdata(buf, len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
545 errno = save_errno;-
546 return (0); /* satisfied */
never executed: return (0);
0
547 }-
548 errno = EIO;-
549 return (-1);
never executed: return (-1);
0
550}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2