From 1d34f6799b8f5910fc6863ae96afd5ab035e830f Mon Sep 17 00:00:00 2001 From: John Lindgren 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