]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: add more logging for all EFI variable reads 15935/head
authorLennart Poettering <lennart@poettering.net>
Wed, 27 May 2020 15:30:29 +0000 (17:30 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 29 May 2020 13:42:09 +0000 (15:42 +0200)
src/basic/efivars.c

index 16982e4784c5b4bc90ac71085237bf4c89469ed9..7cff80454488407d3582491ccb29a4dd4b9a9a0d 100644 (file)
@@ -69,19 +69,21 @@ int efi_get_variable(
                 return 0;
         }
 
-        if (DEBUG_LOGGING)
+        if (DEBUG_LOGGING) {
+                log_debug("Reading EFI variable %s.", p);
                 begin = now(CLOCK_MONOTONIC);
+        }
 
         fd = open(p, O_RDONLY|O_NOCTTY|O_CLOEXEC);
         if (fd < 0)
                 return log_debug_errno(errno, "open(\"%s\") failed: %m", p);
 
         if (fstat(fd, &st) < 0)
-                return -errno;
+                return log_debug_errno(errno, "fstat(\"%s\") failed: %m", p);
         if (st.st_size < 4)
-                return -ENODATA;
+                return log_debug_errno(SYNTHETIC_ERRNO(ENODATA), "EFI variable %s is shorter than 4 bytes, refusing.", p);
         if (st.st_size > 4*1024*1024 + 4)
-                return -E2BIG;
+                return log_debug_errno(SYNTHETIC_ERRNO(E2BIG), "EFI variable %s is ridiculously large, refusing.", p);
 
         if (ret_value || ret_attribute) {
                 /* The kernel ratelimits reads from the efivarfs because EFI is inefficient, and we'll
@@ -96,7 +98,7 @@ int efi_get_variable(
                         n = read(fd, &a, sizeof(a));
                         if (n >= 0)
                                 break;
-                        log_debug_errno(errno, "read from \"%s\" failed: %m", p);
+                        log_debug_errno(errno, "Reading from \"%s\" failed: %m", p);
                         if (errno != EINTR)
                                 return -errno;
                         if (try >= EFI_N_RETRIES)
@@ -106,7 +108,8 @@ int efi_get_variable(
                 }
 
                 if (n != sizeof(a))
-                        return -EIO;
+                        return log_debug_errno(SYNTHETIC_ERRNO(EIO),
+                                               "Read %zi bytes from EFI variable %s, expected %zu.",  n, p, sizeof(a));
         }
 
         if (ret_value) {
@@ -116,7 +119,7 @@ int efi_get_variable(
 
                 n = read(fd, buf, (size_t) st.st_size - 4);
                 if (n < 0)
-                        return -errno;
+                        return log_debug_errno(errno, "Failed to read value of EFI variable %s: %m", p);
                 assert(n <= st.st_size - 4);
 
                 /* Always NUL terminate (3 bytes, to properly protect UTF-16, even if truncated in the middle of a character) */