mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-14 16:11:22 +00:00
Use the correct firmware blob when installing a composite device update
This commit is contained in:
parent
fe5cc9021c
commit
a4a2c18ac8
@ -464,8 +464,8 @@ typedef struct {
|
|||||||
AsStore *store;
|
AsStore *store;
|
||||||
FwupdTrustFlags trust_flags;
|
FwupdTrustFlags trust_flags;
|
||||||
GPtrArray *devices; /* of FuDevice */
|
GPtrArray *devices; /* of FuDevice */
|
||||||
|
GPtrArray *blob_fws; /* of GBytes */
|
||||||
FwupdInstallFlags flags;
|
FwupdInstallFlags flags;
|
||||||
GBytes *blob_fw;
|
|
||||||
GBytes *blob_cab;
|
GBytes *blob_cab;
|
||||||
gboolean is_downgrade;
|
gboolean is_downgrade;
|
||||||
FuMainAuthKind auth_kind;
|
FuMainAuthKind auth_kind;
|
||||||
@ -481,8 +481,8 @@ fu_main_helper_free (FuMainAuthHelper *helper)
|
|||||||
/* free */
|
/* free */
|
||||||
if (helper->devices != NULL)
|
if (helper->devices != NULL)
|
||||||
g_ptr_array_unref (helper->devices);
|
g_ptr_array_unref (helper->devices);
|
||||||
if (helper->blob_fw > 0)
|
if (helper->blob_fws > 0)
|
||||||
g_bytes_unref (helper->blob_fw);
|
g_ptr_array_unref (helper->blob_fws);
|
||||||
if (helper->blob_cab > 0)
|
if (helper->blob_cab > 0)
|
||||||
g_bytes_unref (helper->blob_cab);
|
g_bytes_unref (helper->blob_cab);
|
||||||
if (helper->store != NULL)
|
if (helper->store != NULL)
|
||||||
@ -601,6 +601,7 @@ fu_main_provider_update_authenticated (FuMainAuthHelper *helper, GError **error)
|
|||||||
/* run the correct providers for each device */
|
/* run the correct providers for each device */
|
||||||
for (i = 0; i < helper->devices->len; i ++) {
|
for (i = 0; i < helper->devices->len; i ++) {
|
||||||
FuDevice *device = g_ptr_array_index (helper->devices, i);
|
FuDevice *device = g_ptr_array_index (helper->devices, i);
|
||||||
|
GBytes *blob_fw = g_ptr_array_index (helper->blob_fws, i);
|
||||||
item = fu_main_get_item_by_id (helper->priv,
|
item = fu_main_get_item_by_id (helper->priv,
|
||||||
fu_device_get_id (device));
|
fu_device_get_id (device));
|
||||||
plugin = fu_main_get_plugin_for_device (helper->priv->plugins,
|
plugin = fu_main_get_plugin_for_device (helper->priv->plugins,
|
||||||
@ -608,7 +609,7 @@ fu_main_provider_update_authenticated (FuMainAuthHelper *helper, GError **error)
|
|||||||
if (!fu_provider_update (item->provider,
|
if (!fu_provider_update (item->provider,
|
||||||
item->device,
|
item->device,
|
||||||
helper->blob_cab,
|
helper->blob_cab,
|
||||||
helper->blob_fw,
|
blob_fw,
|
||||||
plugin,
|
plugin,
|
||||||
helper->flags,
|
helper->flags,
|
||||||
error))
|
error))
|
||||||
@ -828,6 +829,7 @@ fu_main_update_helper (FuMainAuthHelper *helper, GError **error)
|
|||||||
/* find an application from the cabinet 'store' for the device */
|
/* find an application from the cabinet 'store' for the device */
|
||||||
for (i = 0; i < helper->devices->len; i ++) {
|
for (i = 0; i < helper->devices->len; i ++) {
|
||||||
gboolean is_downgrade;
|
gboolean is_downgrade;
|
||||||
|
GBytes *blob_fw;
|
||||||
FuDevice *device = g_ptr_array_index (helper->devices, i);
|
FuDevice *device = g_ptr_array_index (helper->devices, i);
|
||||||
app = fu_main_store_get_app_by_guids (helper->store, device);
|
app = fu_main_store_get_app_by_guids (helper->store, device);
|
||||||
if (app == NULL) {
|
if (app == NULL) {
|
||||||
@ -862,16 +864,16 @@ fu_main_update_helper (FuMainAuthHelper *helper, GError **error)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: this assumes all devices use the same blob */
|
/* not all devices have to use the same blob */
|
||||||
if (helper->blob_fw == NULL)
|
blob_fw = as_release_get_blob (rel, tmp);
|
||||||
helper->blob_fw = as_release_get_blob (rel, tmp);
|
if (blob_fw == NULL) {
|
||||||
if (helper->blob_fw == NULL) {
|
|
||||||
g_set_error_literal (error,
|
g_set_error_literal (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_READ,
|
FWUPD_ERROR_READ,
|
||||||
"failed to get firmware blob");
|
"failed to get firmware blob");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
g_ptr_array_add (helper->blob_fws, g_bytes_ref (blob_fw));
|
||||||
|
|
||||||
/* possibly convert the version from 0x to dotted */
|
/* possibly convert the version from 0x to dotted */
|
||||||
fu_main_vendor_quirk_release_version (app);
|
fu_main_vendor_quirk_release_version (app);
|
||||||
@ -938,6 +940,17 @@ fu_main_update_helper (FuMainAuthHelper *helper, GError **error)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
if (helper->devices->len != helper->blob_fws->len) {
|
||||||
|
g_set_error (error,
|
||||||
|
FWUPD_ERROR,
|
||||||
|
FWUPD_ERROR_INTERNAL,
|
||||||
|
"not enough firmware blobs (%i) for devices (%i)",
|
||||||
|
helper->blob_fws->len,
|
||||||
|
helper->devices->len);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1939,6 +1952,7 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender,
|
|||||||
helper->priv = priv;
|
helper->priv = priv;
|
||||||
helper->store = as_store_new ();
|
helper->store = as_store_new ();
|
||||||
helper->devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
helper->devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||||
|
helper->blob_fws = g_ptr_array_new_with_free_func ((GDestroyNotify) g_bytes_unref);
|
||||||
if (item != NULL)
|
if (item != NULL)
|
||||||
g_ptr_array_add (helper->devices, g_object_ref (item->device));
|
g_ptr_array_add (helper->devices, g_object_ref (item->device));
|
||||||
if (!fu_main_update_helper (helper, &error)) {
|
if (!fu_main_update_helper (helper, &error)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user