diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c index 39e415bd..1d8ea0b9 100644 --- a/libfprint/drivers/goodixmoc/goodix.c +++ b/libfprint/drivers/goodixmoc/goodix.c @@ -157,8 +157,7 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - reader.data = transfer->buffer; - reader.size = transfer->actual_length; + fpi_byte_reader_init (&reader, transfer->buffer, transfer->actual_length); if (gx_proto_parse_header (&reader, &header) != 0) { @@ -168,7 +167,8 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - if (!fpi_byte_reader_set_pos (&reader, PACKAGE_HEADER_SIZE + header.len)) + if (header.len < PACKAGE_CRC_SIZE || + !fpi_byte_reader_set_pos (&reader, PACKAGE_HEADER_SIZE + header.len - PACKAGE_CRC_SIZE)) { fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, @@ -176,7 +176,13 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - gx_proto_crc32_calc (transfer->buffer, PACKAGE_HEADER_SIZE + header.len, (uint8_t *) &crc32_calc); + /* Exclude the CRC from the package length */ + header.len -= PACKAGE_CRC_SIZE; + + /* The reader is positioned right at the CRC, i.e. at the end of the data the + * CRC is computed over, so use its position as the length. */ + gx_proto_crc32_calc (transfer->buffer, fpi_byte_reader_get_pos (&reader), + (uint8_t *) &crc32_calc); if (!fpi_byte_reader_get_uint32_le (&reader, &crc32) || GUINT32_FROM_LE (crc32_calc) != crc32) @@ -189,9 +195,7 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, cmd = MAKE_CMD_EX (header.cmd0, header.cmd1); - fpi_byte_reader_set_pos (&reader, 0); - reader.data = &transfer->buffer[PACKAGE_HEADER_SIZE]; - reader.size = header.len; + fpi_byte_reader_init (&reader, &transfer->buffer[PACKAGE_HEADER_SIZE], header.len); if (gx_proto_parse_body (cmd, &reader, &cmd_reponse) != 0) { diff --git a/libfprint/drivers/goodixmoc/goodix_proto.c b/libfprint/drivers/goodixmoc/goodix_proto.c index f191ec1b..30dc8de3 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.c +++ b/libfprint/drivers/goodixmoc/goodix_proto.c @@ -253,11 +253,6 @@ gx_proto_parse_header (FpiByteReader *reader, if (!fpi_byte_reader_get_uint8 (reader, &pheader->rev_crc8)) g_return_val_if_reached (-1); - if (pheader->len < PACKAGE_CRC_SIZE) - return -1; - - pheader->len -= PACKAGE_CRC_SIZE; - return 0; } @@ -266,7 +261,6 @@ gx_proto_parse_fingerid (FpiByteReader *reader, ptemplate_format_t template) { uint8_t byte; - const uint8_t *buffer; if (!template) return -1; @@ -283,16 +277,12 @@ gx_proto_parse_fingerid (FpiByteReader *reader, if (!fpi_byte_reader_skip (reader, 1)) g_return_val_if_reached (-1); - if (!fpi_byte_reader_get_data (reader, sizeof (template->accountid), &buffer)) + if (!fpi_byte_reader_get_data_static (reader, template->accountid)) g_return_val_if_reached (-1); - memcpy (template->accountid, buffer, sizeof (template->accountid)); - - if (!fpi_byte_reader_get_data (reader, sizeof (template->tid), &buffer)) + if (!fpi_byte_reader_get_data_static (reader, template->tid)) g_return_val_if_reached (-1); - memcpy (template->tid, buffer, sizeof (template->tid)); - if (!fpi_byte_reader_get_uint8 (reader, &template->payload.size)) g_return_val_if_reached (-1); @@ -302,11 +292,10 @@ gx_proto_parse_fingerid (FpiByteReader *reader, return -1; } - if (!fpi_byte_reader_get_data (reader, template->payload.size, &buffer)) + if (!(fpi_byte_reader_get_data_static) (reader, template->payload.size, + template->payload.data)) g_return_val_if_reached (-1); - memcpy (template->payload.data, buffer, template->payload.size); - return 0; }