From 5919f6d4af2819340cd046e8eb3fd6db2f546b53 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Thu, 23 Apr 2015 23:09:40 +0200 Subject: [PATCH] screen_saver filter: Fix use-after-free on destruction. Stop watching nodes before quitting and therefore deleting the looper that was subscribed. --- .../input_server/filters/screen_saver/ScreenSaverFilter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/add-ons/input_server/filters/screen_saver/ScreenSaverFilter.cpp b/src/add-ons/input_server/filters/screen_saver/ScreenSaverFilter.cpp index 1552a20b76..bd11eb7851 100644 --- a/src/add-ons/input_server/filters/screen_saver/ScreenSaverFilter.cpp +++ b/src/add-ons/input_server/filters/screen_saver/ScreenSaverFilter.cpp @@ -120,6 +120,9 @@ ScreenSaverFilter::~ScreenSaverFilter() { be_roster->StopWatching(fController); + if (fWatchingFile || fWatchingDirectory) + watch_node(&fNodeRef, B_STOP_WATCHING, fController); + // We must quit our controller without being locked, or else we might // deadlock; when the controller is gone, there is no reason to lock // anymore, anyway. @@ -128,9 +131,6 @@ ScreenSaverFilter::~ScreenSaverFilter() delete fCornerRunner; delete fRunner; - - if (fWatchingFile || fWatchingDirectory) - watch_node(&fNodeRef, B_STOP_WATCHING, fController); }