Remember to close /dev/urandom when done.
authorTaylor R Campbell <campbell@mumble.net>
Wed, 7 Nov 2018 17:06:50 +0000 (17:06 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 7 Nov 2018 17:06:50 +0000 (17:06 +0000)
src/microcode/uxentropy.c

index 057d9274376b0982d7ac3dafc79931f0e7870355..2bc4a810cd77fb0e70d3bdc2096c9e44e96ce151 100644 (file)
@@ -31,11 +31,21 @@ USA.
 
 #define PATH_URANDOM "/dev/urandom"
 
+static void
+tx_close (void * cookie)
+{
+  int * fdp = cookie;
+  if ((*fdp) != -1)
+    (void) UX_close (*fdp);
+}
+
 void
 OS_get_entropy (uint8_t buf [32])
 {
   size_t nbytes = 32;
-  int fd;
+  int fd = -1;
+  transaction_begin ();
+  transaction_record_action (tat_always, tx_close, (&fd));
   STD_FD_SYSTEM_CALL (syscall_open, fd, (UX_open (PATH_URANDOM, O_RDONLY)));
   ssize_t nread;
   while ((nread = (UX_read (fd, buf, nbytes))) != 0)
@@ -46,7 +56,10 @@ OS_get_entropy (uint8_t buf [32])
          continue;
        }
       if (((size_t) nread) >= nbytes)
-       return;
+       {
+         transaction_commit ();
+         return;
+       }
       nbytes -= ((size_t) nread);
       buf += ((size_t) nread);
     }