areguera / rpms / cockpit

Forked from rpms/cockpit 5 years ago
Clone
Blob Blame History Raw
From 0a0250e8118c47ced529772758d49d6c5a60924f Mon Sep 17 00:00:00 2001
From: Dominik Perpeet <dperpeet@redhat.com>
Date: Mon, 1 Feb 2016 13:49:59 +0100
Subject: [PATCH] ws: Recover from interruptions during read

Reading crucial information needs to recover from interrupted and
partial reads.

Closes #3650
Reviewed-by: Stef Walter <stefw@redhat.com>
---
 src/ws/cockpitauth.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/ws/cockpitauth.c b/src/ws/cockpitauth.c
index f8f2f7d..e26d2a0 100644
--- a/src/ws/cockpitauth.c
+++ b/src/ws/cockpitauth.c
@@ -155,12 +155,28 @@ static void
 cockpit_auth_init (CockpitAuth *self)
 {
   gint fd;
+  gint read_bytes;
+  gint read_result;
 
   self->key = g_byte_array_new ();
   g_byte_array_set_size (self->key, 128);
   fd = g_open ("/dev/urandom", O_RDONLY, 0);
-  if (fd < 0 || read (fd, self->key->data, 128) != 128)
+  if (fd < 0)
     g_error ("couldn't read random key, startup aborted");
+  read_bytes = 0;
+  do
+    {
+      errno = 0;
+      read_result = read (fd, self->key->data + read_bytes, self->key->len - read_bytes);
+      if (read_result <= 0)
+        {
+          if (errno == EAGAIN || errno == EINTR)
+              continue;
+          g_error ("couldn't read random key, startup aborted");
+        }
+      read_bytes += read_result;
+    }
+  while (read_bytes < self->key->len);
   close (fd);
 
   self->authenticated = g_hash_table_new_full (g_str_hash, g_str_equal,
-- 
2.4.3