Browse Source

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.
OPENBSD_5_7
bcook 10 years ago
parent
commit
7131c8971a
2 changed files with 12 additions and 8 deletions
  1. +6
    -4
      src/lib/libcrypto/arc4random/getentropy_linux.c
  2. +6
    -4
      src/lib/libcrypto/crypto/getentropy_linux.c

+ 6
- 4
src/lib/libcrypto/arc4random/getentropy_linux.c View File

@ -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


+ 6
- 4
src/lib/libcrypto/crypto/getentropy_linux.c View File

@ -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


Loading…
Cancel
Save