Fix error handling in fingerprint code
This commit is contained in:
		
							parent
							
								
									4ddaddd639
								
							
						
					
					
						commit
						ad5acb8fcc
					
				
							
								
								
									
										101
									
								
								fix-fingerprint-failure-handling.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								fix-fingerprint-failure-handling.patch
									
									
									
									
									
										Normal 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 | ||||
| 
 | ||||
| @ -32,6 +32,7 @@ Patch: enforce-smartcard-at-unlock.patch | ||||
| Patch: disable-unlock-entry-until-question.patch | ||||
| Patch: 0001-loginDialog-make-info-messages-themed.patch | ||||
| Patch: fix-stuck-prompt.patch | ||||
| Patch: fix-fingerprint-failure-handling.patch | ||||
| 
 | ||||
| # Extensions | ||||
| Patch: 0001-extensionDownloader-Refuse-to-override-system-extens.patch | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user