OSDN Git Service

autopair: Remove time(NULL) fallback when seeding rand()
authorAnderson Lizardo <anderson.lizardo@openbossa.org>
Mon, 7 Oct 2013 21:05:24 +0000 (17:05 -0400)
committerJohan Hedberg <johan.hedberg@intel.com>
Wed, 5 Mar 2014 20:31:16 +0000 (22:31 +0200)
If /dev/urandom cannot be opened or read, just fail the plugin
initialization, as it is very unlikely that a fully working Linux system
does not have a working /dev/urandom. This also simplifies the code
logic.

plugins/autopair.c

index c01d81c..d63da93 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <errno.h>
 
 #include <bluetooth/bluetooth.h>
 #include <glib.h>
@@ -157,19 +158,27 @@ static int autopair_init(void)
 {
        /* Initialize the random seed from /dev/urandom */
        unsigned int seed;
-       int fd;
+       int fd, err;
+       ssize_t n;
 
        fd = open("/dev/urandom", O_RDONLY);
-       if (fd >= 0) {
-               ssize_t n;
-
-               n = read(fd, &seed, sizeof(seed));
-               if (n < (ssize_t) sizeof(seed))
-                       seed = time(NULL);
+       if (fd < 0) {
+               err = -errno;
+               error("Failed to open /dev/urandom: %s (%d)", strerror(-err),
+                                                                       -err);
+               return err;
+       }
 
+       n = read(fd, &seed, sizeof(seed));
+       if (n < (ssize_t) sizeof(seed)) {
+               err = (n == -1) ? -errno : -EIO;
+               error("Failed to read %zu bytes from /dev/urandom",
+                                                               sizeof(seed));
                close(fd);
-       } else
-               seed = time(NULL);
+               return err;
+       }
+
+       close(fd);
 
        srand(seed);