diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c index 2febb4ae..33e137f4 100644 --- a/libfprint/drivers/goodixmoc/goodix.c +++ b/libfprint/drivers/goodixmoc/goodix.c @@ -130,7 +130,7 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device); FpiByteReader reader = {0}; CommandData *data = user_data; - int ret = -1, ssm_state = 0; + int ssm_state = 0; gxfp_cmd_response_t cmd_reponse = {0, }; pack_header header; guint32 crc32_calc = 0; @@ -156,8 +156,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - ret = gx_proto_parse_header (transfer->buffer, transfer->actual_length, &header); - if (ret != 0) + reader.data = transfer->buffer; + reader.size = transfer->actual_length; + + if (gx_proto_parse_header (&reader, &header) != 0) { fpi_ssm_mark_failed (transfer->ssm, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, @@ -165,8 +167,6 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - reader.data = transfer->buffer; - reader.size = transfer->actual_length; if (!fpi_byte_reader_set_pos (&reader, PACKAGE_HEADER_SIZE + header.len)) { fpi_ssm_mark_failed (transfer->ssm, diff --git a/libfprint/drivers/goodixmoc/goodix_proto.c b/libfprint/drivers/goodixmoc/goodix_proto.c index 67bbfe85..f0072b56 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.c +++ b/libfprint/drivers/goodixmoc/goodix_proto.c @@ -226,21 +226,35 @@ gx_proto_build_package (uint8_t *ppackage, int -gx_proto_parse_header ( - uint8_t *buffer, - uint32_t buffer_len, - pack_header *pheader) +gx_proto_parse_header (FpiByteReader *reader, + pack_header *pheader) { - if (!buffer || !pheader) - return -1; - if (buffer_len < PACKAGE_HEADER_SIZE + PACKAGE_CRC_SIZE) + if (!pheader) return -1; - memcpy (pheader, buffer, sizeof (pack_header)); - pheader->len = GUINT16_FROM_LE (pheader->len); - if (buffer_len < pheader->len + PACKAGE_HEADER_SIZE) - return -1; + if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd0)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd1)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint8 (reader, &pheader->packagenum)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint8 (reader, &pheader->reserved)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint16_le (reader, &pheader->len)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint8 (reader, &pheader->crc8)) + g_return_val_if_reached (-1); + + if (!fpi_byte_reader_get_uint8 (reader, &pheader->rev_crc8)) + g_return_val_if_reached (-1); + pheader->len -= PACKAGE_CRC_SIZE; + return 0; } diff --git a/libfprint/drivers/goodixmoc/goodix_proto.h b/libfprint/drivers/goodixmoc/goodix_proto.h index 50a9a8b1..63024500 100644 --- a/libfprint/drivers/goodixmoc/goodix_proto.h +++ b/libfprint/drivers/goodixmoc/goodix_proto.h @@ -234,9 +234,8 @@ int gx_proto_build_package (uint8_t *ppackage, const uint8_t *payload, uint32_t payload_size); -int gx_proto_parse_header (uint8_t *buffer, - uint32_t buffer_len, - pack_header *pheader); +int gx_proto_parse_header (FpiByteReader *reader, + pack_header *pheader); int gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader,