From 63b5908f384a79966359f10864d6a5ff2ad97b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 13 Feb 2025 21:14:26 +0100 Subject: [PATCH] goodix: Read the header using byte reader --- libfprint/drivers/goodixmoc/goodix.c | 10 +++--- libfprint/drivers/goodixmoc/goodix_proto.c | 36 +++++++++++++++------- libfprint/drivers/goodixmoc/goodix_proto.h | 5 ++- 3 files changed, 32 insertions(+), 19 deletions(-) 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,