summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrent Cook <bcook@cvs.openbsd.org>2014-08-28 01:00:58 +0000
committerBrent Cook <bcook@cvs.openbsd.org>2014-08-28 01:00:58 +0000
commit89099ea75c2e3ce3bbf36a3abc9f7df93e0ce9be (patch)
tree1aef4cf3f7375795555db368067c58e675d94369
parentc409a7e85b8bce958f24fe94bf41f7d5a3037048 (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.c10
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