]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
random-util: open /dev/urandom implicitly in random_write_entropy() if needed
authorLennart Poettering <lennart@poettering.net>
Sat, 28 Nov 2020 14:24:44 +0000 (15:24 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 3 Dec 2020 19:14:17 +0000 (20:14 +0100)
src/basic/random-util.c
src/core/efi-random.c
src/core/main.c
src/shared/pkcs11-util.c

index c8c34a203472efe3e826c521567ac0707f2a4f4f..c831f06dacf3790ca48ae2b2034ec0e7645cbfcd 100644 (file)
@@ -452,10 +452,21 @@ size_t random_pool_size(void) {
 }
 
 int random_write_entropy(int fd, const void *seed, size_t size, bool credit) {
+        _cleanup_close_ int opened_fd = -1;
         int r;
 
-        assert(fd >= 0);
-        assert(seed && size > 0);
+        assert(seed || size == 0);
+
+        if (size == 0)
+                return 0;
+
+        if (fd < 0) {
+                opened_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
+                if (opened_fd < 0)
+                        return -errno;
+
+                fd = opened_fd;
+        }
 
         if (credit) {
                 _cleanup_free_ struct rand_pool_info *info = NULL;
@@ -481,5 +492,5 @@ int random_write_entropy(int fd, const void *seed, size_t size, bool credit) {
                         return r;
         }
 
-        return 0;
+        return 1;
 }
index 2bc74fab98a5236a54d63e6d4e24cac6ae58cf97..94e138b35bae3e9fa1754fdc1c9e95b82b44a68b 100644 (file)
@@ -43,7 +43,6 @@ static void lock_down_efi_variables(void) {
 
 int efi_take_random_seed(void) {
         _cleanup_free_ void *value = NULL;
-        _cleanup_close_ int random_fd = -1;
         size_t size;
         int r;
 
@@ -77,17 +76,13 @@ int efi_take_random_seed(void) {
         if (size == 0)
                 return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), "Random seed passed from boot loader has zero size? Ignoring.");
 
-        random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
-        if (random_fd < 0)
-                return log_warning_errno(errno, "Failed to open /dev/urandom for writing, ignoring: %m");
-
         /* Before we use the seed, let's mark it as used, so that we never credit it twice. Also, it's a nice
          * way to let users known that we successfully acquired entropy from the boot laoder. */
         r = touch("/run/systemd/efi-random-seed-taken");
         if (r < 0)
                 return log_warning_errno(r, "Unable to mark EFI random seed as used, not using it: %m");
 
-        r = random_write_entropy(random_fd, value, size, true);
+        r = random_write_entropy(-1, value, size, true);
         if (r < 0)
                 return log_warning_errno(errno, "Failed to credit entropy, ignoring: %m");
 
index 9cb6afcd8219056acb393fd65cde89fafe036087..ef4d03750f7ba7b41f39d5a618a9f20cfc0e7555 100644 (file)
@@ -1605,7 +1605,6 @@ static void apply_clock_update(void) {
 }
 
 static void cmdline_take_random_seed(void) {
-        _cleanup_close_ int random_fd = -1;
         size_t suggested;
         int r;
 
@@ -1622,13 +1621,7 @@ static void cmdline_take_random_seed(void) {
                 log_warning("Random seed specified on kernel command line has size %zu, but %zu bytes required to fill entropy pool.",
                             arg_random_seed_size, suggested);
 
-        random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
-        if (random_fd < 0) {
-                log_warning_errno(errno, "Failed to open /dev/urandom for writing, ignoring: %m");
-                return;
-        }
-
-        r = random_write_entropy(random_fd, arg_random_seed, arg_random_seed_size, true);
+        r = random_write_entropy(-1, arg_random_seed, arg_random_seed_size, true);
         if (r < 0) {
                 log_warning_errno(r, "Failed to credit entropy specified on kernel command line, ignoring: %m");
                 return;
index e74f0be26062713040a697b0a2886b7f40cee3aa..078a86ec3237d08fb4b6dece5cf9c41db9aab3d7 100644 (file)
@@ -671,7 +671,6 @@ int pkcs11_token_acquire_rng(
                 CK_SESSION_HANDLE session) {
 
         _cleanup_free_ void *buffer = NULL;
-        _cleanup_close_ int fd = -1;
         size_t rps;
         CK_RV rv;
         int r;
@@ -696,11 +695,7 @@ int pkcs11_token_acquire_rng(
                 return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
                                        "Failed to generate RNG data on security token: %s", p11_kit_strerror(rv));
 
-        fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
-        if (fd < 0)
-                return log_debug_errno(errno, "Failed to open /dev/urandom for writing: %m");
-
-        r = loop_write(fd, buffer, rps, false);
+        r = random_write_entropy(-1, buffer, rps, false);
         if (r < 0)
                 return log_debug_errno(r, "Failed to write PKCS#11 acquired random data to /dev/urandom: %m");