From 54a17f189070c0a2a8a349f9d7cf0c9013ce7d3b Mon Sep 17 00:00:00 2001 From: Brent Cook Date: Thu, 28 Aug 2014 01:00:58 +0000 Subject: 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. --- lib/libcrypto/crypto/getentropy_linux.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib/libcrypto/crypto') diff --git a/lib/libcrypto/crypto/getentropy_linux.c b/lib/libcrypto/crypto/getentropy_linux.c index 76d724af148..4e1a267931d 100644 --- a/lib/libcrypto/crypto/getentropy_linux.c +++ b/lib/libcrypto/crypto/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 @@ -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 -- cgit v1.2.3