summaryrefslogtreecommitdiff
path: root/libfprint
diff options
context:
space:
mode:
authorVasily Khoruzhick <anarsoul@gmail.com>2012-11-03 18:30:43 +0300
committerBastien Nocera <hadess@hadess.net>2012-11-06 09:32:07 +0100
commit39902374ce0f7ca21cf3412a7295ad82198ef053 (patch)
tree69f45d73cf6c8fc3a63190a51cc70ad6efa8f357 /libfprint
parent9e92d4cf2c8ae4fad0b49576b0b6f8f4e5f2daa1 (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.c18
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;