notificationDaemon: Catch exceptions while loading notifications

An Endless OS system was found in the wild with a malformed
.local/share/gnome-shell/notifications which causes _loadNotifications()
to raise an exception. This exception was not previously handled and
bubbles all the way out to gnome_shell_plugin_start(), whereupon the
shell exit(1)s. The user could no longer log into their computer.

Handle exceptions from _loadNotifications(), log them, and attempt to
continue. Ensure that this._isLoading is set to 'false' even on error,
so that future calls to _saveNotifications() can overwrite the (corrupt)
state file.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1552
This commit is contained in:
Will Thompson 2019-08-28 15:38:03 +01:00 committed by Florian Müllner
parent a207f67f73
commit e5cde4700f

View File

@ -750,29 +750,33 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
_loadNotifications() { _loadNotifications() {
this._isLoading = true; this._isLoading = true;
let value = global.get_persistent_state('a(sa(sv))', 'notifications'); try {
if (value) { let value = global.get_persistent_state('a(sa(sv))', 'notifications');
let sources = value.deep_unpack(); if (value) {
sources.forEach(([appId, notifications]) => { let sources = value.deep_unpack();
if (notifications.length == 0) sources.forEach(([appId, notifications]) => {
return; if (notifications.length == 0)
let source;
try {
source = this._ensureAppSource(appId);
} catch (e) {
if (e instanceof InvalidAppError)
return; return;
throw e;
}
notifications.forEach(([notificationId, notification]) => { let source;
source.addNotification(notificationId, notification.deep_unpack(), false); try {
source = this._ensureAppSource(appId);
} catch (e) {
if (e instanceof InvalidAppError)
return;
throw e;
}
notifications.forEach(([notificationId, notification]) => {
source.addNotification(notificationId, notification.deep_unpack(), false);
});
}); });
}); }
} catch (e) {
logError(e, 'Failed to load saved notifications');
} finally {
this._isLoading = false;
} }
this._isLoading = false;
} }
_saveNotifications() { _saveNotifications() {