Compare commits

..

1 Commits

Author SHA1 Message Date
Benjamin Berg
2a9ad74ec4 print: Reject enroll images that can't be matched
If the score of a print matching itself is too low to match, then
reject it. It can never match and it is therefore completely useless.

Also change this into a non-fatal error, the user is free to retry the
enroll step in the hope that more minutiae is found (e.g. longer swipe).
2022-05-17 19:16:32 +00:00
61 changed files with 270 additions and 3191 deletions

View File

@@ -1,5 +1,4 @@
include: include:
- local: '.gitlab-ci/libfprint-image-variables.yaml'
- local: '.gitlab-ci/libfprint-templates.yaml' - local: '.gitlab-ci/libfprint-templates.yaml'
- project: 'freedesktop/ci-templates' - project: 'freedesktop/ci-templates'
ref: master ref: master
@@ -8,7 +7,7 @@ include:
variables: variables:
extends: .libfprint_common_variables extends: .libfprint_common_variables
FDO_DISTRIBUTION_TAG: $LIBFPRINT_IMAGE_TAG FDO_DISTRIBUTION_TAG: latest
FDO_DISTRIBUTION_VERSION: rawhide FDO_DISTRIBUTION_VERSION: rawhide
FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME" FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG" FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
@@ -16,7 +15,6 @@ variables:
LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546" LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"
stages: stages:
- image-build
- check-source - check-source
- build - build
- test - test
@@ -71,11 +69,6 @@ test:
- ninja -C _build coverage - ninja -C _build coverage
- cat _build/meson-logs/coverage.txt - cat _build/meson-logs/coverage.txt
artifacts: artifacts:
reports:
junit: "_build/meson-logs/testlog.junit.xml"
coverage_report:
coverage_format: cobertura
path: _build/meson-logs/coverage.xml
expose_as: 'Coverage Report' expose_as: 'Coverage Report'
when: always when: always
paths: paths:
@@ -94,8 +87,6 @@ test_valgrind:
- ninja -C _build - ninja -C _build
- meson test -C _build --print-errorlogs --no-stdsplit --setup=valgrind - meson test -C _build --print-errorlogs --no-stdsplit --setup=valgrind
artifacts: artifacts:
reports:
junit: "_build/meson-logs/testlog.junit.xml"
expose_as: 'Valgrind test logs' expose_as: 'Valgrind test logs'
when: always when: always
paths: paths:
@@ -127,7 +118,7 @@ test_indent:
script: script:
- scripts/uncrustify.sh - scripts/uncrustify.sh
- git diff - git diff
- git diff-index --name-only --exit-code HEAD - "! git status -s | grep -q ."
test_unsupported_list: test_unsupported_list:
stage: check-source stage: check-source
@@ -141,8 +132,7 @@ test_unsupported_list:
flatpak: flatpak:
stage: flatpak stage: flatpak
extends: .flatpak extends: .flatpak
# From https://gitlab.gnome.org/GNOME/gnome-runtime-images/container_registry image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:3.36
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:42
variables: variables:
MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json" MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json"
FLATPAK_MODULE: "libfprint" FLATPAK_MODULE: "libfprint"
@@ -163,12 +153,11 @@ flatpak:
allow_failure: true allow_failure: true
# CONTAINERS creation stage # CONTAINERS creation stage
.container_fedora_build_base: container_fedora_build:
extends: .fdo.container-build@fedora extends: .fdo.container-build@fedora
stage: image-build
only: only:
variables: variables:
- $CI_PIPELINE_SOURCE == "never" - $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
variables: variables:
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
FDO_FORCE_REBUILD: 1 FDO_FORCE_REBUILD: 1
@@ -179,27 +168,7 @@ flatpak:
libpcap-devel libpcap-devel
libudev-devel libudev-devel
FDO_DISTRIBUTION_EXEC: | FDO_DISTRIBUTION_EXEC: |
$LIBFPRINT_EXEC git clone https://github.com/martinpitt/umockdev.git && \
cd umockdev && \
container_fedora_build_schedule: meson _build --prefix=/usr && \
extends: .container_fedora_build_base ninja -C _build && ninja -C _build install
only:
variables:
- $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
container_fedora_build_manual:
extends: .container_fedora_build_base
only:
variables:
- $LIBFPRINT_CI_ACTION == "build-image"
container_fedora_build_on_deps_changed:
extends: .container_fedora_build_base
only:
variables:
- $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
refs:
- branches
- merge_requests
changes:
- .gitlab-ci/libfprint-image-variables.yaml

View File

@@ -1,2 +0,0 @@
variables:
LIBFPRINT_IMAGE_TAG: v2

View File

@@ -1,10 +1,6 @@
# Bump image version on .gitlab-ci/libfprint-image-variables.yaml to trigger
# a rebuild on changes to this file
.libfprint_common_variables: .libfprint_common_variables:
LIBFPRINT_DEPENDENCIES: LIBFPRINT_DEPENDENCIES:
doxygen doxygen
dnf-plugins-core
flatpak-builder flatpak-builder
gcc gcc
gcc-c++ gcc-c++
@@ -31,17 +27,3 @@
valgrind valgrind
clang-analyzer clang-analyzer
diffutils diffutils
LIBFPRINT_EXEC: |
dnf debuginfo-install -y \
glib2 \
glibc \
libgusb \
libusb \
nss \
pixman
git clone https://github.com/martinpitt/umockdev.git && \
cd umockdev && \
meson _build --prefix=/usr && \
ninja -C _build && ninja -C _build install

23
NEWS
View File

@@ -1,29 +1,6 @@
This file lists notable changes in each release. For the full history of all This file lists notable changes in each release. For the full history of all
changes, see ChangeLog. changes, see ChangeLog.
2022-10-13: v1.94.5 release
Highlights:
* New driver: fpcmoc, supporting various FPC MOC Fingerprint Sensors
* goodixmoc: New PIDs 0x6014, 0x6094, 0x631C, 0x634C, 0x6384, 0x659A.
* goodixmoc: Support resetting device on firmware failure due to corrupted DB.
* elanmoc: New PIDs 0x0c88, 0x0c8c, 0x0c8d.
* synaptics: New PID 0x0104.
* upektc: New PID 0x2017.
* Fixed various memory leaks
* More tests
2022-05-24: v1.94.4 release
Highlights:
* synaptics: New PIDs 0x0168, 0x015f
* elan: New PID 0x0c4b
* elanspi: New PID 0x241f
* synaptics: Minor fix to interrupt transfer resubmission
* Avoid sysfs writes if value is already expected
* Improvements to the testing setup
* Fixes to the internal critical section API
2021-11-02: v1.94.3 release 2021-11-02: v1.94.3 release
Highlights: Highlights:

108
README.md
View File

