Fix error handling in fingerprint code

This commit is contained in:
Ray Strode 2024-05-15 09:34:49 -04:00
parent 4ddaddd639
commit ad5acb8fcc
2 changed files with 102 additions and 0 deletions

View File

@ -0,0 +1,101 @@
From 01302cee25955aecc2b3f391d48e36f8c8b6b322 Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Wed, 15 May 2024 09:14:09 -0400
Subject: [PATCH] gdm/util: Make sure error is GError before checking it
The fingerprint device fetching code has a generic error handler,
that assumes the passed in error is GError. If it's not a
GError it will fail trying to use GError specific methods.
This commit adds some validation checking.
---
js/gdm/util.js | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index efc5a1f..9f39367 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -369,69 +369,70 @@ export class ShellUserVerifier extends Signals.EventEmitter {
const fprintDeviceProxy = this._getFingerprintDeviceProxy(devicePath);
fprintDeviceProxy.init(null);
this._setFingerprintReaderType(fprintDeviceProxy['scan-type']);
} else {
// Ensure fingerprint service starts, but do not wait for it
const cancellable = this._cancellable;
await fprintManager.init_async(GLib.PRIORITY_DEFAULT, cancellable);
await this._updateFingerprintReaderType(fprintManager, cancellable);
this._fprintManager = fprintManager;
}
} catch (e) {
this._handleFingerprintError(e);
}
}
_getFingerprintDeviceProxy(devicePath) {
return new Gio.DBusProxy({
g_connection: Gio.DBus.system,
g_name: 'net.reactivated.Fprint',
g_object_path: devicePath,
g_interface_name: FprintDeviceInfo.name,
g_interface_info: FprintDeviceInfo,
g_flags: Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS,
});
}
_handleFingerprintError(e) {
this._fingerprintReaderType = FingerprintReaderType.NONE;
- if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
- return;
- if (e.matches(Gio.DBusError, Gio.DBusError.SERVICE_UNKNOWN))
- return;
-
- if (Gio.DBusError.is_remote_error(e) &&
- Gio.DBusError.get_remote_error(e) ===
- 'net.reactivated.Fprint.Error.NoSuchDevice')
- return;
+ if (e instanceof GLib.Error) {
+ if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ return;
+ if (e.matches(Gio.DBusError, Gio.DBusError.SERVICE_UNKNOWN))
+ return;
+ if (Gio.DBusError.is_remote_error(e) &&
+ Gio.DBusError.get_remote_error(e) ===
+ 'net.reactivated.Fprint.Error.NoSuchDevice')
+ return;
+ }
logError(e, 'Failed to interact with fprintd service');
}
async _checkForFingerprintReader() {
if (!this._fprintManager) {
this._updateDefaultService();
return;
}
if (this._fingerprintReaderType !== FingerprintReaderType.NONE)
return;
await this._updateFingerprintReaderType(this._fprintManager, this._cancellable);
}
async _updateFingerprintReaderType(fprintManager, cancellable) {
// Wrappers don't support null cancellable, so let's ignore it in case
const args = cancellable ? [cancellable] : [];
const [devicePath] = await fprintManager.GetDefaultDeviceAsync(...args);
const fprintDeviceProxy = this._getFingerprintDeviceProxy(devicePath);
await fprintDeviceProxy.init_async(GLib.PRIORITY_DEFAULT, cancellable);
this._setFingerprintReaderType(fprintDeviceProxy['scan-type']);
this._updateDefaultService();
if (this._userVerifier &&
!this._activeServices.has(FINGERPRINT_SERVICE_NAME)) {
if (!this._hold?.isAcquired())
this._hold = new Batch.Hold();
await this._maybeStartFingerprintVerification();
--
2.44.0

View File

@ -32,6 +32,7 @@ Patch: enforce-smartcard-at-unlock.patch
Patch: disable-unlock-entry-until-question.patch Patch: disable-unlock-entry-until-question.patch
Patch: 0001-loginDialog-make-info-messages-themed.patch Patch: 0001-loginDialog-make-info-messages-themed.patch
Patch: fix-stuck-prompt.patch Patch: fix-stuck-prompt.patch
Patch: fix-fingerprint-failure-handling.patch
# Extensions # Extensions
Patch: 0001-extensionDownloader-Refuse-to-override-system-extens.patch Patch: 0001-extensionDownloader-Refuse-to-override-system-extens.patch