From 6767cd1a4f9e55d5b16a469eb4d8afc4441b95c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 19 Feb 2024 15:41:15 +0100 Subject: [PATCH] egismoc: Ensure that the command callback is after SSM is completed We need to make sure that we won't trigger a callback when a SSM is already in progress or we may end up overwriting it --- libfprint/drivers/egismoc/egismoc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libfprint/drivers/egismoc/egismoc.c b/libfprint/drivers/egismoc/egismoc.c index 05caf8d6..0731aa5b 100644 --- a/libfprint/drivers/egismoc/egismoc.c +++ b/libfprint/drivers/egismoc/egismoc.c @@ -181,7 +181,10 @@ egismoc_cmd_receive_cb (FpiUsbTransfer *transfer, gpointer userdata, GError *error) { + g_autofree guchar *buffer = NULL; CommandData *data = userdata; + SynCmdMsgCallback callback; + gssize actual_length; fp_dbg ("Command receive callback"); @@ -197,10 +200,18 @@ egismoc_cmd_receive_cb (FpiUsbTransfer *transfer, return; } - if (data->callback) - data->callback (device, transfer->buffer, transfer->actual_length, NULL); + /* Let's complete the previous ssm and then handle the callback, so that + * we are sure that we won't start a transfer or a new command while there is + * another one still ongoing + */ + callback = data->callback; + buffer = g_steal_pointer (&transfer->buffer); + actual_length = transfer->actual_length; fpi_ssm_mark_completed (transfer->ssm); + + if (callback) + callback (device, buffer, actual_length, NULL); } static void