Blame SOURCES/0016-Always-log-to-a-memfd-regardless-of-loglevel.patch

4e0e09
From 518bca17bd39d87a35b9f7c7f186f08dc9e4be15 Mon Sep 17 00:00:00 2001
4e0e09
From: Peter Jones <pjones@redhat.com>
4e0e09
Date: Tue, 28 May 2019 15:42:37 -0400
4e0e09
Subject: [PATCH 16/63] Always log to a memfd regardless of loglevel.
4e0e09
4e0e09
This writes all debug logs to a memfd, so that they'll always show up in
4e0e09
strace.
4e0e09
4e0e09
Signed-off-by: Peter Jones <pjones@redhat.com>
4e0e09
---
4e0e09
 src/error.c                 | 88 ++++++++++++++++++++++++++++++++++---
4e0e09
 src/include/efivar/efivar.h |  7 +++
4e0e09
 src/libefivar.map.in        |  1 +
4e0e09
 src/util.h                  | 26 +++++------
4e0e09
 4 files changed, 102 insertions(+), 20 deletions(-)
4e0e09
4e0e09
diff --git a/src/error.c b/src/error.c
4e0e09
index df03d7f45e0..5dc43197c50 100644
4e0e09
--- a/src/error.c
4e0e09
+++ b/src/error.c
4e0e09
@@ -26,6 +26,7 @@
4e0e09
 #include <stdlib.h>
4e0e09
 #include <stdio.h>
4e0e09
 #include <string.h>
4e0e09
+#include <sys/mman.h>
4e0e09
 #include <unistd.h>
4e0e09
 
4e0e09
 #include "efiboot.h"
4e0e09
@@ -162,7 +163,58 @@ efi_error_pop(void)
4e0e09
 	clear_error_entry(&error_table[current]);
4e0e09
 }
4e0e09
 
4e0e09
-void PUBLIC DESTRUCTOR
4e0e09
+static int efi_verbose;
4e0e09
+static FILE *efi_errlog, *efi_dbglog;
4e0e09
+static int efi_dbglog_fd = -1;
4e0e09
+static int stashed_log_level;
4e0e09
+static char efi_dbglog_buf[4096];
4e0e09
+
4e0e09
+void PUBLIC
4e0e09
+efi_stash_loglevel_(int level)
4e0e09
+{
4e0e09
+	stashed_log_level = level;
4e0e09
+}
4e0e09
+
4e0e09
+static ssize_t
4e0e09
+dbglog_write(void *cookie UNUSED, const char *buf, size_t size)
4e0e09
+{
4e0e09
+	FILE *log = efi_errlog ? efi_errlog : stderr;
4e0e09
+	ssize_t ret = size;
4e0e09
+
4e0e09
+	if (efi_get_verbose() >= stashed_log_level) {
4e0e09
+		ret = fwrite(buf, 1, size, log);
4e0e09
+	} else if (efi_dbglog_fd >= 0) {
4e0e09
+		lseek(efi_dbglog_fd, 0, SEEK_SET);
4e0e09
+		write(efi_dbglog_fd, buf, size);
4e0e09
+	}
4e0e09
+	return ret;
4e0e09
+}
4e0e09
+
4e0e09
+static int
4e0e09
+dbglog_seek(void *cookie UNUSED, off64_t *offset, int whence)
4e0e09
+{
4e0e09
+	FILE *log = efi_errlog ? efi_errlog : stderr;
4e0e09
+	return fseek(log, *offset, whence);
4e0e09
+}
4e0e09
+
4e0e09
+static int
4e0e09
+dbglog_close(void *cookie UNUSED)
4e0e09
+{
4e0e09
+	if (efi_dbglog_fd >= 0) {
4e0e09
+		close(efi_dbglog_fd);
4e0e09
+		efi_dbglog_fd = -1;
4e0e09
+	}
4e0e09
+	if (efi_errlog) {
4e0e09
+		int ret = fclose(efi_errlog);
4e0e09
+		efi_errlog = NULL;
4e0e09
+		return ret;
4e0e09
+	}
4e0e09
+
4e0e09
+	errno = EBADF;
4e0e09
+	return -1;
4e0e09
+}
4e0e09
+
4e0e09
+void PUBLIC
4e0e09
 efi_error_clear(void)