@@ -1,86 +1,54 @@
# libfprint
libfprint is part of the fprint project:
<div align="center"> https://fprint.freedesktop.org/
# LibFPrint
*LibFPrint is part of the **[FPrint][Website]** project.*
<br/>
[![Button Website]][Website]
[![Button Documentation]][Documentation]
[![Button Supported]][Supported]
[![Button Unsupported]][Unsupported]
[![Button Contribute]][Contribute]
[![Button Contributors]][Contributors]
</div>
## History ## History
**LibFPrint** was originally developed as part of an libfprint was originally developed as part of an academic project at the
academic project at the **[University Of Manchester]**. University of Manchester with the aim of hiding differences between different
consumer fingerprint scanners and providing a single uniform API to application
developers. The ultimate goal of the fprint project is to make fingerprint
scanners widely and easily usable under common Linux environments.
It aimed to hide the differences between consumer The academic university project runs off a codebase maintained separately
fingerprint scanners and provide a single uniform from this one, although I try to keep them as similar as possible (I'm not
API to application developers. hiding anything in the academic branch, it's just the open source release
contains some commits excluded from the academic project).
## Goal
The ultimate goal of the **FPrint** project is to make
fingerprint scanners widely and easily usable under
common Linux environments.
## License ## License
`Section 6` of the license states that for compiled works that use THE UNIVERSITY OF MANCHESTER DOES NOT ENDORSE THIS THIS SOFTWARE RELEASE AND
this library, such works must include **LibFPrint** copyright notices IS IN NO WAY RESPONSIBLE FOR THE CODE CONTAINED WITHIN, OR ANY DAMAGES CAUSED
alongside the copyright notices for the other parts of the work. BY USING OR DISTRIBUTING THE SOFTWARE. Development does not happen on
university computers and the project is not hosted at the university either.
**LibFPrint** includes code from **NIST's** **[NBIS]** software distribution. For more information on libfprint, supported devices, API documentation, etc.,
see the homepage:
https://fprint.freedesktop.org/
We include **Bozorth3** from the **[US Export Controlled]** libfprint is licensed under the GNU LGPL version 2.1. See the COPYING file
distribution, which we have determined to be fine for the license text.
being shipped in an open source project.
<br/> Section 6 of the license states that for compiled works that use this
library, such works must include libfprint copyright notices alongside the
copyright notices for the other parts of the work. We have attempted to
make this process slightly easier for you by grouping these all in one place:
the AUTHORS file.
<div align="right"> libfprint includes code from NIST's NBIS software distribution:
http://fingerprint.nist.gov/NBIS/index.html
We include bozorth3 from the US export controlled distribution. We have
determined that it is fine to ship bozorth3 in an open source project,
see https://fprint.freedesktop.org/us-export-control.html
[![Badge License]][License] ## Historical links
</div> Older versions of libfprint are available at:
https://sourceforge.net/projects/fprint/files/
Historical mailing-list archives:
http://www.reactivated.net/fprint_list_archives/
<!-----------------------------------------------------------------------------> Historical website:
http://web.archive.org/web/*/https://www.freedesktop.org/wiki/Software/fprint/
[Documentation]: https://fprint.freedesktop.org/libfprint-dev/
[Contributors]: https://gitlab.freedesktop.org/libfprint/libfprint/-/graphs/master
[Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices
[Supported]: https://fprint.freedesktop.org/supported-devices.html
[Website]: https://fprint.freedesktop.org/
[Contribute]: ./HACKING.md
[License]: ./COPYING
[University Of Manchester]: https://www.manchester.ac.uk/
[US Export Controlled]: https://fprint.freedesktop.org/us-export-control.html
[NBIS]: http://fingerprint.nist.gov/NBIS/index.html
<!---------------------------------[ Badges ]---------------------------------->
[Badge License]: https://img.shields.io/badge/License-LGPL2.1-015d93.svg?style=for-the-badge&labelColor=blue
<!---------------------------------[ Buttons ]--------------------------------->
[Button Documentation]: https://img.shields.io/badge/Documentation-04ACE6?style=for-the-badge&logoColor=white&logo=BookStack
[Button Contributors]: https://img.shields.io/badge/Contributors-FF4F8B?style=for-the-badge&logoColor=white&logo=ActiGraph
[Button Unsupported]: https://img.shields.io/badge/Unsupported_Devices-EF2D5E?style=for-the-badge&logoColor=white&logo=AdBlock
[Button Contribute]: https://img.shields.io/badge/Contribute-66459B?style=for-the-badge&logoColor=white&logo=Git
[Button Supported]: https://img.shields.io/badge/Supported_Devices-428813?style=for-the-badge&logoColor=white&logo=AdGuard
[Button Website]: https://img.shields.io/badge/Homepage-3B80AE?style=for-the-badge&logoColor=white&logo=freedesktopDotOrg

View File

@@ -146,9 +146,6 @@ usb:v04F3p0C58*
usb:v04F3p0C7D* usb:v04F3p0C7D*
usb:v04F3p0C7E* usb:v04F3p0C7E*
usb:v04F3p0C82* usb:v04F3p0C82*
usb:v04F3p0C88*
usb:v04F3p0C8C*
usb:v04F3p0C8D*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -157,24 +154,10 @@ usb:v1C7Ap0603*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
# Supported by libfprint driver fpcmoc
usb:v10A5pFFE0*
usb:v10A5pA305*
usb:v10A5pDA04*
usb:v10A5pD805*
usb:v10A5pD205*
ID_AUTOSUSPEND=1
ID_PERSIST=0
# Supported by libfprint driver goodixmoc # Supported by libfprint driver goodixmoc
usb:v27C6p5840* usb:v27C6p5840*
usb:v27C6p6014*
usb:v27C6p6094*
usb:v27C6p609C* usb:v27C6p609C*
usb:v27C6p60A2* usb:v27C6p60A2*
usb:v27C6p631C*
usb:v27C6p634C*
usb:v27C6p6384*
usb:v27C6p639C* usb:v27C6p639C*
usb:v27C6p63AC* usb:v27C6p63AC*
usb:v27C6p63BC* usb:v27C6p63BC*
@@ -184,7 +167,6 @@ usb:v27C6p6584*
usb:v27C6p658C* usb:v27C6p658C*
usb:v27C6p6592* usb:v27C6p6592*
usb:v27C6p6594* usb:v27C6p6594*
usb:v27C6p659A*
usb:v27C6p659C* usb:v27C6p659C*
usb:v27C6p6A94* usb:v27C6p6A94*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
@@ -208,8 +190,6 @@ usb:v06CBp0123*
usb:v06CBp0126* usb:v06CBp0126*
usb:v06CBp0129* usb:v06CBp0129*
usb:v06CBp0168* usb:v06CBp0168*
usb:v06CBp015F*
usb:v06CBp0104*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -222,7 +202,6 @@ usb:v147Ep1001*
# Supported by libfprint driver upektc # Supported by libfprint driver upektc
usb:v0483p2015* usb:v0483p2015*
usb:v0483p2017*
usb:v147Ep3001* usb:v147Ep3001*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -278,19 +257,12 @@ usb:v138Ap0091*
ID_PERSIST=0 ID_PERSIST=0
# Known unsupported devices # Known unsupported devices
usb:v04E8p730B*
usb:v04F3p036B* usb:v04F3p036B*
usb:v04F3p0C00* usb:v04F3p0C00*
usb:v04F3p0C4C* usb:v04F3p0C4C*
usb:v04F3p0C57* usb:v04F3p0C57*
usb:v04F3p0C5E* usb:v04F3p0C5E*
usb:v04F3p0C5A*
usb:v04F3p0C70*
usb:v04F3p0C72*
usb:v04F3p2706* usb:v04F3p2706*
usb:v04F3p3057*
usb:v04F3p3104*
usb:v04F3p310D*
usb:v06CBp0081* usb:v06CBp0081*
usb:v06CBp0088* usb:v06CBp0088*
usb:v06CBp008A* usb:v06CBp008A*
@@ -307,7 +279,6 @@ usb:v06CBp00C9*
usb:v06CBp00D8* usb:v06CBp00D8*
usb:v06CBp00DA* usb:v06CBp00DA*
usb:v06CBp00DC* usb:v06CBp00DC*
usb:v06CBp00E4*
usb:v06CBp00E7* usb:v06CBp00E7*
usb:v06CBp00E9* usb:v06CBp00E9*
usb:v06CBp00FD* usb:v06CBp00FD*
@@ -323,7 +294,6 @@ usb:v0A5Cp5845*
usb:v0BDAp5812* usb:v0BDAp5812*
usb:v10A5p0007* usb:v10A5p0007*
usb:v10A5p9200* usb:v10A5p9200*
usb:v10A5p9800*
usb:v1188p9545* usb:v1188p9545*
usb:v138Ap0007* usb:v138Ap0007*
usb:v138Ap003A* usb:v138Ap003A*
@@ -345,32 +315,24 @@ usb:v1C7Ap0576*
usb:v27C6p5042* usb:v27C6p5042*
usb:v27C6p5110* usb:v27C6p5110*
usb:v27C6p5117* usb:v27C6p5117*
usb:v27C6p5120*
usb:v27C6p5125*
usb:v27C6p5201* usb:v27C6p5201*
usb:v27C6p521D* usb:v27C6p521D*
usb:v27C6p5301* usb:v27C6p5301*
usb:v27C6p530C* usb:v27C6p530C*
usb:v27C6p532D* usb:v27C6p532D*
usb:v27C6p5335*
usb:v27C6p533C* usb:v27C6p533C*
usb:v27C6p5381* usb:v27C6p5381*
usb:v27C6p5385* usb:v27C6p5385*
usb:v27C6p538C* usb:v27C6p538C*
usb:v27C6p538D* usb:v27C6p538D*
usb:v27C6p5395* usb:v27C6p5395*
usb:v27C6p5503*
usb:v27C6p550A*
usb:v27C6p550C*
usb:v27C6p5584* usb:v27C6p5584*
usb:v27C6p55A2* usb:v27C6p55A2*
usb:v27C6p55A4* usb:v27C6p55A4*
usb:v27C6p55B4* usb:v27C6p55B4*
usb:v27C6p5740* usb:v27C6p5740*
usb:v27C6p5E0A* usb:v27C6p5E0A*
usb:v27C6p581A*
usb:v2808p9338* usb:v2808p9338*
usb:v2808p93A9*
usb:v298Dp2020* usb:v298Dp2020*
usb:v298Dp2033* usb:v298Dp2033*
usb:v3538p0930* usb:v3538p0930*

View File

@@ -1,12 +1,12 @@
{ {
"app-id": "org.freedesktop.libfprint.Demo", "app-id": "org.freedesktop.libfprint.Demo",
"runtime": "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version": "42", "runtime-version": "3.36",
"sdk": "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"command": "gtk-libfprint-test", "command": "gtk-libfprint-test",
"finish-args": [ "finish-args": [
/* X11 + XShm access */ /* X11 + XShm access */
"--share=ipc", "--socket=fallback-x11", "--share=ipc", "--socket=x11",
/* Wayland access */ /* Wayland access */
"--socket=wayland", "--socket=wayland",
/* OpenGL access */ /* OpenGL access */
@@ -18,7 +18,7 @@
"modules": [ "modules": [
{ {
"name": "libusb", "name": "libusb",
"config-opts": [ "--disable-static" ], "config-opts": [ "--disable-static", "--disable-udev" ],
"cleanup": [ "cleanup": [
"/lib/*.la", "/lib/*.la",
"/lib/pkgconfig", "/lib/pkgconfig",
@@ -27,12 +27,12 @@
"sources": [ "sources": [
{ {
"type": "archive", "type": "archive",
"url": "https://github.com/libusb/libusb/releases/download/v1.0.26/libusb-1.0.26.tar.bz2", "url": "https://github.com/libusb/libusb/archive/v1.0.22.tar.gz",
"sha256": "12ce7a61fc9854d1d2a1ffe095f7b5fac19ddba095c259e6067a46500381b5a5" "sha256": "3500f7b182750cd9ccf9be8b1df998f83df56a39ab264976bdb3307773e16f48"
} }
], ],
"post-install": [ "post-install": [
"install -Dm644 COPYING /app/share/licenses/libusb/COPYING" "install -Dm644 COPYING /app/share/licenses/libgusb/COPYING"
] ]
}, },
{ {
@@ -62,11 +62,12 @@
{ {
"name": "libfprint", "name": "libfprint",
"buildsystem": "meson", "buildsystem": "meson",
"config-opts": [ "-Dudev_hwdb=disabled", "-Dudev_rules=disabled", "-Dgtk-examples=true", "-Ddrivers=all" ], "config-opts": [ "-Dudev_hwdb=disabled", "-Dudev_rules=disabled", "-Dx11-examples=false", "-Dgtk-examples=true", "-Ddrivers=all" ],
"sources": [ "sources": [
{ {
"type": "git", "type": "git",
"url": "https://gitlab.freedesktop.org/libfprint/libfprint.git" "url": "https://gitlab.freedesktop.org/libfprint/libfprint.git",
"branch": "wip/benzea/v2"
} }
] ]
} }

View File

@@ -190,7 +190,7 @@ data_resp_cb (FpiUsbTransfer *transfer, FpDevice *dev, gpointer user_data, GErro
{ {
if (!self->stop && (self->strips_len > 0)) if (!self->stop && (self->strips_len > 0))
{ {
g_autoptr(FpImage) img = NULL; FpImage *img;
self->strips = g_slist_reverse (self->strips); self->strips = g_slist_reverse (self->strips);
fpi_do_movement_estimation (&assembling_ctx, self->strips); fpi_do_movement_estimation (&assembling_ctx, self->strips);
img = fpi_assemble_frames (&assembling_ctx, self->strips); img = fpi_assemble_frames (&assembling_ctx, self->strips);
@@ -199,7 +199,7 @@ data_resp_cb (FpiUsbTransfer *transfer, FpDevice *dev, gpointer user_data, GErro
self->strips = NULL; self->strips = NULL;
self->strips_len = 0; self->strips_len = 0;
FpImage *resizeImage = fpi_image_resize (img, EGIS0570_RESIZE, EGIS0570_RESIZE); FpImage *resizeImage = fpi_image_resize (img, EGIS0570_RESIZE, EGIS0570_RESIZE);
fpi_image_device_image_captured (img_self, g_steal_pointer (&resizeImage)); fpi_image_device_image_captured (img_self, resizeImage);
} }
fpi_image_device_report_finger_status (img_self, FALSE); fpi_image_device_report_finger_status (img_self, FALSE);

View File

@@ -357,7 +357,7 @@ elan_cmd_cb (FpiUsbTransfer *transfer, FpDevice *dev,
if (transfer->endpoint & FPI_USB_ENDPOINT_IN) if (transfer->endpoint & FPI_USB_ENDPOINT_IN)
{ {
/* just finished receiving */ /* just finished receiving */
self->last_read = g_memdup2 (transfer->buffer, transfer->actual_length); self->last_read = g_memdup (transfer->buffer, transfer->actual_length);
elan_cmd_done (ssm); elan_cmd_done (ssm);
} }
else else

View File

@@ -28,9 +28,6 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x04f3, .pid = 0x0c7d, }, { .vid = 0x04f3, .pid = 0x0c7d, },
{ .vid = 0x04f3, .pid = 0x0c7e, }, { .vid = 0x04f3, .pid = 0x0c7e, },
{ .vid = 0x04f3, .pid = 0x0c82, }, { .vid = 0x04f3, .pid = 0x0c82, },
{ .vid = 0x04f3, .pid = 0x0c88, },
{ .vid = 0x04f3, .pid = 0x0c8c, },
{ .vid = 0x04f3, .pid = 0x0c8d, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
@@ -379,9 +376,9 @@ elanmoc_enroll_cb (FpiDeviceElanmoc *self,
enroll_status_report (self, ENROLL_RSP_RETRY, self->num_frames, NULL); enroll_status_report (self, ENROLL_RSP_RETRY, self->num_frames, NULL);
} }
if (self->num_frames == self->max_moc_enroll_time && buffer_in[1] == ELAN_MSG_OK) if (self->num_frames == ELAN_MOC_ENROLL_TIMES && buffer_in[1] == ELAN_MSG_OK)
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
else if (self->num_frames < self->max_moc_enroll_time) else if (self->num_frames < ELAN_MOC_ENROLL_TIMES)
fpi_ssm_jump_to_state (self->task_ssm, MOC_ENROLL_WAIT_FINGER); fpi_ssm_jump_to_state (self->task_ssm, MOC_ENROLL_WAIT_FINGER);
else else
fpi_ssm_mark_failed (self->task_ssm, error); fpi_ssm_mark_failed (self->task_ssm, error);
@@ -444,7 +441,7 @@ elan_enroll_run_state (FpiSsm *ssm, FpDevice *dev)
case MOC_ENROLL_WAIT_FINGER: case MOC_ENROLL_WAIT_FINGER:
cmd_buf = elanmoc_compose_cmd (&elanmoc_enroll_cmd); cmd_buf = elanmoc_compose_cmd (&elanmoc_enroll_cmd);
cmd_buf[3] = self->curr_enrolled; cmd_buf[3] = self->curr_enrolled;
cmd_buf[4] = self->max_moc_enroll_time; cmd_buf[4] = ELAN_MOC_ENROLL_TIMES;
cmd_buf[5] = self->num_frames; cmd_buf[5] = self->num_frames;
elanmoc_get_cmd (dev, cmd_buf, elanmoc_enroll_cmd.cmd_len, elanmoc_enroll_cmd.resp_len, 1, elanmoc_enroll_cb); elanmoc_get_cmd (dev, cmd_buf, elanmoc_enroll_cmd.cmd_len, elanmoc_enroll_cmd.resp_len, 1, elanmoc_enroll_cb);
break; break;
@@ -509,7 +506,7 @@ create_print_from_response (FpiDeviceElanmoc *self,
return NULL; return NULL;
} }
userid = g_memdup2 (&buffer_in[5], userid_len); userid = g_memdup (&buffer_in[5], userid_len);
userid_safe = g_strndup ((const char *) &buffer_in[5], userid_len); userid_safe = g_strndup ((const char *) &buffer_in[5], userid_len);
print = fp_print_new (FP_DEVICE (self)); print = fp_print_new (FP_DEVICE (self));
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, userid, userid_len, 1); uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, userid, userid_len, 1);
@@ -761,7 +758,6 @@ identify_status_report (FpiDeviceElanmoc *self, int verify_status_id,
} }
enum identify_states { enum identify_states {
IDENTIFY_SET_MODE,
IDENTIFY_WAIT_FINGER, IDENTIFY_WAIT_FINGER,
IDENTIFY_NUM_STATES, IDENTIFY_NUM_STATES,
}; };
@@ -797,13 +793,6 @@ elan_identify_run_state (FpiSsm *ssm, FpDevice *dev)
fp_info ("elanmoc %s ", __func__); fp_info ("elanmoc %s ", __func__);
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case IDENTIFY_SET_MODE:
fp_info ("elanmoc %s IDENTIFY_SET_MODE", __func__);
cmd_buf = elanmoc_compose_cmd (&elanmoc_set_mod_cmd);
cmd_buf[3] = 0x03;
elanmoc_get_cmd (dev, cmd_buf, elanmoc_set_mod_cmd.cmd_len, elanmoc_set_mod_cmd.resp_len, 0, elanmoc_cmd_ack_cb);
break;
case IDENTIFY_WAIT_FINGER: case IDENTIFY_WAIT_FINGER:
fp_info ("elanmoc %s VERIFY_WAIT_FINGER", __func__); fp_info ("elanmoc %s VERIFY_WAIT_FINGER", __func__);
cmd_buf = elanmoc_compose_cmd (&elanmoc_verify_cmd); cmd_buf = elanmoc_compose_cmd (&elanmoc_verify_cmd);
@@ -1010,12 +999,6 @@ elanmoc_get_status_cb (FpiDeviceElanmoc *self,
} }
if (buffer_in[1] != 0x03 && self->cmd_retry_cnt != 0) if (buffer_in[1] != 0x03 && self->cmd_retry_cnt != 0)
{
self->cmd_retry_cnt--;
cmd_buf = elanmoc_compose_cmd (&cal_status_cmd);
elanmoc_get_cmd (FP_DEVICE (self), cmd_buf, cal_status_cmd.cmd_len, cal_status_cmd.resp_len, 0, elanmoc_get_status_cb);
}
else
{ {
if(self->cmd_retry_cnt == 0) if(self->cmd_retry_cnt == 0)
{ {
@@ -1024,6 +1007,12 @@ elanmoc_get_status_cb (FpiDeviceElanmoc *self,
"Sensor not ready")); "Sensor not ready"));
return; return;
} }
self->cmd_retry_cnt--;
cmd_buf = elanmoc_compose_cmd (&cal_status_cmd);
elanmoc_get_cmd (FP_DEVICE (self), cmd_buf, cal_status_cmd.cmd_len, cal_status_cmd.resp_len, 0, elanmoc_get_status_cb);
}
else
{
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
} }
} }
@@ -1071,7 +1060,6 @@ elanmoc_open (FpDevice *device)
{ {
FpiDeviceElanmoc *self = FPI_DEVICE_ELANMOC (device); FpiDeviceElanmoc *self = FPI_DEVICE_ELANMOC (device);
GError *error = NULL; GError *error = NULL;
gint productid = 0;
if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error)) if (!g_usb_device_reset (fpi_device_get_usb_device (device), &error))
goto error; goto error;
@@ -1079,24 +1067,6 @@ elanmoc_open (FpDevice *device)
if (!g_usb_device_claim_interface (fpi_device_get_usb_device (device), 0, 0, &error)) if (!g_usb_device_claim_interface (fpi_device_get_usb_device (device), 0, 0, &error))
goto error; goto error;
productid = g_usb_device_get_pid (fpi_device_get_usb_device (device));
switch (productid)
{
case 0x0c8c:
self->max_moc_enroll_time = 11;
break;
case 0x0c8d:
self->max_moc_enroll_time = 17;
break;
default:
self->max_moc_enroll_time = ELAN_MOC_ENROLL_TIMES;
break;
}
fpi_device_set_nr_enroll_stages (device, self->max_moc_enroll_time);
self->task_ssm = fpi_ssm_new (FP_DEVICE (self), dev_init_handler, DEV_INIT_STATES); self->task_ssm = fpi_ssm_new (FP_DEVICE (self), dev_init_handler, DEV_INIT_STATES);
fpi_ssm_start (self->task_ssm, task_ssm_init_done); fpi_ssm_start (self->task_ssm, task_ssm_init_done);
return; return;

View File

@@ -188,7 +188,6 @@ struct _FpiDeviceElanmoc
unsigned char y_trace; unsigned char y_trace;
int num_frames; int num_frames;
int curr_enrolled; int curr_enrolled;
int max_moc_enroll_time;
int cancel_result; int cancel_result;
int cmd_retry_cnt; int cmd_retry_cnt;
int list_index; int list_index;

File diff suppressed because it is too large Load Diff

View File

@@ -1,221 +0,0 @@
/*
* Copyright (c) 2022 Fingerprint Cards AB <tech@fingerprints.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "fpi-device.h"
#include "fpi-ssm.h"
#include <stdio.h>
#include <stdlib.h>
#define TEMPLATE_ID_SIZE (32)
#define MAX_FW_VERSION_STR_LEN (16)
#define FPC_CMD_INIT (0x01)
#define FPC_CMD_ARM (0x02)
#define FPC_CMD_ABORT (0x03)
#define FPC_CMD_INDICATE_S_STATE (0x08)
#define FPC_CMD_GET_IMG (0x09)
#define FPC_CMD_GET_KPI (0x0C)
#define FPC_CMD_LOAD_DB (0x60)
#define FPC_CMD_STORE_DB (0x61)
#define FPC_CMD_DELETE_DB (0x62)
#define FPC_CMD_DELETE_TEMPLATE (0x63)
#define FPC_CMD_BEGIN_ENROL (0x67)
#define FPC_CMD_ENROL (0x68)
#define FPC_CMD_END_ENROL (0x69)
#define FPC_CMD_BIND_IDENTITY (0x6A)
#define FPC_CMD_IDENTIFY (0x6B)
#define FPC_CMD_ENUM (0x70)
#define FPC_EVT_INIT_RESULT (0x02)
#define FPC_EVT_FINGER_DWN (0x06)
#define FPC_EVT_IMG (0x08)
#define FPC_EVT_FID_DATA (0x31)
#define FPC_DB_ID_LEN (16)
#define FPC_IDENTITY_TYPE_WILDCARD (0x1)
#define FPC_IDENTITY_TYPE_RESERVED (0x3)
#define FPC_IDENTITY_WILDCARD (0x25066282)
#define FPC_SUBTYPE_ANY (0xFF)
#define FPC_SUBTYPE_RESERVED (0xF5)
#define FPC_SUBTYPE_NOINFORMATION (0x00)
#define FPC_CAPTUREID_RESERVED (0x701100F)
#define FPC_SESSIONID_RESERVED (0x0077FF12)
#define FPC_TEMPLATES_MAX (10)
#define SECURITY_MAX_SID_SIZE (68)
#define FPC_HOST_MS_S0 (0x10)
#define FPC_HOST_MS_SX (0x11)
G_DECLARE_FINAL_TYPE (FpiDeviceFpcMoc, fpi_device_fpcmoc, FPI,
DEVICE_FPCMOC, FpDevice);
typedef struct _FPC_FID_DATA
{
guint32 identity_type;
guint32 reserved;
guint32 identity_size;
guint32 subfactor;
guint8 data[SECURITY_MAX_SID_SIZE];
} FPC_FID_DATA, *PFPC_FID_DATA;
typedef struct _FPC_LOAD_DB
{
gint32 status;
guint32 reserved;
guint32 database_id_size;
guint8 data[FPC_DB_ID_LEN];
} FPC_LOAD_DB, *PFPC_LOAD_DB;
typedef union _FPC_DELETE_DB
{
guint32 reserved;
guint32 database_id_size;
guint8 data[FPC_DB_ID_LEN];
} FPC_DB_OP, *PFPC_DB_OP;
typedef struct _FPC_BEGIN_ENROL
{
gint32 status;
guint32 reserved1;
guint32 reserved2;
} FPC_BEGIN_ENROL, *PFPC_BEGIN_ENROL;
typedef struct _FPC_ENROL
{
gint32 status;
guint32 remaining;
} FPC_ENROL, *PFPC_ENROL;
typedef struct _FPC_END_ENROL
{
gint32 status;
guint32 fid;
} FPC_END_ENROL, *PFPC_END_ENROL;
typedef struct _FPC_IDENTIFY
{
gint32 status;
guint32 identity_type;
guint32 identity_offset;
guint32 identity_size;
guint32 subfactor;
guint8 data[SECURITY_MAX_SID_SIZE];
} FPC_IDENTIFY, *PFPC_IDENTIFY;
typedef struct
{
guint32 cmdid;
guint32 length;
guint32 status;
} evt_hdr_t;
typedef struct
{
evt_hdr_t hdr;
guint16 sensor;
guint16 hw_id;
guint16 img_w;
guint16 img_h;
guint8 fw_version[MAX_FW_VERSION_STR_LEN];
guint16 fw_capabilities;
} evt_initiated_t;
typedef struct
{
guint8 subfactor;
guint32 identity_type;
guint32 identity_size;
guint8 identity[SECURITY_MAX_SID_SIZE];
} __attribute__((packed)) fpc_fid_data_t;
typedef struct
{
evt_hdr_t hdr;
gint status;
guint32 num_ids;
fpc_fid_data_t fid_data[FPC_TEMPLATES_MAX];
} __attribute__((packed)) evt_enum_fids_t;
typedef struct _fp_cmd_response
{
union
{
evt_hdr_t evt_hdr;
evt_initiated_t evt_inited;
evt_enum_fids_t evt_enum_fids;
};
} fpc_cmd_response_t, *pfpc_cmd_response_t;
enum {
FPC_ENROL_STATUS_COMPLETED = 0,
FPC_ENROL_STATUS_PROGRESS = 1,
FPC_ENROL_STATUS_FAILED_COULD_NOT_COMPLETE = 2,
FPC_ENROL_STATUS_FAILED_ALREADY_ENROLED = 3,
FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE = 4,
FPC_ENROL_STATUS_IMAGE_TOO_SIMILAR = 5,
FPC_ENROL_STATUS_IMAGE_LOW_QUALITY = 6,
};
typedef enum {
FPC_CMDTYPE_UNKNOWN = 0,
FPC_CMDTYPE_TO_DEVICE,
FPC_CMDTYPE_TO_DEVICE_EVTDATA,
FPC_CMDTYPE_FROM_DEVICE,
} FpcCmdType;
typedef enum {
FP_CMD_SEND = 0,
FP_CMD_GET_DATA,
FP_CMD_SUSPENDED,
FP_CMD_RESUME,
FP_CMD_NUM_STATES,
} FpCmdState;
typedef enum {
FP_INIT = 0,
FP_LOAD_DB,
FP_INIT_NUM_STATES,
} FpInitState;
typedef enum {
FP_ENROLL_ENUM = 0,
FP_ENROLL_CREATE,
FP_ENROLL_CAPTURE,
FP_ENROLL_GET_IMG,
FP_ENROLL_UPDATE,
FP_ENROLL_COMPLETE,
FP_ENROLL_CHECK_DUPLICATE,
FP_ENROLL_BINDID,
FP_ENROLL_COMMIT,
FP_ENROLL_DICARD,
FP_ENROLL_CLEANUP,
FP_ENROLL_NUM_STATES,
} FpEnrollState;
typedef enum {
FP_VERIFY_CAPTURE = 0,
FP_VERIFY_GET_IMG,
FP_VERIFY_IDENTIFY,
FP_VERIFY_CANCEL,
FP_VERIFY_NUM_STATES,
} FpVerifyState;
typedef enum {
FP_CLEAR_DELETE_DB = 0,
FP_CLEAR_CREATE_DB,
FP_CLEAR_NUM_STATES,
} FpClearState;

View File

@@ -661,7 +661,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
/* */ /* */
if (resp->result >= GX_FAILED) if (resp->result >= GX_FAILED)
{ {
fp_info ("Capture sample failed, result: 0x%x", resp->result); fp_warn ("Capture sample failed, result: 0x%x", resp->result);
fpi_device_enroll_progress (FP_DEVICE (self), fpi_device_enroll_progress (FP_DEVICE (self),
self->enroll_stage, self->enroll_stage,
NULL, NULL,
@@ -675,7 +675,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
if ((resp->capture_data_resp.img_quality < self->sensorcfg->config[4]) || if ((resp->capture_data_resp.img_quality < self->sensorcfg->config[4]) ||
(resp->capture_data_resp.img_coverage < self->sensorcfg->config[5])) (resp->capture_data_resp.img_coverage < self->sensorcfg->config[5]))
{ {
fp_info ("Capture sample poor quality(%d): %d or coverage(%d): %d", fp_warn ("Capture sample poor quality(%d): %d or coverage(%d): %d",
self->sensorcfg->config[4], self->sensorcfg->config[4],
resp->capture_data_resp.img_quality, resp->capture_data_resp.img_quality,
self->sensorcfg->config[5], self->sensorcfg->config[5],
@@ -1041,47 +1041,6 @@ fp_init_config_cb (FpiDeviceGoodixMoc *self,
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
} }
static void
fp_init_cb_reset_or_complete (FpiDeviceGoodixMoc *self,
gxfp_cmd_response_t *resp,
GError *error)
{
if (error)
{
fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message);
fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized.");
fpi_ssm_jump_to_state (self->task_ssm, FP_INIT_RESET_DEVICE);
}
else
{
fpi_ssm_mark_completed (self->task_ssm);
}
}
static void
fp_init_reset_device_cb (FpiDeviceGoodixMoc *self,
gxfp_cmd_response_t *resp,
GError *error)
{
if (error)
{
fp_warn ("Reset failed: %s", error->message);
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
if ((resp->result >= GX_FAILED) && (resp->result != GX_ERROR_FINGER_ID_NOEXIST))
{
fp_warn ("Reset failed, device reported: 0x%x", resp->result);
fpi_ssm_mark_failed (self->task_ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Failed clear storage, result: 0x%x",
resp->result));
return;
}
fp_warn ("Reset completed");
fpi_ssm_mark_completed (self->task_ssm);
}
static void static void
fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device) fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
@@ -1106,30 +1065,6 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
sizeof (gxfp_sensor_cfg_t), sizeof (gxfp_sensor_cfg_t),
fp_init_config_cb); fp_init_config_cb);
break; break;
case FP_INIT_TEMPLATE_LIST:
/* List prints to check whether the template DB was corrupted.
* As of 2022-06-13 there is a known firmware issue that can cause the
* stored templates for Linux to be corrupted when the Windows storage
* area is initialized.
* In that case, we'll get a protocol failure trying to retrieve the
* list of prints.
*/
goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT,
FALSE,
(const guint8 *) &dummy,
1,
fp_init_cb_reset_or_complete);
break;
case FP_INIT_RESET_DEVICE:
fp_warn ("Resetting device storage, you will need to enroll all prints again!");
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
FALSE,
NULL,
0,
fp_init_reset_device_cb);
break;
} }
@@ -1359,18 +1294,12 @@ gx_fp_probe (FpDevice *device)
{ {
case 0x6496: case 0x6496:
case 0x60A2: case 0x60A2:
case 0x6014:
case 0x6094:
case 0x609C: case 0x609C:
case 0x631C:
case 0x634C:
case 0x6384:
case 0x639C: case 0x639C:
case 0x63AC: case 0x63AC:
case 0x63BC: case 0x63BC:
case 0x63CC: case 0x63CC:
case 0x6A94: case 0x6A94:
case 0x659A:
self->max_enroll_stage = 12; self->max_enroll_stage = 12;
break; break;
@@ -1601,13 +1530,8 @@ fpi_device_goodixmoc_init (FpiDeviceGoodixMoc *self)
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x5840, }, { .vid = 0x27c6, .pid = 0x5840, },
{ .vid = 0x27c6, .pid = 0x6014, },
{ .vid = 0x27c6, .pid = 0x6094, },
{ .vid = 0x27c6, .pid = 0x609C, }, { .vid = 0x27c6, .pid = 0x609C, },
{ .vid = 0x27c6, .pid = 0x60A2, }, { .vid = 0x27c6, .pid = 0x60A2, },
{ .vid = 0x27c6, .pid = 0x631C, },
{ .vid = 0x27c6, .pid = 0x634C, },
{ .vid = 0x27c6, .pid = 0x6384, },
{ .vid = 0x27c6, .pid = 0x639C, }, { .vid = 0x27c6, .pid = 0x639C, },
{ .vid = 0x27c6, .pid = 0x63AC, }, { .vid = 0x27c6, .pid = 0x63AC, },
{ .vid = 0x27c6, .pid = 0x63BC, }, { .vid = 0x27c6, .pid = 0x63BC, },
@@ -1617,7 +1541,6 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x658C, }, { .vid = 0x27c6, .pid = 0x658C, },
{ .vid = 0x27c6, .pid = 0x6592, }, { .vid = 0x27c6, .pid = 0x6592, },
{ .vid = 0x27c6, .pid = 0x6594, }, { .vid = 0x27c6, .pid = 0x6594, },
{ .vid = 0x27c6, .pid = 0x659A, },
{ .vid = 0x27c6, .pid = 0x659C, }, { .vid = 0x27c6, .pid = 0x659C, },
{ .vid = 0x27c6, .pid = 0x6A94, }, { .vid = 0x27c6, .pid = 0x6A94, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */

View File

@@ -35,8 +35,6 @@ typedef enum {
typedef enum { typedef enum {
FP_INIT_VERSION = 0, FP_INIT_VERSION = 0,
FP_INIT_CONFIG, FP_INIT_CONFIG,
FP_INIT_TEMPLATE_LIST,
FP_INIT_RESET_DEVICE,
FP_INIT_NUM_STATES, FP_INIT_NUM_STATES,
} FpInitState; } FpInitState;

View File

@@ -393,8 +393,10 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
fingerid_length, fingerid_length,
&presp->finger_list_resp.finger_list[num]) != 0) &presp->finger_list_resp.finger_list[num]) != 0)
{ {
g_warning ("Failed to parse finger list"); g_error ("parse fingerlist error");
return -1; presp->finger_list_resp.finger_num = 0;
presp->result = GX_FAILED;
break;
} }
offset += fingerid_length; offset += fingerid_length;
} }

