mirror of git://anongit.mindrot.org/openssh.git
- (djm) Robustify EGD/PRNGd code in face of socket closures. Patch from
Todd C. Miller <Todd.Miller@courtesan.com>
This commit is contained in:
parent
0a4e27d583
commit
b3ffc5f1d4
|
@ -7,6 +7,8 @@
|
||||||
<vinschen@redhat.com> and myself.
|
<vinschen@redhat.com> and myself.
|
||||||
- (djm) Close listen_sock on bind() failures. Patch from Arkadiusz
|
- (djm) Close listen_sock on bind() failures. Patch from Arkadiusz
|
||||||
Miskiewicz <misiek@pld.ORG.PL>
|
Miskiewicz <misiek@pld.ORG.PL>
|
||||||
|
- (djm) Robustify EGD/PRNGd code in face of socket closures. Patch from
|
||||||
|
Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
|
||||||
20010217
|
20010217
|
||||||
- (bal) OpenBSD Sync:
|
- (bal) OpenBSD Sync:
|
||||||
|
@ -4014,4 +4016,4 @@
|
||||||
- Wrote replacements for strlcpy and mkdtemp
|
- Wrote replacements for strlcpy and mkdtemp
|
||||||
- Released 1.0pre1
|
- Released 1.0pre1
|
||||||
|
|
||||||
$Id: ChangeLog,v 1.786 2001/02/18 01:36:39 djm Exp $
|
$Id: ChangeLog,v 1.787 2001/02/18 01:44:29 djm Exp $
|
||||||
|
|
39
entropy.c
39
entropy.c
|
@ -38,7 +38,7 @@
|
||||||
#include "pathnames.h"
|
#include "pathnames.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
RCSID("$Id: entropy.c,v 1.26 2001/02/05 12:42:17 stevesk Exp $");
|
RCSID("$Id: entropy.c,v 1.27 2001/02/18 01:44:29 djm Exp $");
|
||||||
|
|
||||||
#ifndef offsetof
|
#ifndef offsetof
|
||||||
# define offsetof(type, member) ((size_t) &((type *)0)->member)
|
# define offsetof(type, member) ((size_t) &((type *)0)->member)
|
||||||
|
@ -71,7 +71,8 @@ int get_random_bytes(unsigned char *buf, int len)
|
||||||
int fd;
|
int fd;
|
||||||
char msg[2];
|
char msg[2];
|
||||||
struct sockaddr_un addr;
|
struct sockaddr_un addr;
|
||||||
int addr_len;
|
int addr_len, rval, errors;
|
||||||
|
struct sigaction nsa, osa;
|
||||||
|
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
if (sizeof(EGD_SOCKET) > sizeof(addr.sun_path))
|
if (sizeof(EGD_SOCKET) > sizeof(addr.sun_path))
|
||||||
|
@ -84,17 +85,22 @@ int get_random_bytes(unsigned char *buf, int len)
|
||||||
strlcpy(addr.sun_path, EGD_SOCKET, sizeof(addr.sun_path));
|
strlcpy(addr.sun_path, EGD_SOCKET, sizeof(addr.sun_path));
|
||||||
addr_len = offsetof(struct sockaddr_un, sun_path) + sizeof(EGD_SOCKET);
|
addr_len = offsetof(struct sockaddr_un, sun_path) + sizeof(EGD_SOCKET);
|
||||||
|
|
||||||
|
memset(&nsa, 0, sizeof(nsa));
|
||||||
|
nsa.sa_handler = SIG_IGN;
|
||||||
|
(void) sigaction(SIGPIPE, &nsa, &osa);
|
||||||
|
|
||||||
|
errors = rval = 0;
|
||||||
|
reopen:
|
||||||
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
error("Couldn't create AF_UNIX socket: %s", strerror(errno));
|
error("Couldn't create AF_UNIX socket: %s", strerror(errno));
|
||||||
return(0);
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr*)&addr, addr_len) == -1) {
|
if (connect(fd, (struct sockaddr*)&addr, addr_len) == -1) {
|
||||||
error("Couldn't connect to EGD socket \"%s\": %s",
|
error("Couldn't connect to EGD socket \"%s\": %s",
|
||||||
addr.sun_path, strerror(errno));
|
addr.sun_path, strerror(errno));
|
||||||
close(fd);
|
goto done;
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send blocking read request to EGD */
|
/* Send blocking read request to EGD */
|
||||||
|
@ -102,22 +108,33 @@ int get_random_bytes(unsigned char *buf, int len)
|
||||||
msg[1] = len;
|
msg[1] = len;
|
||||||
|
|
||||||
if (atomicio(write, fd, msg, sizeof(msg)) != sizeof(msg)) {
|
if (atomicio(write, fd, msg, sizeof(msg)) != sizeof(msg)) {
|
||||||
|
if (errno == EPIPE && errors < 10) {
|
||||||
|
close(fd);
|
||||||
|
errors++;
|
||||||
|
goto reopen;
|
||||||
|
}
|
||||||
error("Couldn't write to EGD socket \"%s\": %s",
|
error("Couldn't write to EGD socket \"%s\": %s",
|
||||||
EGD_SOCKET, strerror(errno));
|
EGD_SOCKET, strerror(errno));
|
||||||
close(fd);
|
goto done;
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomicio(read, fd, buf, len) != len) {
|
if (atomicio(read, fd, buf, len) != len) {
|
||||||
|
if (errno == EPIPE && errors < 10) {
|
||||||
|
close(fd);
|
||||||
|
errors++;
|
||||||
|
goto reopen;
|
||||||
|
}
|
||||||
error("Couldn't read from EGD socket \"%s\": %s",
|
error("Couldn't read from EGD socket \"%s\": %s",
|
||||||
EGD_SOCKET, strerror(errno));
|
EGD_SOCKET, strerror(errno));
|
||||||
close(fd);
|
goto done;
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rval = 1;
|
||||||
|
done:
|
||||||
|
(void) sigaction(SIGPIPE, &osa, NULL);
|
||||||
|
if (fd != -1)
|
||||||
close(fd);
|
close(fd);
|
||||||
|
return(rval);
|
||||||
return(1);
|
|
||||||
}
|
}
|
||||||
#else /* !EGD_SOCKET */
|
#else /* !EGD_SOCKET */
|
||||||
#ifdef RANDOM_POOL
|
#ifdef RANDOM_POOL
|
||||||
|
|
Loading…
Reference in New Issue