From b7c4d0876183c99b8086af198d9038d1d174f8fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Mon, 3 Dec 2012 09:51:27 +0200 Subject: [PATCH 1/3] uru4000: fix cancelling of imaging from error callback Call error callback before resetting img_transfer to NULL. This variable is internally used to detect if we are still in imaging loop and the call to execute_state_change() needs to be postponed. Since this is the final thing imaging_complete() we can't reset img_transfer until just before this call. --- libfprint/drivers/uru4000.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libfprint/drivers/uru4000.c b/libfprint/drivers/uru4000.c index 541245a..d9ee236 100644 --- a/libfprint/drivers/uru4000.c +++ b/libfprint/drivers/uru4000.c @@ -789,15 +789,18 @@ static void imaging_complete(struct fpi_ssm *ssm) int r = ssm->error; fpi_ssm_free(ssm); + /* Report error before exiting imaging loop - the error handler + * can request state change, which needs to be postponed to end of + * this function. */ + if (r) + fpi_imgdev_session_error(dev, r); + g_free(urudev->img_data); urudev->img_data = NULL; libusb_free_transfer(urudev->img_transfer); urudev->img_transfer = NULL; - if (r) - fpi_imgdev_session_error(dev, r); - r = execute_state_change(dev); if (r) fpi_imgdev_session_error(dev, r); -- 1.8.0.1