View File

@@ -43,8 +43,6 @@ static const FpIdEntry id_table[] = {
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };

View File

@@ -431,7 +431,6 @@ dev_deinit (FpImageDevice *dev)
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x0483, .pid = 0x2015, .driver_data = UPEKTC_2015 }, { .vid = 0x0483, .pid = 0x2015, .driver_data = UPEKTC_2015 },
{ .vid = 0x0483, .pid = 0x2017, .driver_data = UPEKTC_2015 },
{ .vid = 0x147e, .pid = 0x3001, .driver_data = UPEKTC_3001 }, { .vid = 0x147e, .pid = 0x3001, .driver_data = UPEKTC_3001 },
{ .vid = 0, .pid = 0, .driver_data = 0 }, { .vid = 0, .pid = 0, .driver_data = 0 },
}; };

View File

@@ -317,7 +317,6 @@ irq_handler (FpiUsbTransfer *transfer,
if (urudev->irqs_stopped_cb) if (urudev->irqs_stopped_cb)
urudev->irqs_stopped_cb (imgdev); urudev->irqs_stopped_cb (imgdev);
urudev->irqs_stopped_cb = NULL; urudev->irqs_stopped_cb = NULL;
g_clear_error (&error);
return; return;
} }
else if (error) else if (error)
@@ -552,7 +551,7 @@ image_transfer_cb (FpiUsbTransfer *transfer, FpDevice *dev,
} }
else else
{ {
self->img_data = g_memdup2 (transfer->buffer, sizeof (struct uru4k_image)); self->img_data = g_memdup (transfer->buffer, sizeof (struct uru4k_image));
self->img_data_actual_length = transfer->actual_length; self->img_data_actual_length = transfer->actual_length;
fpi_ssm_next_state (ssm); fpi_ssm_next_state (ssm);
} }
@@ -1414,9 +1413,6 @@ dev_deinit (FpImageDevice *dev)
SECITEM_FreeItem (self->param, PR_TRUE); SECITEM_FreeItem (self->param, PR_TRUE);
if (self->slot) if (self->slot)
PK11_FreeSlot (self->slot); PK11_FreeSlot (self->slot);
NSS_Shutdown ();
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)),
self->interface, 0, &error); self->interface, 0, &error);
g_clear_pointer (&self->rand, g_rand_free); g_clear_pointer (&self->rand, g_rand_free);

View File

@@ -581,7 +581,7 @@ activate_ssm (FpiSsm *ssm, FpDevice *dev)
/* Initialize fingerprint buffer */ /* Initialize fingerprint buffer */
g_free (self->lines_buffer); g_free (self->lines_buffer);
self->memory = VFS_USB_BUFFER_SIZE; self->memory = VFS_USB_BUFFER_SIZE;
self->lines_buffer = g_malloc0 (self->memory); self->lines_buffer = g_malloc (self->memory);
self->bytes = 0; self->bytes = 0;
/* Finger is on the scanner */ /* Finger is on the scanner */
@@ -589,15 +589,12 @@ activate_ssm (FpiSsm *ssm, FpDevice *dev)
} }
/* Increase buffer size while it's insufficient */ /* Increase buffer size while it's insufficient */
while (self->memory < self->bytes + VFS_USB_BUFFER_SIZE) while (self->bytes + VFS_USB_BUFFER_SIZE > self->memory)
{ {
int pre_memory = self->memory; self->memory <<= 1;
self->memory += VFS_USB_BUFFER_SIZE;
self->lines_buffer = self->lines_buffer =
(struct vfs_line *) g_realloc (self->lines_buffer, (struct vfs_line *) g_realloc (self->lines_buffer,
self->memory); self->memory);
memset ((guint8 *) self->lines_buffer + pre_memory, 0,
VFS_USB_BUFFER_SIZE);
} }
/* Receive chunk of data */ /* Receive chunk of data */

View File

