random: Call random progress handler more often.
authorWerner Koch <wk@gnupg.org>
Mon, 16 Dec 2013 08:45:02 +0000 (09:45 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 16 Dec 2013 10:44:25 +0000 (11:44 +0100)
* random/rndlinux.c (_gcry_rndlinux_gather_random): Update progress
indicator earlier.
--

GnuPG-bug-id: 1531
Signed-off-by: Werner Koch <wk@gnupg.org>
random/rndlinux.c

index 21ea8c4..89ac203 100644 (file)
@@ -183,6 +183,18 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t,
       struct timeval tv;
       int rc;
 
+      /* If we collected some bytes update the progress indicator.  We
+         do this always and not just if the select timed out because
+         often just a few bytes are gathered within the timeout
+         period.  */
+      if (any_need_entropy || last_so_far != (want - length) )
+        {
+          last_so_far = want - length;
+          _gcry_random_progress ("need_entropy", 'X',
+                                 (int)last_so_far, (int)want);
+          any_need_entropy = 1;
+        }
+
       /* If the system has no limit on the number of file descriptors
          and we encounter an fd which is larger than the fd_set size,
          we don't use the select at all.  The select code is only used
@@ -198,13 +210,7 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t,
           tv.tv_usec = delay? 0 : 100000;
           if ( !(rc=select(fd+1, &rfds, NULL, NULL, &tv)) )
             {
-              if (!any_need_entropy || last_so_far != (want - length) )
-                {
-                  last_so_far = want - length;
-                  _gcry_random_progress ("need_entropy", 'X',
-                                         (int)last_so_far, (int)want);
-                  any_need_entropy = 1;
-                }
+              any_need_entropy = 1;
               delay = 3; /* Use 3 seconds henceforth.  */
               continue;
             }