diff --git a/plugins/synaptics-mst/fu-synaptics-mst-firmware.c b/plugins/synaptics-mst/fu-synaptics-mst-firmware.c index b0a4593fa..3d35f84cb 100644 --- a/plugins/synaptics-mst/fu-synaptics-mst-firmware.c +++ b/plugins/synaptics-mst/fu-synaptics-mst-firmware.c @@ -52,6 +52,29 @@ fu_synaptics_mst_firmware_parse (FuFirmware *firmware, return TRUE; } +static GBytes * +fu_synaptics_mst_firmware_write (FuFirmware *firmware, GError **error) +{ + g_autoptr(GByteArray) buf = g_byte_array_new (); + g_autoptr(GBytes) blob = NULL; + + /* assumed header */ + fu_byte_array_set_size (buf, ADDR_CUSTOMER_ID + sizeof(guint16)); + if (!fu_common_write_uint16_safe (buf->data, buf->len, ADDR_CUSTOMER_ID, + fu_firmware_get_idx (firmware), G_BIG_ENDIAN, + error)) + return NULL; + + /* payload */ + blob = fu_firmware_get_bytes (firmware, error); + if (blob == NULL) + return NULL; + fu_byte_array_append_bytes (buf, blob); + + /* success */ + return g_byte_array_free_to_bytes (g_steal_pointer (&buf)); +} + static void fu_synaptics_mst_firmware_init (FuSynapticsMstFirmware *self) { @@ -63,6 +86,7 @@ fu_synaptics_mst_firmware_class_init (FuSynapticsMstFirmwareClass *klass) FuFirmwareClass *klass_firmware = FU_FIRMWARE_CLASS (klass); klass_firmware->parse = fu_synaptics_mst_firmware_parse; klass_firmware->to_string = fu_synaptics_mst_firmware_to_string; + klass_firmware->write = fu_synaptics_mst_firmware_write; } FuFirmware * diff --git a/src/fuzzing/firmware/synaptics-mst.dat b/src/fuzzing/firmware/synaptics-mst.dat index 598bdd98e..1e96f3ffe 100644 Binary files a/src/fuzzing/firmware/synaptics-mst.dat and b/src/fuzzing/firmware/synaptics-mst.dat differ diff --git a/src/fuzzing/synaptics-mst.builder.xml b/src/fuzzing/synaptics-mst.builder.xml new file mode 100644 index 000000000..b4b15752a --- /dev/null +++ b/src/fuzzing/synaptics-mst.builder.xml @@ -0,0 +1,4 @@ + + 0x1234 + ZGF2ZQ== +