@@ -432,7 +432,7 @@ img_process_data (int first_block, FpDeviceVfs301 *dev, const guint8 *buf, int l
usb_send (dev, data, len, NULL); \ usb_send (dev, data, len, NULL); \
} }
#define RAW_DATA(x) g_memdup2 (x, sizeof (x)), sizeof (x) #define RAW_DATA(x) g_memdup (x, sizeof (x)), sizeof (x)
#define IS_VFS301_FP_SEQ_START(b) ((b[0] == 0x01) && (b[1] == 0xfe)) #define IS_VFS301_FP_SEQ_START(b) ((b[0] == 0x01) && (b[1] == 0xfe))

View File

@@ -526,8 +526,8 @@ dev_verify (FpDevice *dev)
if (scan_id) if (scan_id)
{ {
g_autoptr(FpPrint) new_scan = NULL;
GVariant *data = NULL; GVariant *data = NULL;
FpPrint *new_scan;
FpPrint *print; FpPrint *print;
gboolean success; gboolean success;
@@ -556,7 +556,7 @@ dev_verify (FpDevice *dev)
self->match_reported = TRUE; self->match_reported = TRUE;
fpi_device_verify_report (dev, fpi_device_verify_report (dev,
success ? FPI_MATCH_SUCCESS : FPI_MATCH_FAIL, success ? FPI_MATCH_SUCCESS : FPI_MATCH_FAIL,
g_steal_pointer (&new_scan), new_scan,
NULL); NULL);
} }
} }

View File

@@ -291,10 +291,11 @@ fp_context_finalize (GObject *object)
FpContext *self = (FpContext *) object; FpContext *self = (FpContext *) object;
FpContextPrivate *priv = fp_context_get_instance_private (self); FpContextPrivate *priv = fp_context_get_instance_private (self);
g_clear_pointer (&priv->devices, g_ptr_array_unref);
g_cancellable_cancel (priv->cancellable); g_cancellable_cancel (priv->cancellable);
g_clear_object (&priv->cancellable); g_clear_object (&priv->cancellable);
g_clear_pointer (&priv->drivers, g_array_unref); g_clear_pointer (&priv->drivers, g_array_unref);
g_clear_pointer (&priv->devices, g_ptr_array_unref);
g_slist_free_full (g_steal_pointer (&priv->sources), (GDestroyNotify) g_source_destroy); g_slist_free_full (g_steal_pointer (&priv->sources), (GDestroyNotify) g_source_destroy);

View File

@@ -1172,6 +1172,10 @@ fp_device_enroll (FpDevice *device,
} }
} }
priv->current_action = FPI_DEVICE_ACTION_ENROLL;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
fpi_device_update_temp (device, TRUE); fpi_device_update_temp (device, TRUE);
if (priv->temp_current == FP_TEMPERATURE_HOT) if (priv->temp_current == FP_TEMPERATURE_HOT)
{ {
@@ -1180,10 +1184,6 @@ fp_device_enroll (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_ENROLL;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
data = g_new0 (FpEnrollData, 1); data = g_new0 (FpEnrollData, 1);
data->print = g_object_ref_sink (template_print); data->print = g_object_ref_sink (template_print);
data->enroll_progress_cb = progress_cb; data->enroll_progress_cb = progress_cb;
@@ -1273,6 +1273,10 @@ fp_device_verify (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_VERIFY;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
fpi_device_update_temp (device, TRUE); fpi_device_update_temp (device, TRUE);
if (priv->temp_current == FP_TEMPERATURE_HOT) if (priv->temp_current == FP_TEMPERATURE_HOT)
{ {
@@ -1281,10 +1285,6 @@ fp_device_verify (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_VERIFY;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
data = g_new0 (FpMatchData, 1); data = g_new0 (FpMatchData, 1);
data->enrolled_print = g_object_ref (enrolled_print); data->enrolled_print = g_object_ref (enrolled_print);
data->match_cb = match_cb; data->match_cb = match_cb;
@@ -1400,13 +1400,9 @@ fp_device_identify (FpDevice *device,
return; return;
} }
if (prints == NULL) priv->current_action = FPI_DEVICE_ACTION_IDENTIFY;
{ priv->current_task = g_steal_pointer (&task);
g_task_return_error (task, setup_task_cancellable (device);
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
"Invalid gallery array"));
return;
}
fpi_device_update_temp (device, TRUE); fpi_device_update_temp (device, TRUE);
if (priv->temp_current == FP_TEMPERATURE_HOT) if (priv->temp_current == FP_TEMPERATURE_HOT)
@@ -1416,10 +1412,6 @@ fp_device_identify (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_IDENTIFY;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
data = g_new0 (FpMatchData, 1); data = g_new0 (FpMatchData, 1);
/* We cannot store the gallery directly, because the ptr array may not own /* We cannot store the gallery directly, because the ptr array may not own
* a reference to each print. Also, the caller could in principle modify the * a reference to each print. Also, the caller could in principle modify the
@@ -1533,6 +1525,10 @@ fp_device_capture (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_CAPTURE;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
fpi_device_update_temp (device, TRUE); fpi_device_update_temp (device, TRUE);
if (priv->temp_current == FP_TEMPERATURE_HOT) if (priv->temp_current == FP_TEMPERATURE_HOT)
{ {
@@ -1541,10 +1537,6 @@ fp_device_capture (FpDevice *device,
return; return;
} }
priv->current_action = FPI_DEVICE_ACTION_CAPTURE;
priv->current_task = g_steal_pointer (&task);
setup_task_cancellable (device);
priv->wait_for_finger = wait_for_finger; priv->wait_for_finger = wait_for_finger;
cls->capture (device); cls->capture (device);

View File

@@ -20,7 +20,6 @@
#define FP_COMPONENT "image" #define FP_COMPONENT "image"
#include "fpi-compat.h"
#include "fpi-image.h" #include "fpi-image.h"
#include "fpi-log.h" #include "fpi-log.h"
@@ -296,7 +295,7 @@ fp_image_detect_minutiae_thread_func (GTask *task,
data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED); data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED);
lfsparms = g_memdup2 (&g_lfsparms_V2, sizeof (LFSPARMS)); lfsparms = g_memdup (&g_lfsparms_V2, sizeof (LFSPARMS));
lfsparms->remove_perimeter_pts = data->flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE; lfsparms->remove_perimeter_pts = data->flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE;
timer = g_timer_new (); timer = g_timer_new ();

View File

@@ -339,7 +339,7 @@ fp_print_init (FpPrint *self)
* create a new print, fill in the relevant metadata, and then start * create a new print, fill in the relevant metadata, and then start
* enrollment. * enrollment.
* *
* Returns: (transfer floating): A newly created #FpPrint * Returns: (transfer floating): A newyl created #FpPrint
*/ */
FpPrint * FpPrint *
fp_print_new (FpDevice *device) fp_print_new (FpDevice *device)

View File

@@ -1181,7 +1181,7 @@ fpi_byte_reader_dup_string_utf##bits (FpiByteReader * reader, type ** str) \
*str = NULL; \ *str = NULL; \
return FALSE; \ return FALSE; \
} \ } \
*str = g_memdup2 (reader->data + reader->byte, size); \ *str = g_memdup (reader->data + reader->byte, size); \
reader->byte += size; \ reader->byte += size; \
return TRUE; \ return TRUE; \
} }

View File

@@ -22,7 +22,6 @@
#pragma once #pragma once
#include <glib.h> #include <glib.h>
#include "fpi-compat.h"
#include "fpi-byte-utils.h" #include "fpi-byte-utils.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -361,7 +360,7 @@ static inline guint8 *
fpi_byte_reader_dup_data_unchecked (FpiByteReader * reader, guint size) fpi_byte_reader_dup_data_unchecked (FpiByteReader * reader, guint size)
{ {
gconstpointer data = fpi_byte_reader_get_data_unchecked (reader, size); gconstpointer data = fpi_byte_reader_get_data_unchecked (reader, size);
return (guint8 *) g_memdup2 (data, size); return (guint8 *) g_memdup (data, size);
} }
/* Unchecked variants that should not be used */ /* Unchecked variants that should not be used */

View File

@@ -211,7 +211,7 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer)
data = (guint8 *) writer->parent.data; data = (guint8 *) writer->parent.data;
if (!writer->owned) if (!writer->owned)
data = g_memdup2 (data, writer->parent.size); data = g_memdup (data, writer->parent.size);
writer->parent.data = NULL; writer->parent.data = NULL;
fpi_byte_writer_reset (writer); fpi_byte_writer_reset (writer);

View File

@@ -39,17 +39,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpDeviceClass, g_type_class_unref);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GDate, g_date_free); G_DEFINE_AUTOPTR_CLEANUP_FUNC (GDate, g_date_free);
#endif #endif
#if !GLIB_CHECK_VERSION (2, 68, 0)
#define g_memdup2(data, size) g_memdup ((data), (size))
#else
#define g_memdup2(data, size) \
(G_GNUC_EXTENSION ({ \
G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
g_memdup2 ((data), (size)); \
G_GNUC_END_IGNORE_DEPRECATIONS \
}))
#endif
#if __GNUC__ > 10 || (__GNUC__ == 10 && __GNUC_MINOR__ >= 1) #if __GNUC__ > 10 || (__GNUC__ == 10 && __GNUC_MINOR__ >= 1)
#define FP_GNUC_ACCESS(m, p, s) __attribute__((access (m, p, s))) #define FP_GNUC_ACCESS(m, p, s) __attribute__((access (m, p, s)))
#else #else

View File

