diff options
author | Vasily Khoruzhick <anarsoul@gmail.com> | 2012-11-03 18:30:43 +0300 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2012-11-06 09:32:07 +0100 |
commit | 39902374ce0f7ca21cf3412a7295ad82198ef053 (patch) | |
tree | 69f45d73cf6c8fc3a63190a51cc70ad6efa8f357 /libfprint | |
parent | 9e92d4cf2c8ae4fad0b49576b0b6f8f4e5f2daa1 (diff) |
aes2550: Harden against low finger pressure
Stop scan only after 3rd heartbeat message
https://bugs.freedesktop.org/show_bug.cgi?id=56782
Diffstat (limited to 'libfprint')
-rw-r--r-- | libfprint/drivers/aes2550.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/libfprint/drivers/aes2550.c b/libfprint/drivers/aes2550.c index 92c988e..f0d60c4 100644 --- a/libfprint/drivers/aes2550.c +++ b/libfprint/drivers/aes2550.c @@ -59,6 +59,7 @@ struct aes2550_dev { GSList *strips; size_t strips_len; gboolean deactivating; + int heartbeat_cnt; }; /****** IMAGE PROCESSING ******/ @@ -369,6 +370,7 @@ static void capture_set_idle_reqs_cb(struct libusb_transfer *transfer) static void capture_read_data_cb(struct libusb_transfer *transfer) { struct fpi_ssm *ssm = transfer->user_data; + struct aes2550_dev *aesdev = ssm->priv; unsigned char *data = transfer->buffer; int r; @@ -390,14 +392,21 @@ static void capture_read_data_cb(struct libusb_transfer *transfer) fpi_ssm_mark_aborted(ssm, -EPROTO); goto out; } + aesdev->heartbeat_cnt = 0; fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); break; case AES2550_HEARTBEAT_SIZE: if (data[0] == AES2550_HEARTBEAT_MAGIC) { - /* No data for a long time, looks like finger was removed (or no movement) */ - /* assemble image and submit it to library */ - fp_dbg("Got heartbeat => last frame"); - fpi_ssm_next_state(ssm); + /* No data for a long time => finger was removed or there's no movement */ + aesdev->heartbeat_cnt++; + if (aesdev->heartbeat_cnt == 3) { + /* Got 3 heartbeat message, that's enough to consider that finger was removed, + * assemble image and submit it to the library */ + fp_dbg("Got 3 heartbeats => finger removed"); + fpi_ssm_next_state(ssm); + } else { + fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); + } } break; default: @@ -498,6 +507,7 @@ static void start_capture(struct fp_img_dev *dev) return; } + aesdev->heartbeat_cnt = 0; ssm = fpi_ssm_new(dev->dev, capture_run_state, CAPTURE_NUM_STATES); fp_dbg(""); ssm->priv = dev; |