102 lines
3.9 KiB
Diff
102 lines
3.9 KiB
Diff
|
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
|
||
|
|