summaryrefslogtreecommitdiff
path: root/media-sound/audacious/files/audacious-3.10-use-after-free.patch
blob: 8271a3d6d1b01921d80468142c04d47a93324dab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
From 1d34f6799b8f5910fc6863ae96afd5ab035e830f Mon Sep 17 00:00:00 2001
From: John Lindgren <john@jlindgren.net>
Date: Thu, 20 Sep 2018 13:46:52 -0400
Subject: [PATCH] audqt: Use deleteLater() to prevent use-after-free in Qt
 event handling.  Closes: #828.

---
 src/libaudqt/infopopup-qt.cc | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/libaudqt/infopopup-qt.cc b/src/libaudqt/infopopup-qt.cc
index fdbba41d2..81dd87f5c 100644
--- a/src/libaudqt/infopopup-qt.cc
+++ b/src/libaudqt/infopopup-qt.cc
@@ -176,7 +176,9 @@ static InfoPopup * s_infopopup;
 
 static void infopopup_show (const String & filename, const Tuple & tuple)
 {
-    delete s_infopopup;
+    if (s_infopopup)
+        s_infopopup->deleteLater ();
+
     s_infopopup = new InfoPopup (filename, tuple);
 
     QObject::connect (s_infopopup, & QObject::destroyed, [] () {
@@ -206,7 +208,11 @@ EXPORT void infopopup_show_current ()
 
 EXPORT void infopopup_hide ()
 {
-    delete s_infopopup;
+    /* This function can be called from an enter/leave event, and Qt does not
+     * like widgets being deleted from such events.  This is debatably a bug in
+     * Qt, but deleteLater() is an effective workaround. */
+    if (s_infopopup)
+        s_infopopup->deleteLater ();
 }
 
 } // namespace audqt