diff --git a/libfwupdplugin/fu-device.c b/libfwupdplugin/fu-device.c index 713b6706a..988fba705 100644 --- a/libfwupdplugin/fu-device.c +++ b/libfwupdplugin/fu-device.c @@ -4797,6 +4797,13 @@ fu_device_unbind_driver(FuDevice *self, GError **error) return klass->unbind_driver(self, error); } +static const gchar * +fu_device_instance_lookup(FuDevice *self, const gchar *key) +{ + FuDevicePrivate *priv = GET_PRIVATE(self); + return g_hash_table_lookup(priv->instance_hash, key); +} + /** * fu_device_incorporate: * @self: a #FuDevice @@ -4860,6 +4867,13 @@ fu_device_incorporate(FuDevice *self, FuDevice *donor) } g_rw_lock_reader_unlock(&priv_donor->metadata_mutex); + /* copy all instance ID keys if not already set */ + g_hash_table_iter_init(&iter, priv_donor->instance_hash); + while (g_hash_table_iter_next(&iter, &key, &value)) { + if (fu_device_instance_lookup(self, key) == NULL) + fu_device_add_instance_str(self, key, value); + } + /* now the base class, where all the interesting bits are */ fwupd_device_incorporate(FWUPD_DEVICE(self), FWUPD_DEVICE(donor)); @@ -5169,13 +5183,6 @@ fu_device_add_instance_u32(FuDevice *self, const gchar *key, guint32 value) g_hash_table_insert(priv->instance_hash, g_strdup(key), g_strdup_printf("%08X", value)); } -static const gchar * -fu_device_instance_lookup(FuDevice *self, const gchar *key) -{ - FuDevicePrivate *priv = GET_PRIVATE(self); - return g_hash_table_lookup(priv->instance_hash, key); -} - /** * fu_device_build_instance_id: * @self: a #FuDevice diff --git a/libfwupdplugin/fu-self-test.c b/libfwupdplugin/fu-self-test.c index 7691b91a8..671360f7f 100644 --- a/libfwupdplugin/fu-self-test.c +++ b/libfwupdplugin/fu-self-test.c @@ -1382,14 +1382,18 @@ fu_device_parent_func(void) static void fu_device_incorporate_func(void) { - g_autoptr(FuDevice) device = fu_device_new(NULL); - g_autoptr(FuDevice) donor = fu_device_new(NULL); + gboolean ret; + g_autoptr(FuContext) ctx = fu_context_new(); + g_autoptr(FuDevice) device = fu_device_new(ctx); + g_autoptr(FuDevice) donor = fu_device_new(ctx); + g_autoptr(GError) error = NULL; /* set up donor device */ fu_device_set_alternate_id(donor, "alt-id"); fu_device_set_equivalent_id(donor, "equiv-id"); fu_device_set_metadata(donor, "test", "me"); fu_device_set_metadata(donor, "test2", "me"); + fu_device_add_instance_str(donor, "VID", "1234"); /* base properties */ fu_device_add_flag(donor, FWUPD_DEVICE_FLAG_REQUIRE_AC); @@ -1412,6 +1416,10 @@ fu_device_incorporate_func(void) g_assert_cmpint(fu_device_get_created(device), ==, 123); g_assert_cmpint(fu_device_get_modified(device), ==, 789); g_assert_cmpint(fu_device_get_icons(device)->len, ==, 1); + ret = fu_device_build_instance_id(device, &error, "SUBSYS", "VID", NULL); + g_assert_no_error(error); + g_assert_true(ret); + g_assert_true(fu_device_has_instance_id(device, "SUBSYS\\VID_1234")); } static void