ccgx: Fix division by zero for invalid firmware

This commit is contained in:
Richard Hughes 2021-02-12 13:27:31 +00:00
parent 17c0a6c239
commit 6a33d2d99e

View File

@ -139,6 +139,17 @@ fu_ccgx_firmware_add_record (FuCcgxFirmware *self, const gchar *line, GError **e
return TRUE; return TRUE;
} }
static guint8
fu_ccgx_firmware_record_calc_checksum (FuCcgxFirmwareRecord *rcd)
{
guint8 csum = 0x0;
gsize bufsz = 0;
const guint8 *buf = g_bytes_get_data (rcd->data, &bufsz);
for (gsize j = 0; j < bufsz; j++)
csum += buf[j];
return csum;
}
static gboolean static gboolean
fu_ccgx_firmware_parse_md_block (FuCcgxFirmware *self, FuFirmwareImage *img, GError **error) fu_ccgx_firmware_parse_md_block (FuCcgxFirmware *self, FuFirmwareImage *img, GError **error)
{ {
@ -198,10 +209,8 @@ fu_ccgx_firmware_parse_md_block (FuCcgxFirmware *self, FuFirmwareImage *img, GEr
} }
for (guint i = 0; i < self->records->len - 1; i++) { for (guint i = 0; i < self->records->len - 1; i++) {
rcd = g_ptr_array_index (self->records, i); rcd = g_ptr_array_index (self->records, i);
buf = g_bytes_get_data (rcd->data, &bufsz); checksum_calc += fu_ccgx_firmware_record_calc_checksum (rcd);
fw_size += bufsz; fw_size += g_bytes_get_size (rcd->data);
for (gsize j = 0; j < bufsz; j++)
checksum_calc += buf[j];
} }
if (fw_size != metadata.fw_size) { if (fw_size != metadata.fw_size) {
g_set_error (error, g_set_error (error,