@@ -21,7 +21,6 @@
#define FP_COMPONENT "device" #define FP_COMPONENT "device"
#include <math.h> #include <math.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h>
#include "fpi-log.h" #include "fpi-log.h"
@@ -622,14 +621,7 @@ fpi_device_get_verify_data (FpDevice *device,
* @device: The #FpDevice * @device: The #FpDevice
* @prints: (out) (transfer none) (element-type FpPrint): The gallery of prints * @prints: (out) (transfer none) (element-type FpPrint): The gallery of prints
* *
* Get prints gallery for identification. * Get data for identify.
*
* The @prints array is always non-%NULL and may contain a list of #FpPrint's
* that the device should match against.
*
* Note that @prints can be an empty array, in such case the device is expected
* to report the scanned print matching the one in its internal storage, if any.
*
*/ */
void void
fpi_device_get_identify_data (FpDevice *device, fpi_device_get_identify_data (FpDevice *device,
@@ -1319,14 +1311,12 @@ fpi_device_enroll_complete (FpDevice *device, FpPrint *print, GError *error)
* @device: The #FpDevice * @device: The #FpDevice
* @error: A #GError if result is %FPI_MATCH_ERROR * @error: A #GError if result is %FPI_MATCH_ERROR
* *
* Finish an ongoing verify operation. * Finish an ongoing verify operation. The returned print should be
* representing the new scan and not the one passed for verification.
* *
* Note that @error should only be set for actual errors. In the case * Note that @error should only be set for actual errors. In the case
* of retry errors, report these using fpi_device_verify_report() * of retry errors, report these using fpi_device_verify_report()
* and then call this function without any error argument. * and then call this function without any error argument.
*
* If @error is not set, we expect that a result (and print, in case)
* have been already reported via fpi_device_verify_report().
*/ */
void void
fpi_device_verify_complete (FpDevice *device, fpi_device_verify_complete (FpDevice *device,
@@ -1384,14 +1374,9 @@ fpi_device_verify_complete (FpDevice *device,
* @device: The #FpDevice * @device: The #FpDevice
* @error: The #GError or %NULL on success * @error: The #GError or %NULL on success
* *
* Finish an ongoing identify operation. * Finish an ongoing identify operation. The match that was identified is
* * returned in @match. The @print parameter returns the newly created scan
* Note that @error should only be set for actual errors. In the case * that was used for matching.
* of retry errors, report these using fpi_device_identify_report()
* and then call this function without any error argument.
*
* If @error is not set, we expect that a match and / or a print have been
* already reported via fpi_device_identify_report()
*/ */
void void
fpi_device_identify_complete (FpDevice *device, fpi_device_identify_complete (FpDevice *device,
@@ -1610,13 +1595,11 @@ update_attr (const char *attr, const char *value)
static void static void
complete_suspend_resume_task (FpDevice *device) complete_suspend_resume_task (FpDevice *device)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
g_assert (priv->suspend_resume_task); g_assert (priv->suspend_resume_task);
task = g_steal_pointer (&priv->suspend_resume_task);
g_task_return_boolean (task, TRUE); g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE);
} }
void void
@@ -1720,9 +1703,9 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
case FP_DEVICE_TYPE_USB: case FP_DEVICE_TYPE_USB:
{ {
g_autoptr(GString) ports = NULL; g_autoptr(GString) ports = NULL;
g_autoptr(GUsbDevice) dev = NULL; GUsbDevice *dev, *parent;
const char *wakeup_command = enabled ? "enabled" : "disabled"; const char *wakeup_command = enabled ? "enabled" : "disabled";
guint8 bus; guint8 bus, port;
g_autofree gchar *sysfs_wakeup = NULL; g_autofree gchar *sysfs_wakeup = NULL;
g_autofree gchar *sysfs_persist = NULL; g_autofree gchar *sysfs_persist = NULL;
int res; int res;
@@ -1731,20 +1714,12 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
bus = g_usb_device_get_bus (priv->usb_device); bus = g_usb_device_get_bus (priv->usb_device);
/* Walk up, skipping the root hub. */ /* Walk up, skipping the root hub. */
g_set_object (&dev, priv->usb_device); dev = priv->usb_device;
while (TRUE) while ((parent = g_usb_device_get_parent (dev)))
{ {
g_autoptr(GUsbDevice) parent = g_usb_device_get_parent (dev);
g_autofree gchar *port_str = NULL;
guint8 port;
if (!parent)
break;
port = g_usb_device_get_port_number (dev); port = g_usb_device_get_port_number (dev);
port_str = g_strdup_printf ("%d.", port); g_string_prepend (ports, g_strdup_printf ("%d.", port));
g_string_prepend (ports, port_str); dev = parent;
g_set_object (&dev, parent);
} }
g_string_set_size (ports, ports->len - 1); g_string_set_size (ports, ports->len - 1);
@@ -1781,7 +1756,6 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
static void static void
fpi_device_suspend_completed (FpDevice *device) fpi_device_suspend_completed (FpDevice *device)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
/* We have an ongoing operation, allow the device to wake up the machine. */ /* We have an ongoing operation, allow the device to wake up the machine. */
@@ -1791,12 +1765,11 @@ fpi_device_suspend_completed (FpDevice *device)
if (priv->critical_section) if (priv->critical_section)
g_warning ("Driver was in a critical section at suspend time. It likely deadlocked!"); g_warning ("Driver was in a critical section at suspend time. It likely deadlocked!");
task = g_steal_pointer (&priv->suspend_resume_task);
if (priv->suspend_error) if (priv->suspend_error)
g_task_return_error (task, g_steal_pointer (&priv->suspend_error)); g_task_return_error (g_steal_pointer (&priv->suspend_resume_task),
g_steal_pointer (&priv->suspend_error));
else else
g_task_return_boolean (task, TRUE); g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE);
} }
/** /**
@@ -1824,12 +1797,11 @@ fpi_device_suspend_complete (FpDevice *device,
g_return_if_fail (priv->suspend_resume_task); g_return_if_fail (priv->suspend_resume_task);
g_return_if_fail (priv->suspend_error == NULL); g_return_if_fail (priv->suspend_error == NULL);
priv->suspend_error = g_steal_pointer (&error); priv->suspend_error = error;
priv->is_suspended = TRUE; priv->is_suspended = TRUE;
/* If there is no error, we have no running task, return immediately. */ /* If there is no error, we have no running task, return immediately. */
if (!priv->suspend_error || !priv->current_task || if (error == NULL || !priv->current_task || g_task_get_completed (priv->current_task))
g_task_get_completed (priv->current_task))
{ {
fpi_device_suspend_completed (device); fpi_device_suspend_completed (device);
return; return;
@@ -1861,7 +1833,6 @@ void
fpi_device_resume_complete (FpDevice *device, fpi_device_resume_complete (FpDevice *device,
GError *error) GError *error)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
g_return_if_fail (FP_IS_DEVICE (device)); g_return_if_fail (FP_IS_DEVICE (device));
@@ -1870,12 +1841,10 @@ fpi_device_resume_complete (FpDevice *device,
priv->is_suspended = FALSE; priv->is_suspended = FALSE;
fpi_device_configure_wakeup (device, FALSE); fpi_device_configure_wakeup (device, FALSE);
task = g_steal_pointer (&priv->suspend_resume_task);
if (error) if (error)
g_task_return_error (task, error); g_task_return_error (g_steal_pointer (&priv->suspend_resume_task), error);
else else
g_task_return_boolean (task, TRUE); g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE);
} }
/** /**
@@ -2032,26 +2001,12 @@ fpi_device_verify_report (FpDevice *device,
* fpi_device_identify_report: * fpi_device_identify_report:
* @device: The #FpDevice * @device: The #FpDevice
* @match: (transfer none): The #FpPrint from the gallery that matched * @match: (transfer none): The #FpPrint from the gallery that matched
* @print: (transfer floating): The scanned #FpPrint, set in the absence * @print: (transfer floating): The scanned #FpPrint
* of an error. * @error: A #GError if result is %FPI_MATCH_ERROR
* @error: A #GError of %FP_DEVICE_RETRY type if @match and @print are unset.
* *
* Report the results of an identify operation. * Report the result of a identify operation. Note that the passed @error must be
* * a retry error with the %FP_DEVICE_RETRY domain. For all other error cases,
* In case of successful identification @match is expected to be set to a * the error should passed to fpi_device_identify_complete().
* #FpPrint that matches one from the provided gallery, while @print
* represents the scanned print and will be different.
*
* If there are no errors, it's expected that the device always reports the
* recognized @print even if there is no @match with the provided gallery (that
* can be potentially empty). This is required for application logic further
* up in the stack, such as for enroll-duplicate checking. @print needs to be
* sufficiently filled to do a comparison.
*
* In case of error, both @match and @print are expected to be %NULL.
* Note that the passed @error must be a retry error from the %FP_DEVICE_RETRY
* domain. For all other error cases, the error should passed to
* fpi_device_identify_complete().
*/ */
void void
fpi_device_identify_report (FpDevice *device, fpi_device_identify_report (FpDevice *device,

View File

@@ -277,7 +277,7 @@ fpi_image_device_minutiae_detected (GObject *source_object, GAsyncResult *res, g
{ {
print = fp_print_new (device); print = fp_print_new (device);
fpi_print_set_type (print, FPI_PRINT_NBIS); fpi_print_set_type (print, FPI_PRINT_NBIS);
if (!fpi_print_add_from_image (print, image, &error)) if (!fpi_print_add_from_image (print, image, priv->bz3_threshold, &error))
{ {
g_clear_object (&print); g_clear_object (&print);

View File

@@ -50,7 +50,7 @@ fpi_print_add_print (FpPrint *print, FpPrint *add)
g_return_if_fail (add->type == FPI_PRINT_NBIS); g_return_if_fail (add->type == FPI_PRINT_NBIS);
g_assert (add->prints->len == 1); g_assert (add->prints->len == 1);
g_ptr_array_add (print->prints, g_memdup2 (add->prints->pdata[0], sizeof (struct xyt_struct))); g_ptr_array_add (print->prints, g_memdup (add->prints->pdata[0], sizeof (struct xyt_struct)));
} }
/** /**
@@ -154,11 +154,14 @@ minutiae_to_xyt (struct fp_minutiae *minutiae,
gboolean gboolean
fpi_print_add_from_image (FpPrint *print, fpi_print_add_from_image (FpPrint *print,
FpImage *image, FpImage *image,
gint bz3_threshold,
GError **error) GError **error)
{ {
g_autofree struct xyt_struct *xyt = NULL;
GPtrArray *minutiae; GPtrArray *minutiae;
struct fp_minutiae _minutiae; struct fp_minutiae _minutiae;
struct xyt_struct *xyt; gint probe_len;
gint score;
if (print->type != FPI_PRINT_NBIS || !image) if (print->type != FPI_PRINT_NBIS || !image)
{ {
@@ -173,8 +176,8 @@ fpi_print_add_from_image (FpPrint *print,
if (!minutiae || minutiae->len == 0) if (!minutiae || minutiae->len == 0)
{ {
g_set_error (error, g_set_error (error,
G_IO_ERROR, FP_DEVICE_RETRY,
G_IO_ERROR_INVALID_DATA, FP_DEVICE_RETRY_GENERAL,
"No minutiae found in image or not yet detected!"); "No minutiae found in image or not yet detected!");
return FALSE; return FALSE;
} }
@@ -185,7 +188,20 @@ fpi_print_add_from_image (FpPrint *print,
xyt = g_new0 (struct xyt_struct, 1); xyt = g_new0 (struct xyt_struct, 1);
minutiae_to_xyt (&_minutiae, image->width, image->height, xyt); minutiae_to_xyt (&_minutiae, image->width, image->height, xyt);
g_ptr_array_add (print->prints, xyt);
probe_len = bozorth_probe_init (xyt);
score = bozorth_to_gallery (probe_len, xyt, xyt);
fp_dbg ("self-match score %d/%d", score, bz3_threshold);
if (score <= bz3_threshold)
{
g_set_error (error,
FP_DEVICE_RETRY,
FP_DEVICE_RETRY_GENERAL,
"Not enough minutiae to generate a match!");
return FPI_MATCH_SUCCESS;
}
g_ptr_array_add (print->prints, g_steal_pointer (&xyt));
g_clear_object (&print->image); g_clear_object (&print->image);
print->image = g_object_ref (image); print->image = g_object_ref (image);

View File

@@ -40,10 +40,11 @@ void fpi_print_set_device_stored (FpPrint *print,
gboolean fpi_print_add_from_image (FpPrint *print, gboolean fpi_print_add_from_image (FpPrint *print,
FpImage *image, FpImage *image,
gint bz3_threshold,
GError **error); GError **error);
FpiMatchResult fpi_print_bz3_match (FpPrint *temp, FpiMatchResult fpi_print_bz3_match (FpPrint * template,
FpPrint *print, FpPrint * print,
gint bz3_threshold, gint bz3_threshold,
GError **error); GError **error);

View File

@@ -29,19 +29,12 @@ static const FpIdEntry whitelist_id_table[] = {
* You can generate this list from the wiki page using e.g.: * You can generate this list from the wiki page using e.g.:
* gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p' * gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
*/ */
{ .vid = 0x04e8, .pid = 0x730b },
{ .vid = 0x04f3, .pid = 0x036b }, { .vid = 0x04f3, .pid = 0x036b },
{ .vid = 0x04f3, .pid = 0x0c00 }, { .vid = 0x04f3, .pid = 0x0c00 },
{ .vid = 0x04f3, .pid = 0x0c4c }, { .vid = 0x04f3, .pid = 0x0c4c },
{ .vid = 0x04f3, .pid = 0x0c57 }, { .vid = 0x04f3, .pid = 0x0c57 },
{ .vid = 0x04f3, .pid = 0x0c5e }, { .vid = 0x04f3, .pid = 0x0c5e },
{ .vid = 0x04f3, .pid = 0x0c5a },
{ .vid = 0x04f3, .pid = 0x0c70 },
{ .vid = 0x04f3, .pid = 0x0c72 },
{ .vid = 0x04f3, .pid = 0x2706 }, { .vid = 0x04f3, .pid = 0x2706 },
{ .vid = 0x04f3, .pid = 0x3057 },
{ .vid = 0x04f3, .pid = 0x3104 },
{ .vid = 0x04f3, .pid = 0x310d },
{ .vid = 0x06cb, .pid = 0x0081 }, { .vid = 0x06cb, .pid = 0x0081 },
{ .vid = 0x06cb, .pid = 0x0088 }, { .vid = 0x06cb, .pid = 0x0088 },
{ .vid = 0x06cb, .pid = 0x008a }, { .vid = 0x06cb, .pid = 0x008a },
@@ -58,7 +51,6 @@ static const FpIdEntry whitelist_id_table[] = {
{ .vid = 0x06cb, .pid = 0x00d8 }, { .vid = 0x06cb, .pid = 0x00d8 },
{ .vid = 0x06cb, .pid = 0x00da }, { .vid = 0x06cb, .pid = 0x00da },
{ .vid = 0x06cb, .pid = 0x00dc }, { .vid = 0x06cb, .pid = 0x00dc },
{ .vid = 0x06cb, .pid = 0x00e4 },
{ .vid = 0x06cb, .pid = 0x00e7 }, { .vid = 0x06cb, .pid = 0x00e7 },
{ .vid = 0x06cb, .pid = 0x00e9 }, { .vid = 0x06cb, .pid = 0x00e9 },
{ .vid = 0x06cb, .pid = 0x00fd }, { .vid = 0x06cb, .pid = 0x00fd },
@@ -74,7 +66,6 @@ static const FpIdEntry whitelist_id_table[] = {
{ .vid = 0x0bda, .pid = 0x5812 }, { .vid = 0x0bda, .pid = 0x5812 },
{ .vid = 0x10a5, .pid = 0x0007 }, { .vid = 0x10a5, .pid = 0x0007 },
{ .vid = 0x10a5, .pid = 0x9200 }, { .vid = 0x10a5, .pid = 0x9200 },
{ .vid = 0x10a5, .pid = 0x9800 },
{ .vid = 0x1188, .pid = 0x9545 }, { .vid = 0x1188, .pid = 0x9545 },
{ .vid = 0x138a, .pid = 0x0007 }, { .vid = 0x138a, .pid = 0x0007 },
{ .vid = 0x138a, .pid = 0x003a }, { .vid = 0x138a, .pid = 0x003a },
@@ -96,32 +87,24 @@ static const FpIdEntry whitelist_id_table[] = {
{ .vid = 0x27c6, .pid = 0x5042 }, { .vid = 0x27c6, .pid = 0x5042 },
{ .vid = 0x27c6, .pid = 0x5110 }, { .vid = 0x27c6, .pid = 0x5110 },
{ .vid = 0x27c6, .pid = 0x5117 }, { .vid = 0x27c6, .pid = 0x5117 },
{ .vid = 0x27c6, .pid = 0x5120 },
{ .vid = 0x27c6, .pid = 0x5125 },
{ .vid = 0x27c6, .pid = 0x5201 }, { .vid = 0x27c6, .pid = 0x5201 },
{ .vid = 0x27c6, .pid = 0x521d }, { .vid = 0x27c6, .pid = 0x521d },
{ .vid = 0x27c6, .pid = 0x5301 }, { .vid = 0x27c6, .pid = 0x5301 },
{ .vid = 0x27c6, .pid = 0x530c }, { .vid = 0x27c6, .pid = 0x530c },
{ .vid = 0x27c6, .pid = 0x532d }, { .vid = 0x27c6, .pid = 0x532d },
{ .vid = 0x27c6, .pid = 0x5335 },
{ .vid = 0x27c6, .pid = 0x533c }, { .vid = 0x27c6, .pid = 0x533c },
{ .vid = 0x27c6, .pid = 0x5381 }, { .vid = 0x27c6, .pid = 0x5381 },
{ .vid = 0x27c6, .pid = 0x5385 }, { .vid = 0x27c6, .pid = 0x5385 },
{ .vid = 0x27c6, .pid = 0x538c }, { .vid = 0x27c6, .pid = 0x538c },
{ .vid = 0x27c6, .pid = 0x538d }, { .vid = 0x27c6, .pid = 0x538d },
{ .vid = 0x27c6, .pid = 0x5395 }, { .vid = 0x27c6, .pid = 0x5395 },
{ .vid = 0x27c6, .pid = 0x5503 },
{ .vid = 0x27c6, .pid = 0x550a },
{ .vid = 0x27c6, .pid = 0x550c },
{ .vid = 0x27c6, .pid = 0x5584 }, { .vid = 0x27c6, .pid = 0x5584 },
{ .vid = 0x27c6, .pid = 0x55a2 }, { .vid = 0x27c6, .pid = 0x55a2 },
{ .vid = 0x27c6, .pid = 0x55a4 }, { .vid = 0x27c6, .pid = 0x55a4 },
{ .vid = 0x27c6, .pid = 0x55b4 }, { .vid = 0x27c6, .pid = 0x55b4 },
{ .vid = 0x27c6, .pid = 0x5740 }, { .vid = 0x27c6, .pid = 0x5740 },
{ .vid = 0x27c6, .pid = 0x5e0a }, { .vid = 0x27c6, .pid = 0x5e0a },
{ .vid = 0x27c6, .pid = 0x581a },
{ .vid = 0x2808, .pid = 0x9338 }, { .vid = 0x2808, .pid = 0x9338 },
{ .vid = 0x2808, .pid = 0x93a9 },
{ .vid = 0x298d, .pid = 0x2020 }, { .vid = 0x298d, .pid = 0x2020 },
{ .vid = 0x298d, .pid = 0x2033 }, { .vid = 0x298d, .pid = 0x2033 },
{ .vid = 0x3538, .pid = 0x0930 }, { .vid = 0x3538, .pid = 0x0930 },

View File

@@ -139,8 +139,6 @@ driver_sources = {
[ 'drivers/synaptics/synaptics.c', 'drivers/synaptics/bmkt_message.c' ], [ 'drivers/synaptics/synaptics.c', 'drivers/synaptics/bmkt_message.c' ],
'goodixmoc' : 'goodixmoc' :
[ 'drivers/goodixmoc/goodix.c', 'drivers/goodixmoc/goodix_proto.c' ], [ 'drivers/goodixmoc/goodix.c', 'drivers/goodixmoc/goodix_proto.c' ],
'fpcmoc' :
[ 'drivers/fpcmoc/fpc.c' ],
} }
helper_sources = { helper_sources = {
@@ -332,7 +330,7 @@ if install_udev_rules
) )
endif endif
sync_udev_udb = custom_target('sync-udev-hwdb', custom_target('sync-udev-hwdb',
depends: udev_hwdb_generator, depends: udev_hwdb_generator,
output: 'sync-udev-hwdb', output: 'sync-udev-hwdb',
install: false, install: false,
@@ -343,8 +341,6 @@ sync_udev_udb = custom_target('sync-udev-hwdb',
] ]
) )
alias_target('sync-udev-hwdb', sync_udev_udb)
supported_devices = executable('fprint-list-supported-devices', supported_devices = executable('fprint-list-supported-devices',
'fprint-list-supported-devices.c', 'fprint-list-supported-devices.c',
dependencies: libfprint_private_dep, dependencies: libfprint_private_dep,

View File

@@ -1,31 +0,0 @@
From 2584d440afc87d463cb8dc809d48c660e091c2c4 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Thu, 23 Jun 2022 05:57:46 +0100
Subject: [PATCH] nbis: fix build on musl
Drop re-definition of stderr. There's no need for this anywhere
(including glibc). This breaks in particular on musl because
stderr (and stdin) are both const, and macros unlike in glibc.
Bug: https://bugs.gentoo.org/853811
---
nbis/include/bozorth.h | 2 --
1 file changed, 2 deletions(-)
diff --git a/nbis/include/bozorth.h b/nbis/include/bozorth.h
index a705da98..fd8975bf 100644
--- a/nbis/include/bozorth.h
+++ b/nbis/include/bozorth.h
@@ -217,8 +217,6 @@ struct xytq_struct {
/**************************************************************************/
/* Globals supporting command line options */
extern int verbose_threshold;
-/* Global supporting error reporting */
-extern FILE *stderr;
/**************************************************************************/
/* In: BZ_GBLS.C */
--
GitLab

View File

@@ -217,6 +217,8 @@ struct xytq_struct {
/**************************************************************************/ /**************************************************************************/
/* Globals supporting command line options */ /* Globals supporting command line options */
extern int verbose_threshold; extern int verbose_threshold;
/* Global supporting error reporting */
extern FILE *stderr;
/**************************************************************************/ /**************************************************************************/
/* In: BZ_GBLS.C */ /* In: BZ_GBLS.C */

View File

@@ -198,6 +198,3 @@ patch -p0 < fix-scan-build-reports.patch
# Add pass to remove perimeter points # Add pass to remove perimeter points
patch -p0 < remove-perimeter-pts.patch patch -p0 < remove-perimeter-pts.patch
# Fix build on musl by dropping unnecessary redeclaration of stderr
patch -p0 < fix-musl-build.patch

View File

@@ -1,5 +1,5 @@
project('libfprint', [ 'c', 'cpp' ], project('libfprint', [ 'c', 'cpp' ],
version: '1.94.4', version: '1.94.3',
license: 'LGPLv2.1+', license: 'LGPLv2.1+',
default_options: [ default_options: [
'buildtype=debugoptimized', 'buildtype=debugoptimized',
@@ -125,7 +125,6 @@ default_drivers = [
'upekts', 'upekts',
'goodixmoc', 'goodixmoc',
'nb1010', 'nb1010',
'fpcmoc',
# SPI # SPI
'elanspi', 'elanspi',

View File

@@ -120,7 +120,7 @@ nl_multi_line_cond true
# Not clear what to do about that... # Not clear what to do about that...
mod_full_brace_for Remove mod_full_brace_for Remove
mod_full_brace_if Remove mod_full_brace_if Remove
mod_full_brace_if_chain 1 mod_full_brace_if_chain True
mod_full_brace_while Remove mod_full_brace_while Remove
mod_full_brace_do Remove mod_full_brace_do Remove
mod_full_brace_nl 3 mod_full_brace_nl 3

View File

@@ -1,15 +1,10 @@
#!/usr/bin/python3 #!/usr/bin/python3
import cairo
import sys
import traceback
import gi import gi
gi.require_version('FPrint', '2.0') gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib from gi.repository import FPrint, GLib
import cairo
# Exit with error on any exception, included those happening in async callbacks import sys
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
if len(sys.argv) != 2: if len(sys.argv) != 2:
print("Please specify exactly one argument, the output location for the capture image") print("Please specify exactly one argument, the output location for the capture image")

Binary file not shown.

View File

@@ -1,15 +1,9 @@
#!/usr/bin/python3 #!/usr/bin/python3
import traceback
import sys
import gi import gi
gi.require_version('FPrint', '2.0') gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib from gi.repository import FPrint, GLib
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
ctx = GLib.main_context_default() ctx = GLib.main_context_default()
c = FPrint.Context() c = FPrint.Context()

View File

@@ -1,67 +1,63 @@
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9 P: /devices/pci0000:00/0000:00:14.0/usb1/1-1
N: bus/usb/001/003=1201000200000008F304880C04800102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001 N: bus/usb/001/010=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
E: DEVNAME=/dev/bus/usb/001/003 E: DEVNAME=/dev/bus/usb/001/010
E: DEVTYPE=usb_device E: DEVTYPE=usb_device
E: DRIVER=usb E: DRIVER=usb
E: PRODUCT=4f3/c88/8004 E: PRODUCT=4f3/c7e/305
E: TYPE=0/0/0 E: TYPE=0/0/0
E: BUSNUM=001 E: BUSNUM=001
E: DEVNUM=003 E: DEVNUM=010
E: MAJOR=189 E: MAJOR=189
E: MINOR=2 E: MINOR=9
E: SUBSYSTEM=usb E: SUBSYSTEM=usb
E: ID_VENDOR=ELAN E: ID_VENDOR=ELAN
E: ID_VENDOR_ENC=ELAN E: ID_VENDOR_ENC=ELAN
E: ID_VENDOR_ID=04f3 E: ID_VENDOR_ID=04f3
E: ID_MODEL=ELAN:ARM-M4 E: ID_MODEL=ELAN:ARM-M4
E: ID_MODEL_ENC=ELAN:ARM-M4 E: ID_MODEL_ENC=ELAN:ARM-M4
E: ID_MODEL_ID=0c88 E: ID_MODEL_ID=0c7e
E: ID_REVISION=8004 E: ID_REVISION=0305
E: ID_SERIAL=ELAN_ELAN:ARM-M4 E: ID_SERIAL=ELAN_ELAN:ARM-M4
E: ID_BUS=usb E: ID_BUS=usb
E: ID_USB_INTERFACES=:ff0000: E: ID_USB_INTERFACES=:ff0000:
E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp. E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp.
E: ID_PATH=pci-0000:00:14.0-usb-0:9 E: ID_PATH=pci-0000:00:14.0-usb-0:1
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1
E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_9
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
A: authorized=1\n A: authorized=1\n
A: avoid_reset_quirk=0\n A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n A: bConfigurationValue=1\n
A: bDeviceClass=00\n A: bDeviceClass=00\n
A: bDeviceProtocol=00\n A: bDeviceProtocol=00\n
A: bDeviceSubClass=00\n A: bDeviceSubClass=00\n
A: bMaxPacketSize0=8\n A: bMaxPacketSize0=64\n
A: bMaxPower=100mA\n A: bMaxPower=100mA\n
A: bNumConfigurations=1\n A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n A: bNumInterfaces= 1\n
A: bcdDevice=8004\n A: bcdDevice=0305\n
A: bmAttributes=a0\n A: bmAttributes=a0\n
A: busnum=1\n A: busnum=1\n
A: configuration= A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9\n
H: descriptors=1201000200000008F304880C04800102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001 H: descriptors=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
A: dev=189:2\n A: dev=189:9\n
A: devnum=3\n A: devnum=10\n
A: devpath=9\n A: devpath=1\n
L: driver=../../../../../bus/usb/drivers/usb L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3d/device:3e/device:47 A: idProduct=0c7e\n
A: idProduct=0c88\n
A: idVendor=04f3\n A: idVendor=04f3\n
A: ltm_capable=no\n A: ltm_capable=no\n
A: manufacturer=ELAN\n A: manufacturer=ELAN\n
A: maxchild=0\n A: maxchild=0\n
L: port=../1-0:1.0/usb1-port9 L: port=../1-0:1.0/usb1-port1
A: power/active_duration=35269124\n A: power/active_duration=94712\n
A: power/async=enabled\n A: power/async=enabled\n
A: power/autosuspend=2\n A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000\n A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=35283788\n A: power/connected_duration=94712\n
A: power/control=on\n A: power/control=on\n
A: power/level=on\n A: power/level=on\n
A: power/persist=0\n A: power/persist=1\n
A: power/runtime_active_kids=0\n A: power/runtime_active_kids=0\n
A: power/runtime_active_time=35276624\n A: power/runtime_active_time=94436\n
A: power/runtime_enabled=forbidden\n A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n A: power/runtime_suspended_time=0\n
@@ -81,40 +77,38 @@ A: removable=removable\n
A: rx_lanes=1\n A: rx_lanes=1\n
A: speed=12\n A: speed=12\n
A: tx_lanes=1\n A: tx_lanes=1\n
A: urbnum=2773\n A: urbnum=12\n
A: version= 2.00\n A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0/usb1 P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020015050302010109021900010100E0000904000001090000000705810304000C N: bus/usb/001/001=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
E: DEVNAME=/dev/bus/usb/001/001 E: DEVNAME=/dev/bus/usb/001/001
E: DEVTYPE=usb_device E: DEVTYPE=usb_device
E: DRIVER=usb E: DRIVER=usb
E: PRODUCT=1d6b/2/515 E: PRODUCT=1d6b/2/504
E: TYPE=9/0/1 E: TYPE=9/0/1
E: BUSNUM=001 E: BUSNUM=001
E: DEVNUM=001 E: DEVNUM=001
E: MAJOR=189 E: MAJOR=189
E: MINOR=0 E: MINOR=0
E: SUBSYSTEM=usb E: SUBSYSTEM=usb
E: ID_VENDOR=Linux_5.15.0-39-generic_xhci-hcd E: ID_VENDOR=Linux_5.4.0-42-generic_xhci-hcd
E: ID_VENDOR_ENC=Linux\x205.15.0-39-generic\x20xhci-hcd E: ID_VENDOR_ENC=Linux\x205.4.0-42-generic\x20xhci-hcd
E: ID_VENDOR_ID=1d6b E: ID_VENDOR_ID=1d6b
E: ID_MODEL=xHCI_Host_Controller E: ID_MODEL=xHCI_Host_Controller
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
E: ID_MODEL_ID=0002 E: ID_MODEL_ID=0002
E: ID_REVISION=0515 E: ID_REVISION=0504
E: ID_SERIAL=Linux_5.15.0-39-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 E: ID_SERIAL=Linux_5.4.0-42-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_SERIAL_SHORT=0000:00:14.0 E: ID_SERIAL_SHORT=0000:00:14.0
E: ID_BUS=usb E: ID_BUS=usb
E: ID_USB_INTERFACES=:090000: E: ID_USB_INTERFACES=:090000:
E: ID_VENDOR_FROM_DATABASE=Linux Foundation E: ID_VENDOR_FROM_DATABASE=Linux Foundation
E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=2.0 root hub E: ID_MODEL_FROM_DATABASE=2.0 root hub
E: ID_PATH=pci-0000:00:14.0 E: ID_PATH=pci-0000:00:14.0
E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat: E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
A: authorized=1\n A: authorized=1\n
A: authorized_default=1\n A: authorized_default=1\n
A: avoid_reset_quirk=0\n A: avoid_reset_quirk=0\n
@@ -126,31 +120,30 @@ A: bMaxPacketSize0=64\n
A: bMaxPower=0mA\n A: bMaxPower=0mA\n
A: bNumConfigurations=1\n A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n A: bNumInterfaces= 1\n
A: bcdDevice=0515\n A: bcdDevice=0504\n
A: bmAttributes=e0\n A: bmAttributes=e0\n
A: busnum=1\n A: busnum=1\n
A: configuration= A: configuration=\n
H: descriptors=12010002090001406B1D020015050302010109021900010100E0000904000001090000000705810304000C H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0\n A: dev=189:0\n
A: devnum=1\n A: devnum=1\n
A: devpath=0\n A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb L: driver=../../../../bus/usb/drivers/usb
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3d/device:3e
A: idProduct=0002\n A: idProduct=0002\n
A: idVendor=1d6b\n A: idVendor=1d6b\n
A: interface_authorized_default=1\n A: interface_authorized_default=1\n
A: ltm_capable=no\n A: ltm_capable=no\n
A: manufacturer=Linux 5.15.0-39-generic xhci-hcd\n A: manufacturer=Linux 5.4.0-42-generic xhci-hcd\n
A: maxchild=14\n A: maxchild=12\n
A: power/active_duration=35270364\n A: power/active_duration=74604360\n
A: power/async=enabled\n A: power/async=enabled\n
A: power/autosuspend=0\n A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0\n A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=35284300\n A: power/connected_duration=74606456\n
A: power/control=auto\n A: power/control=auto\n
A: power/level=auto\n A: power/level=auto\n
A: power/runtime_active_kids=2\n A: power/runtime_active_kids=4\n
A: power/runtime_active_time=35277420\n A: power/runtime_active_time=74605838\n
A: power/runtime_enabled=enabled\n A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n A: power/runtime_suspended_time=0\n
@@ -171,63 +164,62 @@ A: rx_lanes=1\n
A: serial=0000:00:14.0\n A: serial=0000:00:14.0\n
A: speed=480\n A: speed=480\n
A: tx_lanes=1\n A: tx_lanes=1\n
A: urbnum=549\n A: urbnum=490\n
A: version= 2.00\n A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0 P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd E: DRIVER=xhci_hcd
E: PCI_CLASS=C0330 E: PCI_CLASS=C0330
E: PCI_ID=8086:8C31 E: PCI_ID=8086:9DED
E: PCI_SUBSYS_ID=1043:201F E: PCI_SUBSYS_ID=103C:85EF
E: PCI_SLOT_NAME=0000:00:14.0 E: PCI_SLOT_NAME=0000:00:14.0
E: MODALIAS=pci:v00008086d00008C31sv00001043sd0000201Fbc0Csc03i30 E: MODALIAS=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30
E: SUBSYSTEM=pci E: SUBSYSTEM=pci
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
A: ari_enabled=0\n A: ari_enabled=0\n
A: broken_parity_status=0\n A: broken_parity_status=0\n
A: class=0x0c0330\n A: class=0x0c0330\n
H: config=8680318C060490020530030C000000000400A0F700000000000000000000000000000000000000000000000043101F200000000070000000000000000B010000FD01368089C60F8000000000000000009F6E8807000000000000000000000000302000000000000000000000000000000180C2C1080000000000000000000000050087000410E0FE000000002F00000000000000000000000000000000000000400100000000000000000000000000000F000100000000000000000000000000030420C0030C3000030C300000000000FF1A0000FF1A00003F0000003F000000A00000000000000000000000D8D8D8080000000000000000B10F060800000000 H: config=8680ED9D060490023030030C00008000040030A10000000000000000000000000000000000000000000000003C10EF85000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000181C030400000000316000000000000000000000000000000180C2C1080000000000000000000000059087007802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000B50F300112000000
A: consistent_dma_mask_bits=64\n A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1\n A: d3cold_allowed=1\n
A: device=0x8c31\n A: dbc=disabled\n
A: device=0x9ded\n
A: dma_mask_bits=64\n A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null)\n A: driver_override=(null)\n
A: enable=1\n A: enable=1\n
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3d A: irq=124\n
A: irq=31\n
A: local_cpulist=0-3\n A: local_cpulist=0-3\n
A: local_cpus=f\n A: local_cpus=f\n
A: modalias=pci:v00008086d00008C31sv00001043sd0000201Fbc0Csc03i30\n A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30\n
A: msi_bus=1\n A: msi_bus=1\n
A: msi_irqs/31=msi\n A: msi_irqs/124=msi\n
A: numa_node=-1\n A: numa_node=-1\n
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 5 6 2112 6\nxHCI ring segments 24 24 4096 24\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 3 32 128 1\nbuffer-32 0 0 32 0\n A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 54 54 4096 54\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 9 32 128 1\nbuffer-32 0 0 32 0\n
A: power/async=enabled\n A: power/async=enabled\n
A: power/control=on\n A: power/control=auto\n
A: power/runtime_active_kids=1\n A: power/runtime_active_kids=1\n
A: power/runtime_active_time=35278060\n A: power/runtime_active_time=74606194\n
A: power/runtime_enabled=forbidden\n A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n A: power/runtime_suspended_time=0\n
A: power/runtime_usage=1\n A: power/runtime_usage=0\n
A: power/wakeup=enabled\n A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0\n A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0\n A: power/wakeup_active=0\n
A: power/wakeup_active_count=5\n A: power/wakeup_active_count=0\n
A: power/wakeup_count=0\n A: power/wakeup_count=0\n
A: power/wakeup_expire_count=5\n A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=12694896\n A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=103\n A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=518\n A: power/wakeup_total_time_ms=0\n
A: power_state=D0\n A: resource=0x00000000a1300000 0x00000000a130ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: resource=0x00000000f7a00000 0x00000000f7a0ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n A: revision=0x30\n
A: revision=0x05\n A: subsystem_device=0x85ef\n
A: subsystem_device=0x201f\n A: subsystem_vendor=0x103c\n
A: subsystem_vendor=0x1043\n
A: vendor=0x8086\n A: vendor=0x8086\n

Binary file not shown.

View File

@@ -1,92 +0,0 @@
#!/usr/bin/python3
import traceback
import sys
import gi
gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
ctx = GLib.main_context_default()
c = FPrint.Context()
c.enumerate()
devices = c.get_devices()
d = devices[0]
del devices
assert d.get_driver() == "fpcmoc"
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
d.open_sync()
print("Clear")
d.clear_storage_sync()
print("Clear done")
template = FPrint.Print.new(d)
def enroll_progress(*args):
assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
print('enroll progress: ' + str(args))
def identify_done(dev, res):
global identified
identified = True
identify_match, identify_print = dev.identify_finish(res)
print('indentification_done: ', identify_match, identify_print)
assert identify_match.equal(identify_print)
# List, enroll, list, verify, identify, delete
print("enrolling")
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
p = d.enroll_sync(template, None, enroll_progress, None)
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
print("enroll done")
print("listing")
stored = d.list_prints_sync()
print("listing done")
assert len(stored) == 1
assert stored[0].equal(p)
print("verifying")
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
verify_res, verify_print = d.verify_sync(p)
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
print("verify done")
del p
assert verify_res == True
identified = False
deserialized_prints = []
for p in stored:
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
assert deserialized_prints[-1].equal(p)
del stored
print('async identifying')
d.identify(deserialized_prints, callback=identify_done)
del deserialized_prints
while not identified:
ctx.iteration(True)
print("deleting")
d.delete_print_sync(p)
print("delete done")
d.close_sync()
del d
del c

View File

@@ -1,234 +0,0 @@
P: /devices/pci0000:00/0000:00:14.0/usb1/1-1
N: bus/usb/001/019=1201000200000040A510E0FF10000102000109021900010104A0320904000001FFFFFF0507058102400000
E: DEVNAME=/dev/bus/usb/001/019
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=10a5/ffe0/10
E: TYPE=0/0/0
E: BUSNUM=001
E: DEVNUM=019
E: MAJOR=189
E: MINOR=18
E: SUBSYSTEM=usb
E: ID_VENDOR=FPC
E: ID_VENDOR_ENC=FPC
E: ID_VENDOR_ID=10a5
E: ID_MODEL=FPC_L:0001_FW:127010
E: ID_MODEL_ENC=FPC\x20L:0001\x20FW:127010
E: ID_MODEL_ID=ffe0
E: ID_REVISION=0010
E: ID_SERIAL=FPC_FPC_L:0001_FW:127010
E: ID_BUS=usb
E: ID_USB_INTERFACES=:ffffff:
E: ID_PATH=pci-0000:00:14.0-usb-0:1
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1
E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_1
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
A: authorized=1\n
A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n
A: bDeviceClass=00\n
A: bDeviceProtocol=00\n
A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64\n
A: bMaxPower=100mA\n
A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n
A: bcdDevice=0010\n
A: bmAttributes=a0\n
A: busnum=1\n
A: configuration=FPC\n
H: descriptors=1201000200000040A510E0FF10000102000109021900010104A0320904000001FFFFFF0507058102400000
A: dev=189:18\n
A: devnum=19\n
A: devpath=1\n
L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:1e
A: idProduct=ffe0\n
A: idVendor=10a5\n
A: ltm_capable=no\n
A: manufacturer=FPC\n
A: maxchild=0\n
L: port=../1-0:1.0/usb1-port1
A: power/active_duration=27204308\n
A: power/async=enabled\n
A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=27204308\n
A: power/control=on\n
A: power/level=on\n
A: power/persist=1\n
A: power/runtime_active_kids=0\n
A: power/runtime_active_time=27204033\n
A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=1\n
A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n
A: power/wakeup_active_count=\n
A: power/wakeup_count=\n
A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms=\n
A: product=FPC L:0001 FW:127010\n
A: quirks=0x0\n
A: removable=removable\n
A: rx_lanes=1\n
A: speed=12\n
A: tx_lanes=1\n
A: urbnum=31\n
A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
E: DEVNAME=/dev/bus/usb/001/001
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=1d6b/2/513
E: TYPE=9/0/1
E: BUSNUM=001
E: DEVNUM=001
E: MAJOR=189
E: MINOR=0
E: SUBSYSTEM=usb
E: ID_VENDOR=Linux_5.13.0-52-generic_xhci-hcd
E: ID_VENDOR_ENC=Linux\x205.13.0-52-generic\x20xhci-hcd
E: ID_VENDOR_ID=1d6b
E: ID_MODEL=xHCI_Host_Controller
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
E: ID_MODEL_ID=0002
E: ID_REVISION=0513
E: ID_SERIAL=Linux_5.13.0-52-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_SERIAL_SHORT=0000:00:14.0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:090000:
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=2.0 root hub
E: ID_PATH=pci-0000:00:14.0
E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
A: authorized=1\n
A: authorized_default=1\n
A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n
A: bDeviceClass=09\n
A: bDeviceProtocol=01\n
A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64\n
A: bMaxPower=0mA\n
A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n
A: bcdDevice=0513\n
A: bmAttributes=e0\n
A: busnum=1\n
A: configuration=
H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0\n
A: devnum=1\n
A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d
A: idProduct=0002\n
A: idVendor=1d6b\n
A: interface_authorized_default=1\n
A: ltm_capable=no\n
A: manufacturer=Linux 5.13.0-52-generic xhci-hcd\n
A: maxchild=12\n
A: power/active_duration=32728176\n
A: power/async=enabled\n
A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=32728176\n
A: power/control=auto\n
A: power/level=auto\n
A: power/runtime_active_kids=2\n
A: power/runtime_active_time=32728177\n
A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=0\n
A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n
A: power/wakeup_active_count=\n
A: power/wakeup_count=\n
A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms=\n
A: product=xHCI Host Controller\n
A: quirks=0x0\n
A: removable=unknown\n
A: rx_lanes=1\n
A: serial=0000:00:14.0\n
A: speed=480\n
A: tx_lanes=1\n
A: urbnum=1353\n
A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd
E: PCI_CLASS=C0330
E: PCI_ID=8086:9D2F
E: PCI_SUBSYS_ID=103C:8079
E: PCI_SLOT_NAME=0000:00:14.0
E: MODALIAS=pci:v00008086d00009D2Fsv0000103Csd00008079bc0Csc03i30
E: SUBSYSTEM=pci
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (EliteBook 840 G3)
A: ari_enabled=0\n
A: broken_parity_status=0\n
A: class=0x0c0330\n
H: config=86802F9D060490022130030C00008000040022E10000000000000000000000000000000000000000000000003C1079800000000070000000000000000B010000FD01348088C60F8000000000000000005F6ECE0F000000000000000000000000306000000000000000000000000000000180C2C1080000000000000000000000050087000480E0FE0000000022000000090014F01000400100000000C10A080000080400001800008F40020000010400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B30F400800000000
A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1\n
A: dbc=disabled\n
A: device=0x9d2f\n
A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null)\n
A: enable=1\n
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c
A: irq=122\n
A: local_cpulist=0-3\n
A: local_cpus=f\n
A: modalias=pci:v00008086d00009D2Fsv0000103Csd00008079bc0Csc03i30\n
A: msi_bus=1\n
A: msi_irqs/122=msi\n
A: numa_node=-1\n
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 14 2112 14\nxHCI ring segments 34 44 4096 44\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\n
A: power/async=enabled\n
A: power/control=auto\n
A: power/runtime_active_kids=1\n
A: power/runtime_active_time=32728973\n
A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=0\n
A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0\n
A: power/wakeup_active_count=0\n
A: power/wakeup_count=0\n
A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=0\n
A: power_state=D0\n
A: resource=0x00000000e1220000 0x00000000e122ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: revision=0x21\n
A: subsystem_device=0x8079\n
A: subsystem_vendor=0x103c\n
A: vendor=0x8086\n

Binary file not shown.

View File

@@ -1,15 +1,9 @@
#!/usr/bin/python3 #!/usr/bin/python3
import traceback
import sys
import gi import gi
gi.require_version('FPrint', '2.0') gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib from gi.repository import FPrint, GLib
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
ctx = GLib.main_context_default() ctx = GLib.main_context_default()
c = FPrint.Context() c = FPrint.Context()
@@ -31,13 +25,10 @@ assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
d.open_sync() d.open_sync()
# 1. verify clear storage command, 2. make sure later asserts are good
d.clear_storage_sync()
template = FPrint.Print.new(d) template = FPrint.Print.new(d)
def enroll_progress(*args): def enroll_progress(*args):
assert d.get_finger_status() & FPrint.FingerStatusFlags.NEEDED assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
print('enroll progress: ' + str(args)) print('enroll progress: ' + str(args))
def identify_done(dev, res): def identify_done(dev, res):

View File

@@ -1,14 +1,14 @@
P: /devices/pci0000:00/0000:00:14.0/usb1/1-3 P: /devices/pci0000:00/0000:00:14.0/usb1/1-3
N: bus/usb/001/023=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000 N: bus/usb/001/053=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
E: DEVNAME=/dev/bus/usb/001/023 E: DEVNAME=/dev/bus/usb/001/053
E: DEVTYPE=usb_device E: DEVTYPE=usb_device
E: DRIVER=usb E: DRIVER=usb
E: PRODUCT=27c6/6496/100 E: PRODUCT=27c6/6496/100
E: TYPE=239/0/0 E: TYPE=239/0/0
E: BUSNUM=001 E: BUSNUM=001
E: DEVNUM=023 E: DEVNUM=053
E: MAJOR=189 E: MAJOR=189
E: MINOR=22 E: MINOR=52
E: SUBSYSTEM=usb E: SUBSYSTEM=usb
E: ID_VENDOR=Goodix_Technology_Co.__Ltd. E: ID_VENDOR=Goodix_Technology_Co.__Ltd.
E: ID_VENDOR_ENC=Goodix\x20Technology\x20Co.\x2c\x20Ltd. E: ID_VENDOR_ENC=Goodix\x20Technology\x20Co.\x2c\x20Ltd.
@@ -23,7 +23,6 @@ E: ID_BUS=usb
E: ID_USB_INTERFACES=:ff0000: E: ID_USB_INTERFACES=:ff0000:
E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd. E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd.
E: ID_AUTOSUSPEND=1 E: ID_AUTOSUSPEND=1
E: ID_PERSIST=0
E: ID_PATH=pci-0000:00:14.0-usb-0:3 E: ID_PATH=pci-0000:00:14.0-usb-0:3
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3
A: authorized=1\n A: authorized=1\n
@@ -41,8 +40,8 @@ A: bmAttributes=a0\n
A: busnum=1\n A: busnum=1\n
A: configuration=XXXX_MOC_B0\n A: configuration=XXXX_MOC_B0\n
H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000 H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
A: dev=189:22\n A: dev=189:52\n
A: devnum=23\n A: devnum=53\n
A: devpath=3\n A: devpath=3\n
L: driver=../../../../../bus/usb/drivers/usb L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20 L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20
@@ -52,16 +51,16 @@ A: ltm_capable=no\n
A: manufacturer=Goodix Technology Co., Ltd.\n A: manufacturer=Goodix Technology Co., Ltd.\n
A: maxchild=0\n A: maxchild=0\n
L: port=../1-0:1.0/usb1-port3 L: port=../1-0:1.0/usb1-port3
A: power/active_duration=22667\n A: power/active_duration=29262\n
A: power/autosuspend=2\n A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000\n A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=917616\n A: power/connected_duration=57399\n
A: power/control=auto\n A: power/control=auto\n
A: power/level=auto\n A: power/level=auto\n
A: power/persist=1\n A: power/persist=1\n
A: power/runtime_active_time=22809\n A: power/runtime_active_time=29308\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=894564\n A: power/runtime_suspended_time=27850\n
A: power/wakeup=disabled\n A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n A: power/wakeup_active=\n
@@ -78,29 +77,29 @@ A: rx_lanes=1\n
A: serial=XXXX_MOC_B0\n A: serial=XXXX_MOC_B0\n
A: speed=12\n A: speed=12\n
A: tx_lanes=1\n A: tx_lanes=1\n
A: urbnum=298\n A: urbnum=394\n
A: version= 2.00\n A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0/usb1 P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020017050302010109021900010100E0000904000001090000000705810304000C N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
E: DEVNAME=/dev/bus/usb/001/001 E: DEVNAME=/dev/bus/usb/001/001
E: DEVTYPE=usb_device E: DEVTYPE=usb_device
E: DRIVER=usb E: DRIVER=usb
E: PRODUCT=1d6b/2/517 E: PRODUCT=1d6b/2/513
E: TYPE=9/0/1 E: TYPE=9/0/1
E: BUSNUM=001 E: BUSNUM=001
E: DEVNUM=001 E: DEVNUM=001
E: MAJOR=189 E: MAJOR=189
E: MINOR=0 E: MINOR=0
E: SUBSYSTEM=usb E: SUBSYSTEM=usb
E: ID_VENDOR=Linux_5.17.12-300.fc36.x86_64_xhci-hcd E: ID_VENDOR=Linux_5.13.15-200.fc34.x86_64_xhci-hcd
E: ID_VENDOR_ENC=Linux\x205.17.12-300.fc36.x86_64\x20xhci-hcd E: ID_VENDOR_ENC=Linux\x205.13.15-200.fc34.x86_64\x20xhci-hcd
E: ID_VENDOR_ID=1d6b E: ID_VENDOR_ID=1d6b
E: ID_MODEL=xHCI_Host_Controller E: ID_MODEL=xHCI_Host_Controller
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
E: ID_MODEL_ID=0002 E: ID_MODEL_ID=0002
E: ID_REVISION=0517 E: ID_REVISION=0513
E: ID_SERIAL=Linux_5.17.12-300.fc36.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 E: ID_SERIAL=Linux_5.13.15-200.fc34.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_SERIAL_SHORT=0000:00:14.0 E: ID_SERIAL_SHORT=0000:00:14.0
E: ID_BUS=usb E: ID_BUS=usb
E: ID_USB_INTERFACES=:090000: E: ID_USB_INTERFACES=:090000:
@@ -123,11 +122,11 @@ A: bMaxPacketSize0=64\n
A: bMaxPower=0mA\n A: bMaxPower=0mA\n
A: bNumConfigurations=1\n A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n A: bNumInterfaces= 1\n
A: bcdDevice=0517\n A: bcdDevice=0513\n
A: bmAttributes=e0\n A: bmAttributes=e0\n
A: busnum=1\n A: busnum=1\n
A: configuration=\n A: configuration=\n
H: descriptors=12010002090001406B1D020017050302010109021900010100E0000904000001090000000705810304000C H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0\n A: dev=189:0\n
A: devnum=1\n A: devnum=1\n
A: devpath=0\n A: devpath=0\n
@@ -137,15 +136,15 @@ A: idProduct=0002\n
A: idVendor=1d6b\n A: idVendor=1d6b\n
A: interface_authorized_default=1\n A: interface_authorized_default=1\n
A: ltm_capable=no\n A: ltm_capable=no\n
A: manufacturer=Linux 5.17.12-300.fc36.x86_64 xhci-hcd\n A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd\n
A: maxchild=12\n A: maxchild=12\n
A: power/active_duration=164289796\n A: power/active_duration=219578717\n
A: power/autosuspend=0\n A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0\n A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=164360220\n A: power/connected_duration=219649620\n
A: power/control=auto\n A: power/control=auto\n
A: power/level=auto\n A: power/level=auto\n
A: power/runtime_active_time=164331876\n A: power/runtime_active_time=219589127\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n A: power/runtime_suspended_time=0\n
A: power/wakeup=disabled\n A: power/wakeup=disabled\n
@@ -164,14 +163,14 @@ A: rx_lanes=1\n
A: serial=0000:00:14.0\n A: serial=0000:00:14.0\n
A: speed=480\n A: speed=480\n
A: tx_lanes=1\n A: tx_lanes=1\n
A: urbnum=2097\n A: urbnum=4325\n
A: version= 2.00\n A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0 P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd E: DRIVER=xhci_hcd
E: PCI_CLASS=C0330 E: PCI_CLASS=C0330
E: PCI_ID=8086:9DED E: PCI_ID=8086:9DED
E: PCI_SUBSYS_ID=17AA:2292 E: PCI_SUBSYS_ID=17AA:2292\n
E: PCI_SLOT_NAME=0000:00:14.0 E: PCI_SLOT_NAME=0000:00:14.0
E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30 E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30
E: SUBSYSTEM=pci E: SUBSYSTEM=pci
@@ -184,7 +183,7 @@ E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
A: ari_enabled=0\n A: ari_enabled=0\n
A: broken_parity_status=0\n A: broken_parity_status=0\n
A: class=0x0c0330\n A: class=0x0c0330\n
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000F507312600000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000 H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004C084B0100000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000
A: consistent_dma_mask_bits=64\n A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1\n A: d3cold_allowed=1\n
A: dbc=disabled\n A: dbc=disabled\n
@@ -202,8 +201,8 @@ A: msi_bus=1\n
A: msi_irqs/128=msi\n A: msi_irqs/128=msi\n
A: numa_node=-1\n A: numa_node=-1\n
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n
A: power/control=auto\n A: power/control=on\n
A: power/runtime_active_time=164332777\n A: power/runtime_active_time=219589302\n
A: power/runtime_status=active\n A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n A: power/runtime_suspended_time=0\n
A: power/wakeup=enabled\n A: power/wakeup=enabled\n

View File

@@ -1,19 +0,0 @@
{
<ignore_dl_open_leaks>
Memcheck:Leak
fun:malloc
...
fun:dlopen*
}
{
<ignore-gusb-get-string-desc-uninitialized-memory>
Memcheck:Param
socketcall.sendto(msg)
...
fun:send
...
fun:g_usb_device_get_string_descriptor
...
}

View File

@@ -39,7 +39,6 @@ drivers_tests = [
'goodixmoc', 'goodixmoc',
'nb1010', 'nb1010',
'egis0570', 'egis0570',
'fpcmoc',
] ]
if get_option('introspection') if get_option('introspection')
@@ -58,17 +57,16 @@ if get_option('introspection')
'virtual-device', 'virtual-device',
] ]
python3 = find_program('python3')
unittest_inspector = find_program('unittest_inspector.py') unittest_inspector = find_program('unittest_inspector.py')
umockdev_test = find_program('umockdev-test.py')
foreach vdtest: virtual_devices_tests foreach vdtest: virtual_devices_tests
driver_name = '_'.join(vdtest.split('-')) driver_name = '_'.join(vdtest.split('-'))
if driver_name in drivers if driver_name in drivers
python3 = find_program('python3')
base_args = files(vdtest + '.py') base_args = files(vdtest + '.py')
suite = ['virtual-driver'] suite = ['virtual-driver']
r = run_command(unittest_inspector, files(vdtest + '.py'), check: true) r = run_command(unittest_inspector, files(vdtest + '.py'))
unit_tests = r.stdout().strip().split('\n') unit_tests = r.stdout().strip().split('\n')
if r.returncode() == 0 and unit_tests.length() > 0 if r.returncode() == 0 and unit_tests.length() > 0
@@ -108,11 +106,8 @@ if get_option('introspection')
if (driver_name in supported_drivers and if (driver_name in supported_drivers and
gusb_dep.version().version_compare('>= 0.3.0')) gusb_dep.version().version_compare('>= 0.3.0'))
test(driver_test, test(driver_test,
python3, find_program('umockdev-test.py'),
args: [ args: join_paths(meson.current_source_dir(), driver_test),
umockdev_test.full_path(),
meson.current_source_dir() / driver_test,
],
env: driver_envs, env: driver_envs,
suite: ['drivers'], suite: ['drivers'],
timeout: 15, timeout: 15,
@@ -211,7 +206,6 @@ envs.set('UDEV_HWDB', udev_hwdb.full_path())
envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0') envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0')
test('udev-hwdb', test('udev-hwdb',
find_program('test-generated-hwdb.sh'), find_program('test-generated-hwdb.sh'),
depends: udev_hwdb,
env: envs) env: envs)
gdb = find_program('gdb', required: false) gdb = find_program('gdb', required: false)
@@ -234,26 +228,17 @@ valgrind = find_program('valgrind', required: false)
if valgrind.found() if valgrind.found()
glib_share = glib_dep.get_pkgconfig_variable('prefix') / 'share' / glib_dep.name() glib_share = glib_dep.get_pkgconfig_variable('prefix') / 'share' / glib_dep.name()
glib_suppressions = glib_share + '/valgrind/glib.supp' glib_suppressions = glib_share + '/valgrind/glib.supp'
libfprint_suppressions = '@0@/@1@'.format(meson.source_root(),
files('libfprint.supp')[0])
python_suppressions = '@0@/@1@'.format(meson.source_root(), python_suppressions = '@0@/@1@'.format(meson.source_root(),
files('valgrind-python.supp')[0]) files('valgrind-python.supp')[0])
libfprint_wrapper = [ libfprint_wrapper = [
valgrind.path(), valgrind.path(),
'--tool=memcheck', '--tool=memcheck',
'--leak-check=full', '--leak-check=full',
'--leak-resolution=high',
'--error-exitcode=1',
'--errors-for-leak-kinds=definite',
'--track-origins=yes',
'--show-leak-kinds=definite,possible',
'--show-error-list=yes',
'--suppressions=' + libfprint_suppressions,
'--suppressions=' + glib_suppressions, '--suppressions=' + glib_suppressions,
'--suppressions=' + python_suppressions, '--suppressions=' + python_suppressions,
] ]
add_test_setup('valgrind', add_test_setup('valgrind',
timeout_multiplier: 15, timeout_multiplier: 10,
exe_wrapper: libfprint_wrapper, exe_wrapper: libfprint_wrapper,
env: [ env: [
'G_SLICE=always-malloc', 'G_SLICE=always-malloc',

View File

@@ -51,7 +51,7 @@ d.clear_storage_sync()
template = FPrint.Print.new(d) template = FPrint.Print.new(d)
def enroll_progress(*args): def enroll_progress(*args):
assert d.get_finger_status() & FPrint.FingerStatusFlags.NEEDED #assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
print('enroll progress: ' + str(args)) print('enroll progress: ' + str(args))
# List, enroll, list, verify, delete, list # List, enroll, list, verify, delete, list

View File

@@ -187,7 +187,6 @@ fpi_device_fake_identify (FpDevice *device)
else else
{ {
fpi_device_identify_complete (device, fake_dev->ret_error); fpi_device_identify_complete (device, fake_dev->ret_error);
g_clear_object (&fake_dev->ret_print);
} }
} }

View File

@@ -232,36 +232,6 @@ test_device_has_storage (void)
G_GNUC_END_IGNORE_DEPRECATIONS G_GNUC_END_IGNORE_DEPRECATIONS
} }
static void
test_device_identify_cancelled (void)
{
g_autoptr(GCancellable) cancellable = NULL;
g_autoptr(GPtrArray) prints = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_device (FPT_VIRTUAL_DEVICE_IMAGE);
fp_device_open_sync (tctx->device, NULL, NULL);
prints = g_ptr_array_new ();
cancellable = g_cancellable_new ();
g_cancellable_cancel (cancellable);
g_assert_false (fp_device_identify_sync (tctx->device, prints, cancellable,
NULL, NULL, NULL, NULL, &error));
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
}
static void
test_device_identify_null_prints (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_device (FPT_VIRTUAL_DEVICE_IMAGE);
fp_device_open_sync (tctx->device, NULL, NULL);
g_assert_false (fp_device_identify_sync (tctx->device, NULL, NULL, NULL,
NULL, NULL, NULL, &error));
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@@ -282,8 +252,6 @@ main (int argc, char *argv[])
g_test_add_func ("/device/sync/supports_identify", test_device_supports_identify); g_test_add_func ("/device/sync/supports_identify", test_device_supports_identify);
g_test_add_func ("/device/sync/supports_capture", test_device_supports_capture); g_test_add_func ("/device/sync/supports_capture", test_device_supports_capture);
g_test_add_func ("/device/sync/has_storage", test_device_has_storage); g_test_add_func ("/device/sync/has_storage", test_device_has_storage);
g_test_add_func ("/device/sync/identify/cancelled", test_device_identify_cancelled);
g_test_add_func ("/device/sync/identify/null-prints", test_device_identify_null_prints);
return g_test_run (); return g_test_run ();
} }

View File

@@ -1112,7 +1112,6 @@ test_driver_enroll_update_nbis_wrong_device (void)
fake_dev = FPI_DEVICE_FAKE (device); fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device); template_print = make_fake_nbis_print (device);
g_clear_pointer (&template_print->device_id, g_free);
template_print->device_id = g_strdup ("wrong_device"); template_print->device_id = g_strdup ("wrong_device");
fake_dev->ret_print = template_print; fake_dev->ret_print = template_print;
@@ -1139,7 +1138,6 @@ test_driver_enroll_update_nbis_wrong_driver (void)
fake_dev = FPI_DEVICE_FAKE (device); fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device); template_print = make_fake_nbis_print (device);
g_clear_pointer (&template_print->driver, g_free);
template_print->driver = g_strdup ("wrong_driver"); template_print->driver = g_strdup ("wrong_driver");
fake_dev->ret_print = template_print; fake_dev->ret_print = template_print;
@@ -2388,11 +2386,6 @@ test_driver_identify_warmup_cooldown (void)
g_assert_true (identify_data->called); g_assert_true (identify_data->called);
g_assert_error (identify_data->error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_TOO_HOT); g_assert_error (identify_data->error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_TOO_HOT);
/* Try to identify again, and ensure that we fail early */
fp_device_identify_sync (device, prints, NULL, NULL, NULL, NULL, NULL, &error);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_TOO_HOT);
g_clear_error (&error);
/* Now, wait for it to cool down again; /* Now, wait for it to cool down again;
* WARM should be reached after about 2s * WARM should be reached after about 2s
* COLD after 5s but give it some more slack. */ * COLD after 5s but give it some more slack. */

View File

@@ -1,10 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
if [ ! -x "$UDEV_HWDB" ]; then [ -x "$UDEV_HWDB" ] || exit 1
echo "E: UDEV_HWDB (${UDEV_HWDB}) unset or not executable."
exit 1
fi
if [ "$UDEV_HWDB_CHECK_CONTENTS" == 1 ]; then if [ "$UDEV_HWDB_CHECK_CONTENTS" == 1 ]; then
generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.hwdb") generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.hwdb")
@@ -13,10 +10,6 @@ else
fi fi
$UDEV_HWDB > "$generated_rules" $UDEV_HWDB > "$generated_rules"
if [ $? != 0 ]; then
echo "E: UDEV_HWDB (${UDEV_HWDB}) failed to run without error."
exit 1
fi
if [ "$UDEV_HWDB_CHECK_CONTENTS" != 1 ]; then if [ "$UDEV_HWDB_CHECK_CONTENTS" != 1 ]; then
exit 77 exit 77
@@ -24,7 +17,7 @@ fi
if ! diff -u "$MESON_SOURCE_ROOT/data/autosuspend.hwdb" "$generated_rules"; then if ! diff -u "$MESON_SOURCE_ROOT/data/autosuspend.hwdb" "$generated_rules"; then
echo "E: Autosuspend file needs to be re-generated!" echo "E: Autosuspend file needs to be re-generated!"
echo " ninja -C $MESON_BUILD_ROOT sync-udev-hwdb" echo " ninja -C $MESON_BUILD_ROOT libfprint/sync-udev-hwdb"
exit 1 exit 1
fi fi

View File

@@ -14,7 +14,7 @@ if len(sys.argv) != 2:
# Check that umockdev is available # Check that umockdev is available
try: try:
umockdev_version = subprocess.check_output(['umockdev-run', '--version']) umockdev_version = subprocess.check_output(['umockdev-run', '--version'])
version = tuple(int(_) for _ in umockdev_version.split(b'.')[:3]) version = tuple(int(_) for _ in umockdev_version.split(b'.'))
if version < (0, 13, 2): if version < (0, 13, 2):
print('umockdev is too old for test to be reliable, expect random failures!') print('umockdev is too old for test to be reliable, expect random failures!')
print('Please update umockdev to at least 0.13.2.') print('Please update umockdev to at least 0.13.2.')

View File

@@ -22,9 +22,6 @@ except Exception as e:
FPrint = None FPrint = None
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
ctx = GLib.main_context_default() ctx = GLib.main_context_default()
@@ -238,11 +235,10 @@ class VirtualDeviceBase(unittest.TestCase):
self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE) self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE)
self.assertEqual(self._enrolled.get_device_stored(), self.assertEqual(self._enrolled.get_device_stored(),
bool(self.dev.get_features() & FPrint.DeviceFeature.STORAGE)) self.dev.has_storage())
self.assertEqual(self._enrolled.props.driver, self.dev.get_driver()) self.assertEqual(self._enrolled.props.driver, self.dev.get_driver())
self.assertEqual(self._enrolled.props.device_id, self.dev.get_device_id()) self.assertEqual(self._enrolled.props.device_id, self.dev.get_device_id())
self.assertEqual(self._enrolled.props.device_stored, self.assertEqual(self._enrolled.props.device_stored, self.dev.has_storage())
bool(self.dev.get_features() & FPrint.DeviceFeature.STORAGE))
self.assertEqual(self._enrolled.props.fpi_data.unpack(), nick) self.assertEqual(self._enrolled.props.fpi_data.unpack(), nick)
self.assertIsNone(self._enrolled.props.image) self.assertIsNone(self._enrolled.props.image)
@@ -326,8 +322,7 @@ class VirtualDeviceBase(unittest.TestCase):
else: else:
self.assertFalse(match) self.assertFalse(match)
if (isinstance(scan_nick, str) and not if isinstance(scan_nick, str) and not self.dev.has_storage():
self.dev.get_features() & FPrint.DeviceFeature.STORAGE):
self.assertEqual(self._verify_fp.props.fpi_data.get_string(), scan_nick) self.assertEqual(self._verify_fp.props.fpi_data.get_string(), scan_nick)
@@ -597,7 +592,7 @@ class VirtualDevice(VirtualDeviceBase):
self.send_command('SCAN', 'another-id') self.send_command('SCAN', 'another-id')
verify_match, verify_fp = self.dev.verify_sync(enrolled) verify_match, verify_fp = self.dev.verify_sync(enrolled)
self.assertFalse(verify_match) self.assertFalse(verify_match)
if self.dev.get_features() & FPrint.DeviceFeature.STORAGE: if self.dev.has_storage():
self.assertIsNone(verify_fp) self.assertIsNone(verify_fp)
else: else:
self.assertFalse(verify_fp.equal(enrolled)) self.assertFalse(verify_fp.equal(enrolled))

View File

@@ -21,9 +21,6 @@ except Exception as e:
FPrint = None FPrint = None
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
def load_image(img): def load_image(img):
png = cairo.ImageSurface.create_from_png(img) png = cairo.ImageSurface.create_from_png(img)
@@ -237,8 +234,7 @@ class VirtualImage(unittest.TestCase):
self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE) self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE)
self.assertEqual(self._enrolled.props.driver, self.dev.get_driver()) self.assertEqual(self._enrolled.props.driver, self.dev.get_driver())
self.assertEqual(self._enrolled.props.device_id, self.dev.get_device_id()) self.assertEqual(self._enrolled.props.device_id, self.dev.get_device_id())
self.assertEqual(self._enrolled.props.device_stored, self.assertEqual(self._enrolled.props.device_stored, self.dev.has_storage())
bool(self.dev.get_features() & FPrint.DeviceFeature.STORAGE))
self.assertIsNone(self._enrolled.get_image()) self.assertIsNone(self._enrolled.get_image())
return self._enrolled return self._enrolled