Blame SOURCES/0015-Add-efi_error_pop-and-pop-some-errors-sometimes.patch

b15ea1
From 2b34ea97db8e42e2461981d812dd5e71b12f09c1 Mon Sep 17 00:00:00 2001
b15ea1
From: Peter Jones <pjones@redhat.com>
b15ea1
Date: Tue, 28 May 2019 14:02:12 -0400
b15ea1
Subject: [PATCH 15/86] Add efi_error_pop() and pop some errors sometimes.
b15ea1
b15ea1
Signed-off-by: Peter Jones <pjones@redhat.com>
b15ea1
---
b15ea1
 src/error.c                 | 37 +++++++++++++++++++++++++++++--------
b15ea1
 src/include/efivar/efivar.h |  9 +++++++++
b15ea1
 src/libefivar.map.in        |  7 +++++++
b15ea1
 src/linux.c                 |  4 ++++
b15ea1
 4 files changed, 49 insertions(+), 8 deletions(-)
b15ea1
b15ea1
diff --git a/src/error.c b/src/error.c
b15ea1
index d1008a3d676..df03d7f45e0 100644
b15ea1
--- a/src/error.c
b15ea1
+++ b/src/error.c
b15ea1
@@ -78,6 +78,22 @@ efi_error_get(unsigned int n,
b15ea1
 	return 1;
b15ea1
 }
b15ea1
 
b15ea1
+static inline UNUSED void
b15ea1
+clear_error_entry(error_table_entry *et)
b15ea1
+{
b15ea1
+	if (!et)
b15ea1
+		return;
b15ea1
+
b15ea1
+	if (et->filename)
b15ea1
+		free(et->filename);
b15ea1
+	if (et->function)
b15ea1
+		free(et->function);
b15ea1
+	if (et->message)
b15ea1
+		free(et->message);
b15ea1
+
b15ea1
+	memset(et, '\0', sizeof(*et));
b15ea1
+}
b15ea1
+
b15ea1
 int PUBLIC NONNULL(1, 2, 5) PRINTF(5, 6)
b15ea1
 efi_error_set(const char *filename,
b15ea1
 	      const char *function,
b15ea1
@@ -136,6 +152,16 @@ err:
b15ea1
 	return -1;
b15ea1
 }
b15ea1
 
b15ea1
+void PUBLIC
b15ea1
+efi_error_pop(void)
b15ea1
+{
b15ea1
+	if (current <= 0)
b15ea1
+		return;
b15ea1
+
b15ea1
+	current -= 1;
b15ea1
+	clear_error_entry(&error_table[current]);
b15ea1
+}
b15ea1
+
b15ea1
 void PUBLIC DESTRUCTOR
b15ea1
 efi_error_clear(void)
b15ea1
 {
b15ea1
@@ -143,14 +169,7 @@ efi_error_clear(void)
b15ea1
 		for (unsigned int i = 0; i < current; i++) {
b15ea1
 			error_table_entry *et = &error_table[i];
b15ea1
 
b15ea1
-			if (et->filename)
b15ea1
-				free(et->filename);
b15ea1
-			if (et->function)
b15ea1
-				free(et->function);
b15ea1
-			if (et->message)
b15ea1
-				free(et->message);
b15ea1
-
b15ea1
-			memset(et, '\0', sizeof(*et));
b15ea1
+			clear_error_entry(et);
b15ea1
 		}
b15ea1
 		free(error_table);
b15ea1
 	}
b15ea1
@@ -182,3 +201,5 @@ efi_get_verbose(void)
b15ea1
 {
b15ea1
 	return efi_verbose;
b15ea1
 }
b15ea1
+
b15ea1
+// vim:fenc=utf-8:tw=75:noet
b15ea1
diff --git a/src/include/efivar/efivar.h b/src/include/efivar/efivar.h
b15ea1
index ad6449d9d93..dabf41789e5 100644
b15ea1
--- a/src/include/efivar/efivar.h
b15ea1
+++ b/src/include/efivar/efivar.h
b15ea1
@@ -187,6 +187,7 @@ extern int efi_error_set(const char *filename,
b15ea1
 			__attribute__((__nonnull__ (1, 2, 5)))
b15ea1
 			__attribute__((__format__ (printf, 5, 6)));
b15ea1
 extern void efi_error_clear(void);
b15ea1
+extern void efi_error_pop(void);
b15ea1
 #else
b15ea1
 static inline int
b15ea1
 __attribute__((__nonnull__ (2, 3, 4, 5, 6)))
b15ea1
@@ -218,6 +219,12 @@ efi_error_clear(void)
b15ea1
 {
b15ea1
 	return;
b15ea1
 }
b15ea1
+
b15ea1
+static inline void
b15ea1
+efi_error_pop(void)
b15ea1
+{
b15ea1
+	return;
b15ea1
+}
b15ea1
 #endif
b15ea1
 
b15ea1
 #define efi_error_real__(errval, file, function, line, fmt, args...) \
b15ea1
@@ -238,3 +245,5 @@ extern FILE * efi_get_logfile(void)
b15ea1
 #include <efivar/efivar-dp.h>
b15ea1
 
b15ea1
 #endif /* EFIVAR_H */
b15ea1
+
b15ea1
+// vim:fenc=utf-8:tw=75:noet
b15ea1
diff --git a/src/libefivar.map.in b/src/libefivar.map.in
b15ea1
index b5ee1ce334a..8e50d574f10 100644
b15ea1
--- a/src/libefivar.map.in
b15ea1
+++ b/src/libefivar.map.in
b15ea1
@@ -127,3 +127,10 @@ LIBEFIVAR_1.36 {
b15ea1
 		efi_get_verbose;
b15ea1
 		efi_get_logfile;
b15ea1
 } LIBEFIVAR_1.35;
b15ea1
+
b15ea1
+LIBEFIVAR_1.37 {
b15ea1
+} LIBEFIVAR_1.36;
b15ea1
+
b15ea1
+LIBEFIVAR_1.38 {
b15ea1
+	global: efi_error_pop;
b15ea1
+} LIBEFIVAR_1.37;
b15ea1
diff --git a/src/linux.c b/src/linux.c
b15ea1
index 4bb453be834..4e102da5e24 100644
b15ea1
--- a/src/linux.c
b15ea1
+++ b/src/linux.c
b15ea1
@@ -405,6 +405,8 @@ struct device HIDDEN
b15ea1
                                 rc = sysfs_readlink(&tmpbuf,
b15ea1
                                                     "block/%s/device/device/driver",
b15ea1
                                                     dev->disk_name);
b15ea1
+                                if (rc >= 0 && tmpbuf)
b15ea1
+                                        efi_error_pop();
b15ea1
                         }
b15ea1
                         if (rc < 0 || !tmpbuf) {
b15ea1
                                 efi_error("readlink of /sys/block/%s/device/driver failed",
b15ea1
@@ -626,3 +628,5 @@ get_sector_size(int filedes)
b15ea1
                 sector_size = 512;
b15ea1
         return sector_size;
b15ea1
 }
b15ea1
+
b15ea1
+// vim:fenc=utf-8:tw=75:et
b15ea1
-- 
b15ea1
2.24.1
b15ea1