From 9c016af6eeba71e29bd37f93547dd3efe49c167a Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 14 May 2021 14:53:12 +0100 Subject: [PATCH] Projucer: Avoid use-after-free in Sidebar destructor --- .../UI/jucer_ProjectContentComponent.cpp | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index 1b608afdc8..ba705f4fd8 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -32,7 +32,7 @@ NewFileWizard::Type* createGUIComponentWizard(); //============================================================================== ProjectContentComponent::ProjectContentComponent() - : sidebar (new Sidebar (project)) + : sidebar (std::make_unique (project)) { setOpaque (true); setWantsKeyboardFocus (true); @@ -76,10 +76,10 @@ void ProjectContentComponent::resized() r.removeFromTop (10); - auto sidebarArea = r.removeFromLeft (sidebar->getWidth() != 0 ? sidebar->getWidth() - : r.getWidth() / 4); + auto sidebarArea = r.removeFromLeft (sidebar != nullptr && sidebar->getWidth() != 0 ? sidebar->getWidth() + : r.getWidth() / 4); - if (sidebar->isVisible()) + if (sidebar != nullptr && sidebar->isVisible()) sidebar->setBounds (sidebarArea); if (resizerBar != nullptr) @@ -87,7 +87,7 @@ void ProjectContentComponent::resized() contentViewComponent.setBounds (r); - headerComponent.sidebarTabsWidthChanged (sidebar->getWidth()); + headerComponent.sidebarTabsWidthChanged (sidebarArea.getWidth()); } void ProjectContentComponent::lookAndFeelChanged() @@ -113,6 +113,7 @@ void ProjectContentComponent::setProject (Project* newProject) hideEditor(); resizerBar = nullptr; + sidebar = nullptr; project = newProject; @@ -122,8 +123,8 @@ void ProjectContentComponent::setProject (Project* newProject) addAndMakeVisible (sidebar.get()); //============================================================================== - resizerBar.reset (new ResizableEdgeComponent (sidebar.get(), &sidebarSizeConstrainer, - ResizableEdgeComponent::rightEdge)); + resizerBar = std::make_unique (sidebar.get(), &sidebarSizeConstrainer, + ResizableEdgeComponent::rightEdge); addAndMakeVisible (resizerBar.get()); resizerBar->setAlwaysOnTop (true); @@ -138,7 +139,6 @@ void ProjectContentComponent::setProject (Project* newProject) } else { - sidebar->setVisible (false); headerComponent.setVisible (false); projectMessagesComponent.setVisible (false); } @@ -190,14 +190,16 @@ void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster* broadca void ProjectContentComponent::refreshProjectTreeFileStatuses() { - if (auto* fileTree = sidebar->getFileTreePanel()) - fileTree->repaint(); + if (sidebar != nullptr) + if (auto* fileTree = sidebar->getFileTreePanel()) + fileTree->repaint(); } void ProjectContentComponent::updateMissingFileStatuses() { - if (auto* tree = sidebar->getFileTreePanel()) - tree->updateMissingFileStatuses(); + if (sidebar != nullptr) + if (auto* tree = sidebar->getFileTreePanel()) + tree->updateMissingFileStatuses(); } bool ProjectContentComponent::showEditorForFile (const File& fileToShow, bool grabFocus) @@ -415,6 +417,9 @@ void ProjectContentComponent::showExporterSettings (const String& exporterName) showExportersPanel(); + if (sidebar == nullptr) + return; + if (auto* exportersPanel = sidebar->getExportersTreePanel()) { if (auto* exporters = dynamic_cast (exportersPanel->rootItem.get())) @@ -440,6 +445,9 @@ void ProjectContentComponent::showModule (const String& moduleID) { showModulesPanel(); + if (sidebar == nullptr) + return; + if (auto* modsPanel = sidebar->getModuleTreePanel()) { if (auto* mods = dynamic_cast (modsPanel->rootItem.get())) @@ -521,8 +529,9 @@ void ProjectContentComponent::showNewExporterMenu() void ProjectContentComponent::deleteSelectedTreeItems() { - if (auto* tree = sidebar->getTreeWithSelectedItems()) - tree->deleteSelectedItems(); + if (sidebar != nullptr) + if (auto* tree = sidebar->getTreeWithSelectedItems()) + tree->deleteSelectedItems(); } void ProjectContentComponent::showBubbleMessage (Rectangle pos, const String& text) @@ -869,5 +878,6 @@ void ProjectContentComponent::addNewGUIFile() //============================================================================== void ProjectContentComponent::showProjectPanel (const int index) { - sidebar->showPanel (index); + if (sidebar != nullptr) + sidebar->showPanel (index); }