4e0e09
 {
4e0e09
 	if (error_table) {
4e0e09
@@ -177,15 +229,39 @@ efi_error_clear(void)
4e0e09
 	current = 0;
4e0e09
 }
4e0e09
 
4e0e09
-static int efi_verbose;
4e0e09
-static FILE *efi_errlog;
4e0e09
+void DESTRUCTOR
4e0e09
+efi_error_fini(void)
4e0e09
+{
4e0e09
+	efi_error_clear();
4e0e09
+	if (efi_dbglog) {
4e0e09
+		fclose(efi_dbglog);
4e0e09
+		efi_dbglog = NULL;
4e0e09
+	}
4e0e09
+}
4e0e09
+
4e0e09
+static void CONSTRUCTOR
4e0e09
+efi_error_init(void)
4e0e09
+{
4e0e09
+	cookie_io_functions_t io_funcs = {
4e0e09
+		.write = dbglog_write,
4e0e09
+		.seek = dbglog_seek,
4e0e09
+		.close = dbglog_close,
4e0e09
+	};
4e0e09
+
4e0e09
+	efi_dbglog_fd = memfd_create("efivar-debug.log", MFD_CLOEXEC);
4e0e09
+	if (efi_dbglog_fd == -1)
4e0e09
+		return;
4e0e09
+
4e0e09
+	efi_dbglog = fopencookie(NULL, "a", io_funcs);
4e0e09
+	if (efi_dbglog)
4e0e09
+		setvbuf(efi_dbglog, efi_dbglog_buf, _IOLBF,
4e0e09
+			sizeof(efi_dbglog_buf));
4e0e09
+}
4e0e09
 
4e0e09
 FILE PUBLIC *
4e0e09
 efi_get_logfile(void)
4e0e09
 {
4e0e09
-	if (efi_errlog)
4e0e09
-		return efi_errlog;
4e0e09
-	return stderr;
4e0e09
+	return efi_dbglog;
4e0e09
 }
4e0e09
 
4e0e09
 void PUBLIC
4e0e09
diff --git a/src/include/efivar/efivar.h b/src/include/efivar/efivar.h
4e0e09
index dabf41789e5..343d1c557da 100644
4e0e09
--- a/src/include/efivar/efivar.h
4e0e09
+++ b/src/include/efivar/efivar.h
4e0e09
@@ -188,6 +188,7 @@ extern int efi_error_set(const char *filename,
4e0e09
 			__attribute__((__format__ (printf, 5, 6)));
4e0e09
 extern void efi_error_clear(void);
4e0e09
 extern void efi_error_pop(void);
4e0e09
+extern void efi_stash_loglevel_(int level);
4e0e09
 #else
4e0e09
 static inline int
4e0e09
 __attribute__((__nonnull__ (2, 3, 4, 5, 6)))
4e0e09
@@ -225,6 +226,12 @@ efi_error_pop(void)
4e0e09
 {
4e0e09
 	return;
4e0e09
 }
4e0e09
+
4e0e09
+static inline void
4e0e09
+efi_stash_loglevel_(int level __attribute__((__unused__)))
4e0e09
+{
4e0e09
+	return;
4e0e09
+}
4e0e09
 #endif
4e0e09
 
4e0e09
 #define efi_error_real__(errval, file, function, line, fmt, args...) \
4e0e09
diff --git a/src/libefivar.map.in b/src/libefivar.map.in
4e0e09
index 8e50d574f10..8965b729917 100644
4e0e09
--- a/src/libefivar.map.in
4e0e09
+++ b/src/libefivar.map.in
4e0e09
@@ -133,4 +133,5 @@ LIBEFIVAR_1.37 {
4e0e09
 
4e0e09
 LIBEFIVAR_1.38 {
4e0e09
 	global: efi_error_pop;
4e0e09
+		efi_stash_loglevel_;
4e0e09
 } LIBEFIVAR_1.37;
4e0e09
diff --git a/src/util.h b/src/util.h
4e0e09
index a6a80e754ec..337762c9902 100644
4e0e09
--- a/src/util.h
4e0e09
+++ b/src/util.h
4e0e09
@@ -382,15 +382,14 @@ swizzle_guid_to_uuid(efi_guid_t *guid)
4e0e09
 
4e0e09
 #define log_(file, line, func, level, fmt, args...)                     \
4e0e09
         ({                                                              \
4e0e09
-                if (efi_get_verbose() >= level) {                       \
4e0e09
-                        FILE *logfile_ = efi_get_logfile();             \
4e0e09
-                        int len_ = strlen(fmt);                         \
4e0e09
-                        fprintf(logfile_, "%s:%d %s(): ",               \
4e0e09
-                                file, line, func);                      \
4e0e09
-                        fprintf(logfile_, fmt, ## args);                \
4e0e09
-                        if (!len_ || fmt[len_ - 1] != '\n')             \
4e0e09
-                                fprintf(logfile_, "\n");                \
4e0e09
-                }                                                       \
4e0e09
+                efi_stash_loglevel_(level);                             \
4e0e09
+                FILE *logfile_ = efi_get_logfile();                     \
4e0e09
+                int len_ = strlen(fmt);                                 \
4e0e09
+                fprintf(logfile_, "%s:%d %s(): ",                       \
4e0e09
+                        file, line, func);                              \
4e0e09
+                fprintf(logfile_, fmt, ## args);                        \
4e0e09
+                if (!len_ || fmt[len_ - 1] != '\n')                     \
4e0e09
+                        fprintf(logfile_, "\n");                        \
4e0e09
         })
4e0e09
 
4e0e09
 #define LOG_VERBOSE 0
4e0e09
@@ -402,11 +401,10 @@ swizzle_guid_to_uuid(efi_guid_t *guid)
4e0e09
 #define debug(fmt, args...) log(LOG_DEBUG, fmt, ## args)
4e0e09
 #define log_hex_(file, line, func, level, buf, size)                    \
4e0e09
         ({                                                              \
4e0e09
-                if (efi_get_verbose() >= level) {                       \
4e0e09
-                        fhexdumpf(efi_get_logfile(), "%s:%d %s(): ",    \
4e0e09
-                                  (uint8_t *)buf, size,                 \
4e0e09
-                                  file, line, func);                    \
4e0e09
-                }                                                       \
4e0e09
+                efi_stash_loglevel_(level);                             \
4e0e09
+                fhexdumpf(efi_get_logfile(), "%s:%d %s(): ",            \
4e0e09
+                          (uint8_t *)buf, size,                         \
4e0e09
+                          file, line, func);                            \
4e0e09
         })
4e0e09
 #define log_hex(level, buf, size) log_hex_(__FILE__, __LINE__, __func__, level, buf, size)
4e0e09
 #define debug_hex(buf, size) log_hex(LOG_DEBUG, buf, size)
4e0e09
-- 
4e0e09
2.26.2
4e0e09