diff --git a/plugins/uefi/fu-plugin-uefi.c b/plugins/uefi/fu-plugin-uefi.c index c9ec9cf6e..8bf396f66 100644 --- a/plugins/uefi/fu-plugin-uefi.c +++ b/plugins/uefi/fu-plugin-uefi.c @@ -726,7 +726,12 @@ fu_plugin_coldplug (FuPlugin *plugin, GError **error) /* add each device */ for (guint i = 0; i < entries->len; i++) { const gchar *path = g_ptr_array_index (entries, i); - g_autoptr(FuUefiDevice) dev = fu_uefi_device_new_from_entry (path); + g_autoptr(GError) error_parse = NULL; + g_autoptr(FuUefiDevice) dev = fu_uefi_device_new_from_entry (path, &error_parse); + if (dev == NULL) { + g_warning ("failed to add %s: %s", path, error_parse->message); + continue; + } fu_device_set_quirks (FU_DEVICE (dev), fu_plugin_get_quirks (plugin)); if (!fu_plugin_uefi_coldplug_device (plugin, dev, error)) return FALSE; diff --git a/plugins/uefi/fu-self-test.c b/plugins/uefi/fu-self-test.c index 6f6a0d8f5..bd9c72bb3 100644 --- a/plugins/uefi/fu-self-test.c +++ b/plugins/uefi/fu-self-test.c @@ -85,11 +85,13 @@ fu_uefi_device_func (void) { g_autofree gchar *fn = NULL; g_autoptr(FuUefiDevice) dev = NULL; + g_autoptr(GError) error = NULL; fn = fu_test_get_filename (TESTDATADIR, "efi/esrt/entries/entry0"); g_assert (fn != NULL); - dev = fu_uefi_device_new_from_entry (fn); + dev = fu_uefi_device_new_from_entry (fn, &error); g_assert_nonnull (dev); + g_assert_no_error (error); g_assert_cmpint (fu_uefi_device_get_kind (dev), ==, FU_UEFI_DEVICE_KIND_SYSTEM_FIRMWARE); g_assert_cmpstr (fu_uefi_device_get_guid (dev), ==, "ddc0ee61-e7f0-4e7d-acc5-c070a398838e"); @@ -184,7 +186,12 @@ fu_uefi_plugin_func (void) devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); for (guint i = 0; i < entries->len; i++) { const gchar *path = g_ptr_array_index (entries, i); - g_autoptr(FuUefiDevice) dev_tmp = fu_uefi_device_new_from_entry (path); + g_autoptr(GError) error_local = NULL; + g_autoptr(FuUefiDevice) dev_tmp = fu_uefi_device_new_from_entry (path, &error_local); + if (dev_tmp == NULL) { + g_debug ("failed to add %s: %s", path, error_local->message); + continue; + } g_ptr_array_add (devices, g_object_ref (dev_tmp)); } g_assert_cmpint (devices->len, ==, 2); @@ -220,7 +227,8 @@ fu_uefi_update_info_func (void) fn = fu_test_get_filename (TESTDATADIR, "efi/esrt/entries/entry0"); g_assert (fn != NULL); - dev = fu_uefi_device_new_from_entry (fn); + dev = fu_uefi_device_new_from_entry (fn, &error); + g_assert_no_error (error); g_assert_nonnull (dev); g_assert_cmpint (fu_uefi_device_get_kind (dev), ==, FU_UEFI_DEVICE_KIND_SYSTEM_FIRMWARE); g_assert_cmpstr (fu_uefi_device_get_guid (dev), ==, "ddc0ee61-e7f0-4e7d-acc5-c070a398838e"); diff --git a/plugins/uefi/fu-uefi-device.c b/plugins/uefi/fu-uefi-device.c index 8073c2df9..2e6c22805 100644 --- a/plugins/uefi/fu-uefi-device.c +++ b/plugins/uefi/fu-uefi-device.c @@ -449,9 +449,9 @@ fu_uefi_device_class_init (FuUefiDeviceClass *klass) } FuUefiDevice * -fu_uefi_device_new_from_entry (const gchar *entry_path) +fu_uefi_device_new_from_entry (const gchar *entry_path, GError **error) { - FuUefiDevice *self; + g_autoptr(FuUefiDevice) self = NULL; g_autofree gchar *fw_class_fn = NULL; g_autofree gchar *id = NULL; @@ -481,7 +481,16 @@ fu_uefi_device_new_from_entry (const gchar *entry_path) self->fw_class, self->fmp_hardware_instance); fu_device_set_id (FU_DEVICE (self), id); - return self; + /* this is invalid */ + if (!fu_common_guid_is_valid (self->fw_class)) { + g_set_error (error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "ESRT GUID '%s' was not valid", self->fw_class); + return NULL; + } + + return g_steal_pointer (&self); } FuUefiDevice * diff --git a/plugins/uefi/fu-uefi-device.h b/plugins/uefi/fu-uefi-device.h index 0bb2d6cfc..f2df02a90 100644 --- a/plugins/uefi/fu-uefi-device.h +++ b/plugins/uefi/fu-uefi-device.h @@ -40,7 +40,8 @@ typedef enum { } FuUefiDeviceStatus; FuUefiDevice *fu_uefi_device_new_from_guid (const gchar *guid); -FuUefiDevice *fu_uefi_device_new_from_entry (const gchar *entry_path); +FuUefiDevice *fu_uefi_device_new_from_entry (const gchar *entry_path, + GError **error); FuUefiDevice *fu_uefi_device_new_from_dev (FuDevice *dev); gboolean fu_uefi_device_clear_status (FuUefiDevice *self, GError **error); diff --git a/plugins/uefi/fu-uefi-tool.c b/plugins/uefi/fu-uefi-tool.c index 74a37c123..94ab5f2e5 100644 --- a/plugins/uefi/fu-uefi-tool.c +++ b/plugins/uefi/fu-uefi-tool.c @@ -216,7 +216,13 @@ main (int argc, char *argv[]) devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); for (guint i = 0; i < entries->len; i++) { const gchar *path = g_ptr_array_index (entries, i); - g_autoptr(FuUefiDevice) dev = fu_uefi_device_new_from_entry (path); + g_autoptr(GError) error_parse = NULL; + g_autoptr(FuUefiDevice) dev = fu_uefi_device_new_from_entry (path, &error_parse); + if (dev == NULL) { + g_warning ("failed to parse %s: %s", + path, error_parse->message); + continue; + } fu_device_set_metadata (FU_DEVICE (dev), "EspPath", esp_path); g_ptr_array_add (devices, g_object_ref (dev)); } diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/capsule_flags b/plugins/uefi/tests/efi/esrt/entries/entry2/capsule_flags new file mode 120000 index 000000000..24b0ea1b5 --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/capsule_flags @@ -0,0 +1 @@ +../entry1/capsule_flags \ No newline at end of file diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/fw_class b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_class new file mode 100644 index 000000000..44964b11f --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_class @@ -0,0 +1 @@ +00000000-0000-0000-0000-000000000000 diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/fw_type b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_type new file mode 120000 index 000000000..d7a6438a2 --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_type @@ -0,0 +1 @@ +../entry1/fw_type \ No newline at end of file diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/fw_version b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_version new file mode 120000 index 000000000..3d6ce82dc --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/fw_version @@ -0,0 +1 @@ +../entry1/fw_version \ No newline at end of file diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_status b/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_status new file mode 120000 index 000000000..d8d4cb389 --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_status @@ -0,0 +1 @@ +../entry1/last_attempt_status \ No newline at end of file diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_version b/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_version new file mode 120000 index 000000000..639dcb185 --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/last_attempt_version @@ -0,0 +1 @@ +../entry1/last_attempt_version \ No newline at end of file diff --git a/plugins/uefi/tests/efi/esrt/entries/entry2/lowest_supported_fw_version b/plugins/uefi/tests/efi/esrt/entries/entry2/lowest_supported_fw_version new file mode 120000 index 000000000..9b389118c --- /dev/null +++ b/plugins/uefi/tests/efi/esrt/entries/entry2/lowest_supported_fw_version @@ -0,0 +1 @@ +../entry1/lowest_supported_fw_version \ No newline at end of file