mirror of
https://git.proxmox.com/git/fwupd
synced 2025-07-27 16:16:50 +00:00
trivial: Allow detecting unsupported version formats in _from_string()
This commit is contained in:
parent
3d280caf4a
commit
0b3e9fdb96
@ -43,7 +43,7 @@ fu_common_version_format_from_string (const gchar *str)
|
|||||||
return FU_VERSION_FORMAT_INTEL_ME;
|
return FU_VERSION_FORMAT_INTEL_ME;
|
||||||
if (g_strcmp0 (str, "pair") == 0)
|
if (g_strcmp0 (str, "pair") == 0)
|
||||||
return FU_VERSION_FORMAT_PAIR;
|
return FU_VERSION_FORMAT_PAIR;
|
||||||
return FU_VERSION_FORMAT_QUAD;
|
return FU_VERSION_FORMAT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -209,7 +209,7 @@ fu_engine_device_changed_cb (FuDeviceList *device_list, FuDevice *device, FuEngi
|
|||||||
|
|
||||||
/* convert hex and decimal versions to dotted style */
|
/* convert hex and decimal versions to dotted style */
|
||||||
static gchar *
|
static gchar *
|
||||||
fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel)
|
fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel, GError **error)
|
||||||
{
|
{
|
||||||
FuVersionFormat fmt = FU_VERSION_FORMAT_TRIPLET;
|
FuVersionFormat fmt = FU_VERSION_FORMAT_TRIPLET;
|
||||||
const gchar *version;
|
const gchar *version;
|
||||||
@ -218,8 +218,13 @@ fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel)
|
|||||||
|
|
||||||
/* get version */
|
/* get version */
|
||||||
version = xb_node_get_attr (rel, "version");
|
version = xb_node_get_attr (rel, "version");
|
||||||
if (version == NULL)
|
if (version == NULL) {
|
||||||
|
g_set_error_literal (error,
|
||||||
|
FWUPD_ERROR,
|
||||||
|
FWUPD_ERROR_NOT_SUPPORTED,
|
||||||
|
"version unset");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* already dotted notation */
|
/* already dotted notation */
|
||||||
if (g_strstr_len (version, -1, ".") != NULL)
|
if (g_strstr_len (version, -1, ".") != NULL)
|
||||||
@ -229,8 +234,17 @@ fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel)
|
|||||||
version_format = xb_node_query_text (component,
|
version_format = xb_node_query_text (component,
|
||||||
"custom/value[@key='LVFS::VersionFormat']",
|
"custom/value[@key='LVFS::VersionFormat']",
|
||||||
NULL);
|
NULL);
|
||||||
if (version_format != NULL)
|
if (version_format != NULL) {
|
||||||
fmt = fu_common_version_format_from_string (version_format);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* don't touch my version! */
|
/* don't touch my version! */
|
||||||
if (fmt == FU_VERSION_FORMAT_PLAIN)
|
if (fmt == FU_VERSION_FORMAT_PLAIN)
|
||||||
@ -245,11 +259,12 @@ fu_engine_get_release_version (FuEngine *self, XbNode *component, XbNode *rel)
|
|||||||
return fu_common_version_from_uint32 ((guint32) ver_uint32, fmt);
|
return fu_common_version_from_uint32 ((guint32) ver_uint32, fmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
fu_engine_set_release_from_appstream (FuEngine *self,
|
fu_engine_set_release_from_appstream (FuEngine *self,
|
||||||
FwupdRelease *rel,
|
FwupdRelease *rel,
|
||||||
XbNode *component,
|
XbNode *component,
|
||||||
XbNode *release)
|
XbNode *release,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
FwupdRemote *remote = NULL;
|
FwupdRemote *remote = NULL;
|
||||||
const gchar *tmp;
|
const gchar *tmp;
|
||||||
@ -280,8 +295,9 @@ fu_engine_set_release_from_appstream (FuEngine *self,
|
|||||||
fwupd_release_set_vendor (rel, tmp);
|
fwupd_release_set_vendor (rel, tmp);
|
||||||
|
|
||||||
/* the version is fixed up at runtime */
|
/* the version is fixed up at runtime */
|
||||||
version_rel = fu_engine_get_release_version (self, component, release);
|
version_rel = fu_engine_get_release_version (self, component, release, error);
|
||||||
if (version_rel != NULL)
|
if (version_rel == NULL)
|
||||||
|
return FALSE;
|
||||||
fwupd_release_set_version (rel, version_rel);
|
fwupd_release_set_version (rel, version_rel);
|
||||||
|
|
||||||
/* find the remote */
|
/* find the remote */
|
||||||
@ -354,6 +370,7 @@ fu_engine_set_release_from_appstream (FuEngine *self,
|
|||||||
tmp = xb_node_query_text (component, "custom/value[@key='LVFS::UpdateMessage']", NULL);
|
tmp = xb_node_query_text (component, "custom/value[@key='LVFS::UpdateMessage']", NULL);
|
||||||
if (tmp != NULL)
|
if (tmp != NULL)
|
||||||
fwupd_release_set_update_message (rel, tmp);
|
fwupd_release_set_update_message (rel, tmp);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finds the remote-id for the first firmware in the silo that matches this
|
/* finds the remote-id for the first firmware in the silo that matches this
|
||||||
@ -1496,7 +1513,11 @@ fu_engine_install (FuEngine *self,
|
|||||||
|
|
||||||
/* schedule this for the next reboot if not in system-update.target,
|
/* schedule this for the next reboot if not in system-update.target,
|
||||||
* but first check if allowed on battery power */
|
* but first check if allowed on battery power */
|
||||||
version_rel = fu_engine_get_release_version (self, component, rel);
|
version_rel = fu_engine_get_release_version (self, component, rel, error);
|
||||||
|
if (version_rel == NULL) {
|
||||||
|
g_prefix_error (error, "failed to get release version: ");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if ((self->app_flags & FU_APP_FLAGS_IS_OFFLINE) == 0 &&
|
if ((self->app_flags & FU_APP_FLAGS_IS_OFFLINE) == 0 &&
|
||||||
(flags & FWUPD_INSTALL_FLAG_OFFLINE) > 0) {
|
(flags & FWUPD_INSTALL_FLAG_OFFLINE) > 0) {
|
||||||
g_autoptr(FwupdRelease) release_tmp = NULL;
|
g_autoptr(FwupdRelease) release_tmp = NULL;
|
||||||
@ -2504,7 +2525,8 @@ fu_engine_get_result_from_component (FuEngine *self, XbNode *component, GError *
|
|||||||
}
|
}
|
||||||
rel = fwupd_release_new ();
|
rel = fwupd_release_new ();
|
||||||
fwupd_release_set_flags (rel, release_flags);
|
fwupd_release_set_flags (rel, release_flags);
|
||||||
fu_engine_set_release_from_appstream (self, rel, component, release);
|
if (!fu_engine_set_release_from_appstream (self, rel, component, release, error))
|
||||||
|
return NULL;
|
||||||
fwupd_device_add_release (dev, rel);
|
fwupd_device_add_release (dev, rel);
|
||||||
return g_steal_pointer (&dev);
|
return g_steal_pointer (&dev);
|
||||||
}
|
}
|
||||||
@ -2822,9 +2844,18 @@ fu_engine_add_releases_for_device_component (FuEngine *self,
|
|||||||
gint vercmp;
|
gint vercmp;
|
||||||
GPtrArray *checksums;
|
GPtrArray *checksums;
|
||||||
g_autoptr(FwupdRelease) rel = fwupd_release_new ();
|
g_autoptr(FwupdRelease) rel = fwupd_release_new ();
|
||||||
|
g_autoptr(GError) error_loop = NULL;
|
||||||
|
|
||||||
/* create new FwupdRelease for the XbNode */
|
/* create new FwupdRelease for the XbNode */
|
||||||
fu_engine_set_release_from_appstream (self, rel, component, release);
|
if (!fu_engine_set_release_from_appstream (self,
|
||||||
|
rel,
|
||||||
|
component,
|
||||||
|
release,
|
||||||
|
&error_loop)) {
|
||||||
|
g_warning ("failed to set release for component: %s",
|
||||||
|
error_loop->message);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* fall back to quirk-provided value */
|
/* fall back to quirk-provided value */
|
||||||
if (fwupd_release_get_install_duration (rel) == 0)
|
if (fwupd_release_get_install_duration (rel) == 0)
|
||||||
@ -3579,11 +3610,20 @@ fu_engine_add_device (FuEngine *self, FuDevice *device)
|
|||||||
NULL);
|
NULL);
|
||||||
if (release != NULL) {
|
if (release != NULL) {
|
||||||
g_autoptr(FwupdRelease) rel = fwupd_release_new ();
|
g_autoptr(FwupdRelease) rel = fwupd_release_new ();
|
||||||
fu_engine_set_release_from_appstream (self, rel, component, release);
|
g_autoptr(GError) error_local = NULL;
|
||||||
|
if (!fu_engine_set_release_from_appstream (self,
|
||||||
|
rel,
|
||||||
|
component,
|
||||||
|
release,
|
||||||
|
&error_local)) {
|
||||||
|
g_warning ("failed to set AppStream release: %s",
|
||||||
|
error_local->message);
|
||||||
|
} else {
|
||||||
fu_device_add_release (device, rel);
|
fu_device_add_release (device, rel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* adopt any required children, which may or may not already exist */
|
/* adopt any required children, which may or may not already exist */
|
||||||
fu_engine_adopt_children (self, device);
|
fu_engine_adopt_children (self, device);
|
||||||
|
Loading…
Reference in New Issue
Block a user