diff options
author | Brent Cook <bcook@cvs.openbsd.org> | 2014-08-28 01:00:58 +0000 |
---|---|---|
committer | Brent Cook <bcook@cvs.openbsd.org> | 2014-08-28 01:00:58 +0000 |
commit | 89099ea75c2e3ce3bbf36a3abc9f7df93e0ce9be (patch) | |
tree | 1aef4cf3f7375795555db368067c58e675d94369 | |
parent | c409a7e85b8bce958f24fe94bf41f7d5a3037048 (diff) |
preserve errno value on success.
If getrandom returns a temporary failure, make sure errno is not polluted when
it succeeds. Thanks to deraadt@ for pointing it out.
-rw-r--r-- | lib/libcrypto/arc4random/getentropy_linux.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/libcrypto/arc4random/getentropy_linux.c b/lib/libcrypto/arc4random/getentropy_linux.c index 76d724af148..4e1a267931d 100644 --- a/lib/libcrypto/arc4random/getentropy_linux.c +++ b/lib/libcrypto/arc4random/getentropy_linux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getentropy_linux.c,v 1.34 2014/08/16 18:42:41 bcook Exp $ */ +/* $OpenBSD: getentropy_linux.c,v 1.35 2014/08/28 01:00:57 bcook Exp $ */ /* * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> @@ -194,6 +194,7 @@ gotdata(char *buf, size_t len) static int getentropy_getrandom(void *buf, size_t len) { + int pre_errno = errno; int ret; if (len > 256) return (-1); @@ -201,9 +202,10 @@ getentropy_getrandom(void *buf, size_t len) ret = syscall(SYS_getrandom, buf, len, 0); } while (ret == -1 && errno == EINTR); - if (ret == len) - return (0); - return (-1); + if (ret != len) + return (-1); + errno = pre_errno; + return (0); } #endif |