Blame SOURCES/fix-invalid-access-warnings.patch

35159f
From 76eebb42ed4c76970a9debfc0cd41537923eccde Mon Sep 17 00:00:00 2001
35159f
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
35159f
Date: Tue, 5 Dec 2017 02:41:50 +0100
35159f
Subject: [PATCH 1/2] tweener: Save handlers on target and remove them on
35159f
 destroy
35159f
35159f
Saving handlers we had using the wrapper as a property of the object and delete
35159f
them when resetting the object state.
35159f
Without doing this an handler could be called on a destroyed target when this
35159f
happens on the onComplete callback.
35159f
35159f
https://bugzilla.gnome.org/show_bug.cgi?id=791233
35159f
---
35159f
 js/ui/tweener.js | 63 ++++++++++++++++++++++++++++++++++++++----------
35159f
 1 file changed, 50 insertions(+), 13 deletions(-)
35159f
35159f
diff --git a/js/ui/tweener.js b/js/ui/tweener.js
35159f
index bb9ea557c..c04cede25 100644
35159f
--- a/js/ui/tweener.js
35159f
+++ b/js/ui/tweener.js
35159f
@@ -63,30 +63,67 @@ function _getTweenState(target) {
35159f
     return target.__ShellTweenerState;
35159f
 }
35159f
 
35159f
+function _ensureHandlers(target) {
35159f
+    if (!target.__ShellTweenerHandlers)
35159f
+        target.__ShellTweenerHandlers = {};
35159f
+    return target.__ShellTweenerHandlers;
35159f
+}
35159f
+
35159f
 function _resetTweenState(target) {
35159f
     let state = target.__ShellTweenerState;
35159f
 
35159f
     if (state) {
35159f
-        if (state.destroyedId)
35159f
+        if (state.destroyedId) {
35159f
             state.actor.disconnect(state.destroyedId);
35159f
+            delete state.destroyedId;
35159f
+        }
35159f
     }
35159f
 
35159f
+    _removeHandler(target, 'onComplete', _tweenCompleted);
35159f
     target.__ShellTweenerState = {};
35159f
 }
35159f
 
35159f
 function _addHandler(target, params, name, handler) {
35159f
-    if (params[name]) {
35159f
-        let oldHandler = params[name];
35159f
-        let oldScope = params[name + 'Scope'];
35159f
-        let oldParams = params[name + 'Params'];
35159f
-        let eventScope = oldScope ? oldScope : target;
35159f
-
35159f
-        params[name] = () => {
35159f
-            oldHandler.apply(eventScope, oldParams);
35159f
-            handler(target);
35159f
-        };
35159f
-    } else
35159f
-        params[name] = () => { handler(target); };
35159f
+    let wrapperNeeded = false;
35159f
+    let tweenerHandlers = _ensureHandlers(target);
35159f
+
35159f
+    if (!(name in tweenerHandlers)) {
35159f
+        tweenerHandlers[name] = [];
35159f
+        wrapperNeeded = true;
35159f
+    }
35159f
+
35159f
+    let handlers = tweenerHandlers[name];
35159f
+    handlers.push(handler);
35159f
+
35159f
+    if (wrapperNeeded) {
35159f
+        if (params[name]) {
35159f
+            let oldHandler = params[name];
35159f
+            let oldScope = params[name + 'Scope'];
35159f
+            let oldParams = params[name + 'Params'];
35159f
+            let eventScope = oldScope ? oldScope : target;
35159f
+
35159f
+            params[name] = () => {
35159f
+                oldHandler.apply(eventScope, oldParams);
35159f
+                handlers.forEach((h) => h(target));
35159f
+            };
35159f
+        } else {
35159f
+            params[name] = () => { handlers.forEach((h) => h(target)); };
35159f
+        }
35159f
+    }
35159f
+}
35159f
+
35159f
+function _removeHandler(target, name, handler) {
35159f
+    let tweenerHandlers = _ensureHandlers(target);
35159f
+
35159f
+    if (name in tweenerHandlers) {
35159f
+        let handlers = tweenerHandlers[name];
35159f
+        let handlerIndex = handlers.indexOf(handler);
35159f
+
35159f
+        while (handlerIndex > -1) {
35159f
+            handlers.splice(handlerIndex, 1);
35159f
+            handlerIndex = handlers.indexOf(handler);
35159f
+        }
35159f
+    }
35159f
 }
35159f
 
