From 01302cee25955aecc2b3f391d48e36f8c8b6b322 Mon Sep 17 00:00:00 2001 From: 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