diff options
author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2024-02-19 15:41:15 +0100 |
---|---|---|
committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2024-02-19 17:12:12 +0100 |
commit | 6767cd1a4f9e55d5b16a469eb4d8afc4441b95c3 (patch) | |
tree | 33df2de2bae782cf33e9400a0bbc2129aa379aa5 | |
parent | 226b6abfab103283afec87ba54f38b61ff5aba2a (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.c | 15 |
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 |