mirror of
https://git.proxmox.com/git/fwupd
synced 2025-06-04 14:31:21 +00:00
Check the alignment when reading in raw firmware
This commit is contained in:
parent
2b81290829
commit
855ece352d
@ -743,6 +743,7 @@ fu_firmware_parse_full(FuFirmware *self,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
FuFirmwareClass *klass = FU_FIRMWARE_GET_CLASS(self);
|
FuFirmwareClass *klass = FU_FIRMWARE_GET_CLASS(self);
|
||||||
|
FuFirmwarePrivate *priv = GET_PRIVATE(self);
|
||||||
|
|
||||||
g_return_val_if_fail(FU_IS_FIRMWARE(self), FALSE);
|
g_return_val_if_fail(FU_IS_FIRMWARE(self), FALSE);
|
||||||
g_return_val_if_fail(fw != NULL, FALSE);
|
g_return_val_if_fail(fw != NULL, FALSE);
|
||||||
@ -776,6 +777,19 @@ fu_firmware_parse_full(FuFirmware *self,
|
|||||||
if (klass->parse != NULL)
|
if (klass->parse != NULL)
|
||||||
return klass->parse(self, fw, addr_start, addr_end, flags, error);
|
return klass->parse(self, fw, addr_start, addr_end, flags, error);
|
||||||
|
|
||||||
|
/* verify alignment */
|
||||||
|
if (g_bytes_get_size(fw) % (1ull << priv->alignment) != 0) {
|
||||||
|
g_autofree gchar *str = NULL;
|
||||||
|
str = g_format_size_full(1ull << priv->alignment, G_FORMAT_SIZE_IEC_UNITS);
|
||||||
|
g_set_error(error,
|
||||||
|
FWUPD_ERROR,
|
||||||
|
FWUPD_ERROR_INVALID_FILE,
|
||||||
|
"raw firmware is not aligned to 0x%x (%s)",
|
||||||
|
(guint)(1ull << priv->alignment),
|
||||||
|
str);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* just add entire blob */
|
/* just add entire blob */
|
||||||
fu_firmware_set_bytes(self, fw);
|
fu_firmware_set_bytes(self, fw);
|
||||||
fu_firmware_set_size(self, g_bytes_get_size(fw));
|
fu_firmware_set_size(self, g_bytes_get_size(fw));
|
||||||
@ -1603,6 +1617,7 @@ fu_firmware_export(FuFirmware *self, FuFirmwareExportFlags flags, XbBuilderNode
|
|||||||
fu_xmlb_builder_insert_kx(bn, "version_raw", priv->version_raw);
|
fu_xmlb_builder_insert_kx(bn, "version_raw", priv->version_raw);
|
||||||
fu_xmlb_builder_insert_kx(bn, "addr", priv->addr);
|
fu_xmlb_builder_insert_kx(bn, "addr", priv->addr);
|
||||||
fu_xmlb_builder_insert_kx(bn, "offset", priv->offset);
|
fu_xmlb_builder_insert_kx(bn, "offset", priv->offset);
|
||||||
|
fu_xmlb_builder_insert_kx(bn, "alignment", priv->alignment);
|
||||||
fu_xmlb_builder_insert_kx(bn, "size", priv->size);
|
fu_xmlb_builder_insert_kx(bn, "size", priv->size);
|
||||||
fu_xmlb_builder_insert_kv(bn, "filename", priv->filename);
|
fu_xmlb_builder_insert_kv(bn, "filename", priv->filename);
|
||||||
if (priv->bytes != NULL) {
|
if (priv->bytes != NULL) {
|
||||||
|
@ -2460,6 +2460,27 @@ fu_common_vercmp_func(void)
|
|||||||
G_MAXINT);
|
G_MAXINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fu_firmware_raw_aligned_func(void)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
g_autoptr(FuFirmware) firmware1 = fu_firmware_new();
|
||||||
|
g_autoptr(FuFirmware) firmware2 = fu_firmware_new();
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
g_autoptr(GBytes) blob = g_bytes_new_static("hello", 5);
|
||||||
|
|
||||||
|
/* no alignment */
|
||||||
|
ret = fu_firmware_parse(firmware1, blob, FWUPD_INSTALL_FLAG_NONE, &error);
|
||||||
|
g_assert_no_error(error);
|
||||||
|
g_assert_true(ret);
|
||||||
|
|
||||||
|
/* invalid alignment */
|
||||||
|
fu_firmware_set_alignment(firmware2, FU_FIRMWARE_ALIGNMENT_4K);
|
||||||
|
ret = fu_firmware_parse(firmware2, blob, FWUPD_INSTALL_FLAG_NONE, &error);
|
||||||
|
g_assert_error(error, FWUPD_ERROR, FWUPD_ERROR_INVALID_FILE);
|
||||||
|
g_assert_false(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fu_firmware_ihex_func(void)
|
fu_firmware_ihex_func(void)
|
||||||
{
|
{
|
||||||
@ -4022,6 +4043,7 @@ main(int argc, char **argv)
|
|||||||
g_test_add_func("/fwupd/firmware{common}", fu_firmware_common_func);
|
g_test_add_func("/fwupd/firmware{common}", fu_firmware_common_func);
|
||||||
g_test_add_func("/fwupd/firmware{dedupe}", fu_firmware_dedupe_func);
|
g_test_add_func("/fwupd/firmware{dedupe}", fu_firmware_dedupe_func);
|
||||||
g_test_add_func("/fwupd/firmware{build}", fu_firmware_build_func);
|
g_test_add_func("/fwupd/firmware{build}", fu_firmware_build_func);
|
||||||
|
g_test_add_func("/fwupd/firmware{raw-aligned}", fu_firmware_raw_aligned_func);
|
||||||
g_test_add_func("/fwupd/firmware{ihex}", fu_firmware_ihex_func);
|
g_test_add_func("/fwupd/firmware{ihex}", fu_firmware_ihex_func);
|
||||||
g_test_add_func("/fwupd/firmware{ihex-xml}", fu_firmware_ihex_xml_func);
|
g_test_add_func("/fwupd/firmware{ihex-xml}", fu_firmware_ihex_xml_func);
|
||||||
g_test_add_func("/fwupd/firmware{ihex-offset}", fu_firmware_ihex_offset_func);
|
g_test_add_func("/fwupd/firmware{ihex-offset}", fu_firmware_ihex_offset_func);
|
||||||
|
Loading…
Reference in New Issue
Block a user