summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2024-02-20 05:04:52 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2024-02-20 17:57:46 +0100
commit28c26c7d7e8ab03898a54352c4ae82c357373812 (patch)
treed38d823ffbb0b31a63ad7d8cfbfb8f6f91258f04
parentdd5a71695fdf7cbb60337b3984b0de79d648f666 (diff)
egismoc: Use FpiByteReader to read the enrolled IDs
-rw-r--r--libfprint/drivers/egismoc/egismoc.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/libfprint/drivers/egismoc/egismoc.c b/libfprint/drivers/egismoc/egismoc.c
index 00e922b..4bf4fda 100644
--- a/libfprint/drivers/egismoc/egismoc.c
+++ b/libfprint/drivers/egismoc/egismoc.c
@@ -457,17 +457,29 @@ egismoc_list_fill_enrolled_ids_cb (FpDevice *device,
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
self->enrolled_ids = g_ptr_array_new_with_free_func (g_free);
+ FpiByteReader reader;
+ gboolean read = TRUE;
+
+ fpi_byte_reader_init (&reader, buffer_in, length_in);
+
+ read &= fpi_byte_reader_set_pos (&reader, EGISMOC_LIST_RESPONSE_PREFIX_SIZE);
+
/*
* Each fingerprint ID will be returned in this response as a 32 byte array
* The other stuff in the payload is 16 bytes long, so if there is at least 1
* print then the length should be at least 16+32=48 bytes long
*/
- for (int pos = EGISMOC_LIST_RESPONSE_PREFIX_SIZE;
- pos < length_in - EGISMOC_LIST_RESPONSE_SUFFIX_SIZE;
- pos += EGISMOC_FINGERPRINT_DATA_SIZE)
+ while (read)
{
- g_autofree gchar *print_id = g_strndup ((gchar *) buffer_in + pos,
- EGISMOC_FINGERPRINT_DATA_SIZE);
+ const guint8 *data;
+ g_autofree gchar *print_id = NULL;
+
+ read &= fpi_byte_reader_get_data (&reader, EGISMOC_FINGERPRINT_DATA_SIZE,
+ &data);
+ if (!read)
+ break;
+
+ print_id = g_strndup ((gchar *) data, EGISMOC_FINGERPRINT_DATA_SIZE);
fp_dbg ("Device fingerprint %0d: %.*s", self->enrolled_ids->len + 1,
EGISMOC_FINGERPRINT_DATA_SIZE, print_id);
g_ptr_array_add (self->enrolled_ids, g_steal_pointer (&print_id));