From 95f7d23d58d1596e1e2f23090a8e49039272914a Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 1 Jul 2022 13:02:35 +0100 Subject: [PATCH] Fix FuCfuOffer XML roundtrip --- libfwupdplugin/fu-cfu-offer.c | 18 ++++++--- libfwupdplugin/fu-string.c | 45 ++++++++++++++++++++++ libfwupdplugin/fu-string.h | 2 + libfwupdplugin/fwupdplugin.map | 1 + libfwupdplugin/tests/cfu-offer.builder.xml | 4 +- 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/libfwupdplugin/fu-cfu-offer.c b/libfwupdplugin/fu-cfu-offer.c index eb4a17c2a..88780b336 100644 --- a/libfwupdplugin/fu-cfu-offer.c +++ b/libfwupdplugin/fu-cfu-offer.c @@ -12,6 +12,7 @@ #include "fu-cfu-offer.h" #include "fu-common.h" #include "fu-mem.h" +#include "fu-string.h" /** * FuCfuOffer: @@ -495,17 +496,22 @@ fu_cfu_offer_build(FuFirmware *firmware, XbNode *n, GError **error) FuCfuOffer *self = FU_CFU_OFFER(firmware); FuCfuOfferPrivate *priv = GET_PRIVATE(self); guint64 tmp; + const gchar *tmpb; /* optional properties */ tmp = xb_node_query_text_as_uint(n, "segment_number", NULL); if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8) priv->segment_number = tmp; - tmp = xb_node_query_text_as_uint(n, "force_immediate_reset", NULL); - if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8) - priv->force_immediate_reset = tmp; - tmp = xb_node_query_text_as_uint(n, "force_ignore_version", NULL); - if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8) - priv->force_ignore_version = tmp; + tmpb = xb_node_query_text(n, "force_immediate_reset", NULL); + if (tmpb != NULL) { + if (!fu_strtobool(tmpb, &priv->force_immediate_reset, error)) + return FALSE; + } + tmpb = xb_node_query_text(n, "force_ignore_version", NULL); + if (tmpb != NULL) { + if (!fu_strtobool(tmpb, &priv->force_ignore_version, error)) + return FALSE; + } tmp = xb_node_query_text_as_uint(n, "component_id", NULL); if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8) priv->component_id = tmp; diff --git a/libfwupdplugin/fu-string.c b/libfwupdplugin/fu-string.c index 8d318f69b..7e73a58e4 100644 --- a/libfwupdplugin/fu-string.c +++ b/libfwupdplugin/fu-string.c @@ -90,6 +90,51 @@ fu_strtoull(const gchar *str, guint64 *value, guint64 min, guint64 max, GError * return TRUE; } +/** + * fu_strtobool: + * @str: a string, e.g. `true` + * @value: (out) (nullable): parsed value + * @error: (nullable): optional return location for an error + * + * Converts a string value to a boolean. Only `true` and `false` are accepted values. + * + * Returns: %TRUE if the value was parsed correctly, or %FALSE for error + * + * Since: 1.8.2 + **/ +gboolean +fu_strtobool(const gchar *str, gboolean *value, GError **error) +{ + /* sanity check */ + if (str == NULL) { + g_set_error_literal(error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "cannot parse NULL"); + return FALSE; + } + + /* be super strict */ + if (g_strcmp0(str, "true") == 0) { + if (value != NULL) + *value = TRUE; + return TRUE; + } + if (g_strcmp0(str, "false") == 0) { + if (value != NULL) + *value = FALSE; + return TRUE; + } + + /* invalid */ + g_set_error(error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "cannot parse %s as boolean, expected true|false", + str); + return FALSE; +} + /** * fu_strstrip: * @str: a string, e.g. ` test ` diff --git a/libfwupdplugin/fu-string.h b/libfwupdplugin/fu-string.h index d4fc1e1c6..27eed8f34 100644 --- a/libfwupdplugin/fu-string.h +++ b/libfwupdplugin/fu-string.h @@ -23,6 +23,8 @@ gchar * fu_strsafe(const gchar *str, gsize maxsz); gboolean fu_strtoull(const gchar *str, guint64 *value, guint64 min, guint64 max, GError **error); +gboolean +fu_strtobool(const gchar *str, gboolean *value, GError **error); gchar * fu_strstrip(const gchar *str); gsize diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index 0299e8fb4..4952633ed 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -1002,6 +1002,7 @@ LIBFWUPDPLUGIN_1.8.2 { fu_strsplit; fu_strsplit_full; fu_strstrip; + fu_strtobool; fu_strtoull; fu_strwidth; fu_sum16; diff --git a/libfwupdplugin/tests/cfu-offer.builder.xml b/libfwupdplugin/tests/cfu-offer.builder.xml index 3a7a7ecc9..61e1d9a08 100644 --- a/libfwupdplugin/tests/cfu-offer.builder.xml +++ b/libfwupdplugin/tests/cfu-offer.builder.xml @@ -1,7 +1,7 @@ 0x42 - 1 - 1 + true + true 0xAB 0xCD 0x4567