summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2024-02-19 15:41:15 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2024-02-19 17:12:12 +0100
commit6767cd1a4f9e55d5b16a469eb4d8afc4441b95c3 (patch)
tree33df2de2bae782cf33e9400a0bbc2129aa379aa5
parent226b6abfab103283afec87ba54f38b61ff5aba2a (diff)
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
-rw-r--r--libfprint/drivers/egismoc/egismoc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/libfprint/drivers/egismoc/egismoc.c b/libfprint/drivers/egismoc/egismoc.c
index 05caf8d..0731aa5 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