From 2c40b3734fb46e8541cc02cebf9c3bba109e360c Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 17 Apr 2019 13:41:47 +0100 Subject: [PATCH] Use the device version format when converting the release version This is arguably the more correct fix, regardless of the UEFI quirk use as each release was reading and converting the exact same property from the component. Fixes https://github.com/hughsie/fwupd/issues/1156 --- src/fu-engine.c | 33 +++++++++++++++------------------ src/fu-self-test.c | 1 + 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/fu-engine.c b/src/fu-engine.c index d80d3d04d..1a1d0a0d7 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -263,11 +263,10 @@ fu_engine_set_device_version_format (FuEngine *self, FuDevice *device, XbNode *c /* convert hex and decimal versions to dotted style */ static gchar * -fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel, GError **error) +fu_engine_get_release_version (FuEngine *self, FuDevice *dev, XbNode *rel, GError **error) { FuVersionFormat fmt = FU_VERSION_FORMAT_TRIPLET; const gchar *version; - const gchar *version_format; guint64 ver_uint32; /* get version */ @@ -284,20 +283,15 @@ fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel, G if (g_strstr_len (version, -1, ".") != NULL) return g_strdup (version); - /* specified in metadata */ - version_format = xb_node_query_text (component, - "custom/value[@key='LVFS::VersionFormat']", - NULL); - if (version_format != NULL) { - fmt = fu_common_version_format_from_string (version_format); - if (fmt == FU_VERSION_FORMAT_UNKNOWN) { - g_set_error (error, - FWUPD_ERROR, - FWUPD_ERROR_NOT_SUPPORTED, - "version format %s unsupported", - version_format); - return NULL; - } + /* specified in metadata or from a quirk */ + fmt = fu_device_get_version_format (dev); + if (fmt == FU_VERSION_FORMAT_UNKNOWN) { + g_set_error (error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "version format unset and version %s ambiguous", + version); + return NULL; } /* don't touch my version! */ @@ -315,6 +309,7 @@ fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel, G static gboolean fu_engine_set_release_from_appstream (FuEngine *self, + FuDevice *dev, FwupdRelease *rel, XbNode *component, XbNode *release, @@ -349,7 +344,7 @@ fu_engine_set_release_from_appstream (FuEngine *self, fwupd_release_set_vendor (rel, tmp); /* the version is fixed up at runtime */ - version_rel = fu_engine_get_release_version (self, component, release, error); + version_rel = fu_engine_get_release_version (self, dev, release, error); if (version_rel == NULL) return FALSE; fwupd_release_set_version (rel, version_rel); @@ -1567,7 +1562,7 @@ fu_engine_install (FuEngine *self, /* schedule this for the next reboot if not in system-update.target, * but first check if allowed on battery power */ - version_rel = fu_engine_get_release_version (self, component, rel, error); + version_rel = fu_engine_get_release_version (self, device, rel, error); if (version_rel == NULL) { g_prefix_error (error, "failed to get release version: "); return FALSE; @@ -2914,6 +2909,7 @@ fu_engine_add_releases_for_device_component (FuEngine *self, /* create new FwupdRelease for the XbNode */ if (!fu_engine_set_release_from_appstream (self, + device, rel, component, release, @@ -3678,6 +3674,7 @@ fu_engine_add_device (FuEngine *self, FuDevice *device) g_autoptr(FwupdRelease) rel = fwupd_release_new (); g_autoptr(GError) error_local = NULL; if (!fu_engine_set_release_from_appstream (self, + device, rel, component, release, diff --git a/src/fu-self-test.c b/src/fu-self-test.c index 39fef5d50..f91ef21d0 100644 --- a/src/fu-self-test.c +++ b/src/fu-self-test.c @@ -739,6 +739,7 @@ fu_engine_device_unlock_func (void) fu_device_set_id (device, "UEFI-dummy-dev0"); fu_device_add_guid (device, "2d47f29b-83a2-4f31-a2e8-63474f4d4c2e"); fu_device_add_flag (device, FWUPD_DEVICE_FLAG_LOCKED); + fu_device_set_version_format (device, FU_VERSION_FORMAT_PLAIN); fu_engine_add_device (engine, device); /* ensure the metainfo was matched */