gdm: disconnect signals
Many signal connections on global objects and on non-widgets were not disconnected when the unlock screen was destroyed, causing leaks. https://bugzilla.gnome.org/show_bug.cgi?id=738256
This commit is contained in:
parent
d8d046f2b3
commit
8d3ff56846
@ -134,8 +134,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._userVerifier.clear();
|
this._userVerifier.destroy();
|
||||||
this._userVerifier.disconnectAll();
|
|
||||||
this._userVerifier = null;
|
this._userVerifier = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -64,6 +64,8 @@ const UserListItem = new Lang.Class({
|
|||||||
reactive: true,
|
reactive: true,
|
||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
x_fill: true });
|
x_fill: true });
|
||||||
|
this.actor.connect('destroy',
|
||||||
|
Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
this._userWidget = new UserWidget.UserWidget(this.user);
|
this._userWidget = new UserWidget.UserWidget(this.user);
|
||||||
layout.add(this._userWidget.actor);
|
layout.add(this._userWidget.actor);
|
||||||
@ -87,6 +89,10 @@ const UserListItem = new Lang.Class({
|
|||||||
this.actor.remove_style_pseudo_class('logged-in');
|
this.actor.remove_style_pseudo_class('logged-in');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
this._user.disconnect(this._userChangedId);
|
||||||
|
},
|
||||||
|
|
||||||
_onClicked: function() {
|
_onClicked: function() {
|
||||||
this.emit('activate');
|
this.emit('activate');
|
||||||
},
|
},
|
||||||
@ -373,12 +379,11 @@ const LoginDialog = new Lang.Class({
|
|||||||
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
|
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
|
||||||
this._greeter = gdmClient.get_greeter_sync(null);
|
this._greeter = gdmClient.get_greeter_sync(null);
|
||||||
|
|
||||||
this._greeter.connect('default-session-name-changed',
|
this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed',
|
||||||
Lang.bind(this, this._onDefaultSessionChanged));
|
Lang.bind(this, this._onDefaultSessionChanged));
|
||||||
|
this._sessionOpenedId = this._greeter.connect('session-opened',
|
||||||
this._greeter.connect('session-opened',
|
|
||||||
Lang.bind(this, this._onSessionOpened));
|
Lang.bind(this, this._onSessionOpened));
|
||||||
this._greeter.connect('timed-login-requested',
|
this._timedLoginRequestedId = this._greeter.connect('timed-login-requested',
|
||||||
Lang.bind(this, this._onTimedLoginRequested));
|
Lang.bind(this, this._onTimedLoginRequested));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,7 +399,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, this._updateLogo));
|
Lang.bind(this, this._updateLogo));
|
||||||
|
|
||||||
this._textureCache = St.TextureCache.get_default();
|
this._textureCache = St.TextureCache.get_default();
|
||||||
this._textureCache.connect('texture-file-changed',
|
this._updateLogoTextureId = this._textureCache.connect('texture-file-changed',
|
||||||
Lang.bind(this, this._updateLogoTexture));
|
Lang.bind(this, this._updateLogoTexture));
|
||||||
|
|
||||||
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
||||||
@ -476,7 +481,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
// If the user list is enabled, it should take key focus; make sure the
|
// If the user list is enabled, it should take key focus; make sure the
|
||||||
// screen shield is initialized first to prevent it from stealing the
|
// screen shield is initialized first to prevent it from stealing the
|
||||||
// focus later
|
// focus later
|
||||||
Main.layoutManager.connect('startup-complete',
|
this._startupCompleteId = Main.layoutManager.connect('startup-complete',
|
||||||
Lang.bind(this, this._updateDisableUserList));
|
Lang.bind(this, this._updateDisableUserList));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -665,6 +670,8 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_gotGreeterSessionProxy: function(proxy) {
|
_gotGreeterSessionProxy: function(proxy) {
|
||||||
|
this._greeterSessionProxy = proxy;
|
||||||
|
this._greeterSessionProxyChangedId =
|
||||||
proxy.connect('g-properties-changed', Lang.bind(this, function() {
|
proxy.connect('g-properties-changed', Lang.bind(this, function() {
|
||||||
if (proxy.Active)
|
if (proxy.Active)
|
||||||
this._loginScreenSessionActivated();
|
this._loginScreenSessionActivated();
|
||||||
@ -890,6 +897,30 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userManager.disconnect(this._userManagerLoadedId);
|
this._userManager.disconnect(this._userManagerLoadedId);
|
||||||
this._userManagerLoadedId = 0;
|
this._userManagerLoadedId = 0;
|
||||||
}
|
}
|
||||||
|
if (this._userAddedId) {
|
||||||
|
this._userManager.disconnect(this._userAddedId);
|
||||||
|
this._userAddedId = 0;
|
||||||
|
}
|
||||||
|
if (this._userRemovedId) {
|
||||||
|
this._userManager.disconnect(this._userRemovedId);
|
||||||
|
this._userRemovedId = 0;
|
||||||
|
}
|
||||||
|
this._textureCache.disconnect(this._updateLogoTextureId);
|
||||||
|
Main.layoutManager.disconnect(this._startupCompleteId);
|
||||||
|
if (this._settings) {
|
||||||
|
this._settings.run_dispose();
|
||||||
|
this._settings = null;
|
||||||
|
}
|
||||||
|
if (this._greeter) {
|
||||||
|
this._greeter.disconnect(this._defaultSessionChangedId);
|
||||||
|
this._greeter.disconnect(this._sessionOpenedId);
|
||||||
|
this._greeter.disconnect(this._timedLoginRequestedId);
|
||||||
|
this._greeter = null;
|
||||||
|
}
|
||||||
|
if (this._greeterSessionProxy) {
|
||||||
|
this._greeterSessionProxy.disconnect(this._greeterSessionProxyChangedId);
|
||||||
|
this._greeterSessionProxy = null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_loadUserList: function() {
|
_loadUserList: function() {
|
||||||
@ -904,12 +935,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userList.addUser(users[i]);
|
this._userList.addUser(users[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._userManager.connect('user-added',
|
this._userAddedId = this._userManager.connect('user-added',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.addUser(user);
|
this._userList.addUser(user);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._userManager.connect('user-removed',
|
this._userRemovedId = this._userManager.connect('user-removed',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.removeUser(user);
|
this._userList.removeUser(user);
|
||||||
}));
|
}));
|
||||||
|
@ -142,9 +142,9 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
// after a user has been picked.
|
// after a user has been picked.
|
||||||
this._checkForSmartcard();
|
this._checkForSmartcard();
|
||||||
|
|
||||||
this._smartcardManager.connect('smartcard-inserted',
|
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
||||||
Lang.bind(this, this._checkForSmartcard));
|
Lang.bind(this, this._checkForSmartcard));
|
||||||
this._smartcardManager.connect('smartcard-removed',
|
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
|
||||||
Lang.bind(this, this._checkForSmartcard));
|
Lang.bind(this, this._checkForSmartcard));
|
||||||
|
|
||||||
this._messageQueue = [];
|
this._messageQueue = [];
|
||||||
@ -159,7 +159,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
if (this._oVirtCredentialsManager.hasToken())
|
if (this._oVirtCredentialsManager.hasToken())
|
||||||
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
||||||
|
|
||||||
this._oVirtCredentialsManager.connect('user-authenticated',
|
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
|
||||||
Lang.bind(this, this._oVirtUserAuthenticated));
|
Lang.bind(this, this._oVirtUserAuthenticated));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -191,20 +191,37 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_clearUserVerifier: function() {
|
||||||
|
if (this._userVerifier) {
|
||||||
|
this._userVerifier.run_dispose();
|
||||||
|
this._userVerifier = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
clear: function() {
|
clear: function() {
|
||||||
if (this._cancellable) {
|
if (this._cancellable) {
|
||||||
this._cancellable.cancel();
|
this._cancellable.cancel();
|
||||||
this._cancellable = null;
|
this._cancellable = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._userVerifier) {
|
this._clearUserVerifier();
|
||||||
this._userVerifier.run_dispose();
|
|
||||||
this._userVerifier = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._clearMessageQueue();
|
this._clearMessageQueue();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
this.clear();
|
||||||
|
|
||||||
|
this._settings.run_dispose();
|
||||||
|
this._settings = null;
|
||||||
|
|
||||||
|
this._smartcardManager.disconnect(this._smartcardInsertedId);
|
||||||
|
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
||||||
|
this._smartcardManager = null;
|
||||||
|
|
||||||
|
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
|
||||||
|
this._oVirtCredentialsManager = null;
|
||||||
|
},
|
||||||
|
|
||||||
answerQuery: function(serviceName, answer) {
|
answerQuery: function(serviceName, answer) {
|
||||||
if (!this.hasPendingMessages) {
|
if (!this.hasPendingMessages) {
|
||||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||||
@ -326,6 +343,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
_reauthenticationChannelOpened: function(client, result) {
|
_reauthenticationChannelOpened: function(client, result) {
|
||||||
try {
|
try {
|
||||||
|
this._clearUserVerifier();
|
||||||
this._userVerifier = client.open_reauthentication_channel_finish(result);
|
this._userVerifier = client.open_reauthentication_channel_finish(result);
|
||||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||||
return;
|
return;
|
||||||
@ -349,6 +367,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
_userVerifierGot: function(client, result) {
|
_userVerifierGot: function(client, result) {
|
||||||
try {
|
try {
|
||||||
|
this._clearUserVerifier();
|
||||||
this._userVerifier = client.get_user_verifier_finish(result);
|
this._userVerifier = client.get_user_verifier_finish(result);
|
||||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user