35159f
 function _actorDestroyed(target) {
35159f
-- 
35159f
2.21.0
35159f
35159f
35159f
From 730f6f7d708a0cbcfcc75e4a1fba8512ac7c4c82 Mon Sep 17 00:00:00 2001
35159f
From: Cosimo Cecchi <cosimo@endlessm.com>
35159f
Date: Sun, 26 May 2019 08:31:07 -0700
35159f
Subject: [PATCH 2/2] windowAttentionHandler: disconnect signals before
35159f
 destruction
35159f
MIME-Version: 1.0
35159f
Content-Type: text/plain; charset=UTF-8
35159f
Content-Transfer-Encoding: 8bit
35159f
35159f
The 'destroy' signal is emitted at the end of the destroy() method.
35159f
However the implementation of destroy() can end up emitting one of the
35159f
signals we connect to on the window, causing us to re-enter destroy
35159f
from its callback.
35159f
That will in turn lead to some objects getting disposed twice, which
35159f
produces a stack trace like the following one.
35159f
35159f
This commit fixes the issue by overriding the destroy() method instead
35159f
of connecting to the signal, which allows us to disconnect the signal
35159f
handlers from the window at an earlier time and avoid re-entrancy.
35159f
35159f
--
35159f
35159f
gnome-shell[1082]: Object Gio.Settings (0x7f0af8143f00), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
35159f
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
35159f
org.gnome.Shell.desktop[1082]: #0   5627f9e801a8 i   resource:///org/gnome/shell/ui/messageTray.js:238 (7f0aefa9eca0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #1   5627f9e80108 i   resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
35159f
org.gnome.Shell.desktop[1082]: #2   5627f9e80070 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
35159f
org.gnome.Shell.desktop[1082]: #3   7fffa69fbfc0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
org.gnome.Shell.desktop[1082]: #4   5627f9e7ffe0 i   resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
35159f
org.gnome.Shell.desktop[1082]: #5   5627f9e7ff38 i   resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #6   5627f9e7fe80 i   resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
35159f
org.gnome.Shell.desktop[1082]: #7   5627f9e7fde8 i   resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
35159f
org.gnome.Shell.desktop[1082]: #8   7fffa69ff8e0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
org.gnome.Shell.desktop[1082]: #9   7fffa69ff9d0 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
35159f
org.gnome.Shell.desktop[1082]: #10   5627f9e7fd58 i   resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
35159f
org.gnome.Shell.desktop[1082]: #11   5627f9e7fcb8 i   resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
35159f
org.gnome.Shell.desktop[1082]: #12   5627f9e7fc28 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
35159f
org.gnome.Shell.desktop[1082]: #13   5627f9e7fb80 i   resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
35159f
org.gnome.Shell.desktop[1082]: #14   5627f9e7fad0 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
35159f
org.gnome.Shell.desktop[1082]: #15   5627f9e7fa58 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
35159f
org.gnome.Shell.desktop[1082]: #16   7fffa6a03350 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
35159f
org.gnome.Shell.desktop[1082]: #17   5627f9e7f9d0 i   resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #18   5627f9e7f950 i   resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #19   7fffa6a048f0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
35159f
org.gnome.Shell.desktop[1082]: #0   5627f9e801a8 i   resource:///org/gnome/shell/ui/messageTray.js:239 (7f0aefa9eca0 @ 42)
35159f
org.gnome.Shell.desktop[1082]: #1   5627f9e80108 i   resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
35159f
org.gnome.Shell.desktop[1082]: #2   5627f9e80070 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
35159f
org.gnome.Shell.desktop[1082]: #3   7fffa69fbfc0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
org.gnome.Shell.desktop[1082]: #4   5627f9e7ffe0 i   resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
35159f
org.gnome.Shell.desktop[1082]: #5   5627f9e7ff38 i   resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #6   5627f9e7fe80 i   resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
35159f
org.gnome.Shell.desktop[1082]: #7   5627f9e7fde8 i   resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
35159f
org.gnome.Shell.desktop[1082]: #8   7fffa69ff8e0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
org.gnome.Shell.desktop[1082]: #9   7fffa69ff9d0 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
35159f
org.gnome.Shell.desktop[1082]: #10   5627f9e7fd58 i   resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
35159f
org.gnome.Shell.desktop[1082]: #11   5627f9e7fcb8 i   resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
35159f
org.gnome.Shell.desktop[1082]: #12   5627f9e7fc28 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
35159f
org.gnome.Shell.desktop[1082]: #13   5627f9e7fb80 i   resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
35159f
org.gnome.Shell.desktop[1082]: #14   5627f9e7fad0 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
35159f
org.gnome.Shell.desktop[1082]: #15   5627f9e7fa58 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
35159f
org.gnome.Shell.desktop[1082]: #16   7fffa6a03350 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
35159f
org.gnome.Shell.desktop[1082]: #17   5627f9e7f9d0 i   resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #18   5627f9e7f950 i   resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
35159f
org.gnome.Shell.desktop[1082]: #19   7fffa6a048f0 b   self-hosted:979 (7f0aefa515e0 @ 440)
35159f
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed
35159f
gnome-shell[1082]: Object Gio.Settings (0x7f0af8161750), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
35159f
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed
35159f
35159f
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
35159f
---
35159f
 js/ui/windowAttentionHandler.js | 17 ++++++++---------
35159f
 1 file changed, 8 insertions(+), 9 deletions(-)
35159f
35159f
diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js
35159f
index abdb8a444..a9a7111ba 100644
35159f
--- a/js/ui/windowAttentionHandler.js
35159f
+++ b/js/ui/windowAttentionHandler.js
35159f
@@ -69,8 +69,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
35159f
                                                  () => { this.destroy(); }));
35159f
         this.signalIDs.push(this._window.connect('unmanaged',
35159f
                                                  () => { this.destroy(); }));
35159f
-
35159f
-        this.connect('destroy', this._onDestroy.bind(this));
35159f
     }
35159f
 
35159f
     _sync() {
35159f
@@ -79,13 +77,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
35159f
         this.destroy();
35159f
     }
35159f
 
35159f
-    _onDestroy() {
35159f
-        for(let i = 0; i < this.signalIDs.length; i++) {
35159f
-           this._window.disconnect(this.signalIDs[i]);
35159f
-        }
35159f
-        this.signalIDs = [];
35159f
-    }
35159f
-
35159f
     _createPolicy() {
35159f
         if (this._app && this._app.get_app_info()) {
35159f
             let id = this._app.get_id().replace(/\.desktop$/,'');
35159f
@@ -99,6 +90,14 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
35159f
         return this._app.create_icon_texture(size);
35159f
     }
35159f
 
35159f
+    destroy(params) {
35159f
+        for (let i = 0; i < this.signalIDs.length; i++)
35159f
+            this._window.disconnect(this.signalIDs[i]);
35159f
+        this.signalIDs = [];
35159f
+
35159f
+        super.destroy(params);
35159f
+    }
35159f
+
35159f
     open() {
35159f
         Main.activateWindow(this._window);
35159f
     }
35159f
-- 
35159f
2.21.0
35159f