Blob Blame History Raw
From 90e5a58736645cdd37bf4c63f9a4056951dfb3f2 Mon Sep 17 00:00:00 2001
From: Richard Hughes <richard@hughsie.com>
Date: Tue, 24 Jan 2023 09:52:17 +0000
Subject: [PATCH] Do not make any of the HWIDs setup failures fatal

It's perfectly okay to have no HWIDs defined.

Should help with https://github.com/fwupd/fwupd/issues/5402
---
 libfwupdplugin/fu-context.c | 73 +++++++++++--------------------------
 1 file changed, 21 insertions(+), 52 deletions(-)

diff --git a/libfwupdplugin/fu-context.c b/libfwupdplugin/fu-context.c
index 08618b435..11b4b1b38 100644
--- a/libfwupdplugin/fu-context.c
+++ b/libfwupdplugin/fu-context.c
@@ -767,6 +767,8 @@ fu_context_security_changed(FuContext *self)
 	g_signal_emit(self, signals[SIGNAL_SECURITY_CHANGED], 0);
 }
 
+typedef gboolean (*FuContextHwidsSetupFunc)(FuContext *self, FuHwids *hwids, GError **error);
+
 /**
  * fu_context_load_hwinfo:
  * @self: a #FuContext
@@ -786,62 +788,29 @@ fu_context_load_hwinfo(FuContext *self, FuContextHwidFlags flags, GError **error
 	GPtrArray *guids;
 	g_autoptr(GError) error_hwids = NULL;
 	g_autoptr(GError) error_bios_settings = NULL;
+	struct {
+		const gchar *name;
+		FuContextHwidFlags flag;
+		FuContextHwidsSetupFunc func;
+	} hwids_setup_map[] = {{"config", FU_CONTEXT_HWID_FLAG_LOAD_CONFIG, fu_hwids_config_setup},
+			       {"smbios", FU_CONTEXT_HWID_FLAG_LOAD_SMBIOS, fu_hwids_smbios_setup},
+			       {"fdt", FU_CONTEXT_HWID_FLAG_LOAD_FDT, fu_hwids_fdt_setup},
+			       {"kenv", FU_CONTEXT_HWID_FLAG_LOAD_KENV, fu_hwids_kenv_setup},
+			       {"dmi", FU_CONTEXT_HWID_FLAG_LOAD_DMI, fu_hwids_dmi_setup},
+			       {NULL, FU_CONTEXT_HWID_FLAG_NONE, NULL}};
 
 	g_return_val_if_fail(FU_IS_CONTEXT(self), FALSE);
 	g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
 
-	if ((flags & FU_CONTEXT_HWID_FLAG_LOAD_CONFIG) > 0) {
-		g_autoptr(GError) error_local = NULL;
-		if (!fu_hwids_config_setup(self, priv->hwids, &error_local)) {
-			if (!g_error_matches(error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
-				g_propagate_prefixed_error(error,
-							   g_steal_pointer(&error_local),
-							   "Failed to load HWIDs config: ");
-				return FALSE;
-			}
-		}
-	}
-	if ((flags & FU_CONTEXT_HWID_FLAG_LOAD_DMI) > 0) {
-		g_autoptr(GError) error_local = NULL;
-		if (!fu_hwids_dmi_setup(self, priv->hwids, &error_local)) {
-			if (!g_error_matches(error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
-				g_propagate_prefixed_error(error,
-							   g_steal_pointer(&error_local),
-							   "Failed to load HWIDs DMI: ");
-				return FALSE;
-			}
-		}
-	}
-	if ((flags & FU_CONTEXT_HWID_FLAG_LOAD_FDT) > 0) {
-		g_autoptr(GError) error_local = NULL;
-		if (!fu_hwids_fdt_setup(self, priv->hwids, &error_local)) {
-			if (!g_error_matches(error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
-				g_propagate_prefixed_error(error,
-							   g_steal_pointer(&error_local),
-							   "Failed to load HWIDs FDT: ");
-				return FALSE;
-			}
-		}
-	}
-	if ((flags & FU_CONTEXT_HWID_FLAG_LOAD_KENV) > 0) {
-		g_autoptr(GError) error_local = NULL;
-		if (!fu_hwids_kenv_setup(self, priv->hwids, &error_local)) {
-			if (!g_error_matches(error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
-				g_propagate_prefixed_error(error,
-							   g_steal_pointer(&error_local),
-							   "Failed to load HWIDs kenv: ");
-				return FALSE;
-			}
-		}
-	}
-	if ((flags & FU_CONTEXT_HWID_FLAG_LOAD_SMBIOS) > 0) {
-		g_autoptr(GError) error_local = NULL;
-		if (!fu_hwids_smbios_setup(self, priv->hwids, &error_local)) {
-			if (!g_error_matches(error_local, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
-				g_propagate_prefixed_error(error,
-							   g_steal_pointer(&error_local),
-							   "Failed to load SMBIOS: ");
-				return FALSE;
+	/* run all the HWID setup funcs */
+	for (guint i = 0; hwids_setup_map[i].name != NULL; i++) {
+		if ((flags & hwids_setup_map[i].flag) > 0) {
+			g_autoptr(GError) error_local = NULL;
+			if (!hwids_setup_map[i].func(self, priv->hwids, &error_local)) {
+				g_debug("failed to load %s: %s",
+					hwids_setup_map[i].name,
+					error_local->message);
+				break;
 			}
 		}
 	}
-- 
2.39.1