# HG changeset patch # User Matt Johnston # Date 1114358196 0 # Node ID 5ccad7634388cf8fc7fe2fdc187afa44a129f857 # Parent ca55377e4f7e5e2c8896f8b18a37c820b1986731 * warn if we seem to be blocking on /dev/random diff -r ca55377e4f7e -r 5ccad7634388 TODO --- a/TODO Sun Apr 24 10:30:33 2005 +0000 +++ b/TODO Sun Apr 24 15:56:36 2005 +0000 @@ -4,9 +4,6 @@ - Make options.h generated from configure perhaps? -- some sort of warning when blocking on random? (could be difficult, - investigate alarm() perhaps) - - Improved queueing of unauthed connections - handle /etc/environment in AIX diff -r ca55377e4f7e -r 5ccad7634388 random.c --- a/random.c Sun Apr 24 10:30:33 2005 +0000 +++ b/random.c Sun Apr 24 15:56:36 2005 +0000 @@ -50,6 +50,7 @@ static void readrand(unsigned char* buf, unsigned int buflen) { + static int already_blocked = 0; int readfd; unsigned int readpos; int readlen; @@ -92,6 +93,24 @@ /* read the actual random data */ readpos = 0; do { + if (!already_blocked) + { + int ret; + struct timeval timeout; + fd_set read_fds; + + timeout.tv_sec = 2; /* two seconds should be enough */ + timeout.tv_usec = 0; + + FD_ZERO(&read_fds); + FD_SET(readfd, &read_fds); + ret = select(readfd + 1, &read_fds, NULL, NULL, &timeout); + if (ret == 0) + { + dropbear_log(LOG_INFO, "Warning: Reading the random source seems to have blocked.\nIf you experience problems, you probably need to find a better entropy source."); + already_blocked = 1; + } + } readlen = read(readfd, &buf[readpos], buflen - readpos); if (readlen <= 0) { if (readlen < 0 && errno == EINTR) {