Fix hang in EGD/PRNGD query when communication socket is closed
prematurely by EGD/PRNGD.
PR: 1014
Submitted by: Darren Tucker <dtucker@zip.com.au>
diff --git a/CHANGES b/CHANGES
index 28b0e29..4d766fb 100644
--- a/CHANGES
+++ b/CHANGES
@@ -750,6 +750,10 @@
 
  Changes between 0.9.7e and 0.9.7f  [XX xxx XXXX]
 
+  *) Fix hang in EGD/PRNGD query when communication socket is closed
+     prematurely by EGD/PRNGD.
+     [Darren Tucker <dtucker@zip.com.au> via Lutz Jänicke, resolves #1014]
+
   *) Prompt for pass phrases when appropriate for PKCS12 input format.
      [Steve Henson]
 
diff --git a/crypto/rand/rand_egd.c b/crypto/rand/rand_egd.c
index e34f07c..50bce6c 100644
--- a/crypto/rand/rand_egd.c
+++ b/crypto/rand/rand_egd.c
@@ -216,7 +216,9 @@
 	    while (numbytes != 1)
 		{
 	        num = read(fd, egdbuf, 1);
-	        if (num >= 0)
+	        if (num == 0)
+			goto err;	/* descriptor closed */
+		else if (num > 0)
 		    numbytes += num;
 	    	else
 		    {
@@ -246,7 +248,9 @@
 	    while (numbytes != egdbuf[0])
 		{
 	        num = read(fd, retrievebuf + numbytes, egdbuf[0] - numbytes);
-	        if (num >= 0)
+		if (num == 0)
+			goto err;	/* descriptor closed */
+	        else if (num > 0)
 		    numbytes += num;
 	    	else
 		    {