Browse Source

Projucer: Avoid use-after-free in Sidebar destructor

v6.1.6
reuk 4 years ago
parent
commit
9c016af6ee
1 changed files with 25 additions and 15 deletions
  1. +25
    -15
      extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp

+ 25
- 15
extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp View File

@@ -32,7 +32,7 @@ NewFileWizard::Type* createGUIComponentWizard();
//============================================================================== //==============================================================================
ProjectContentComponent::ProjectContentComponent() ProjectContentComponent::ProjectContentComponent()
: sidebar (new Sidebar (project))
: sidebar (std::make_unique<Sidebar> (project))
{ {
setOpaque (true); setOpaque (true);
setWantsKeyboardFocus (true); setWantsKeyboardFocus (true);
@@ -76,10 +76,10 @@ void ProjectContentComponent::resized()
r.removeFromTop (10); 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); sidebar->setBounds (sidebarArea);
if (resizerBar != nullptr) if (resizerBar != nullptr)
@@ -87,7 +87,7 @@ void ProjectContentComponent::resized()
contentViewComponent.setBounds (r); contentViewComponent.setBounds (r);
headerComponent.sidebarTabsWidthChanged (sidebar->getWidth());
headerComponent.sidebarTabsWidthChanged (sidebarArea.getWidth());
} }
void ProjectContentComponent::lookAndFeelChanged() void ProjectContentComponent::lookAndFeelChanged()
@@ -113,6 +113,7 @@ void ProjectContentComponent::setProject (Project* newProject)
hideEditor(); hideEditor();
resizerBar = nullptr; resizerBar = nullptr;
sidebar = nullptr;
project = newProject; project = newProject;
@@ -122,8 +123,8 @@ void ProjectContentComponent::setProject (Project* newProject)
addAndMakeVisible (sidebar.get()); addAndMakeVisible (sidebar.get());
//============================================================================== //==============================================================================
resizerBar.reset (new ResizableEdgeComponent (sidebar.get(), &sidebarSizeConstrainer,
ResizableEdgeComponent::rightEdge));
resizerBar = std::make_unique<ResizableEdgeComponent> (sidebar.get(), &sidebarSizeConstrainer,
ResizableEdgeComponent::rightEdge);
addAndMakeVisible (resizerBar.get()); addAndMakeVisible (resizerBar.get());
resizerBar->setAlwaysOnTop (true); resizerBar->setAlwaysOnTop (true);
@@ -138,7 +139,6 @@ void ProjectContentComponent::setProject (Project* newProject)
} }
else else
{ {
sidebar->setVisible (false);
headerComponent.setVisible (false); headerComponent.setVisible (false);
projectMessagesComponent.setVisible (false); projectMessagesComponent.setVisible (false);
} }
@@ -190,14 +190,16 @@ void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster* broadca
void ProjectContentComponent::refreshProjectTreeFileStatuses() void ProjectContentComponent::refreshProjectTreeFileStatuses()
{ {
if (auto* fileTree = sidebar->getFileTreePanel())
fileTree->repaint();
if (sidebar != nullptr)
if (auto* fileTree = sidebar->getFileTreePanel())
fileTree->repaint();
} }
void ProjectContentComponent::updateMissingFileStatuses() 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) bool ProjectContentComponent::showEditorForFile (const File& fileToShow, bool grabFocus)
@@ -415,6 +417,9 @@ void ProjectContentComponent::showExporterSettings (const String& exporterName)
showExportersPanel(); showExportersPanel();
if (sidebar == nullptr)
return;
if (auto* exportersPanel = sidebar->getExportersTreePanel()) if (auto* exportersPanel = sidebar->getExportersTreePanel())
{ {
if (auto* exporters = dynamic_cast<TreeItemTypes::ExportersTreeRoot*> (exportersPanel->rootItem.get())) if (auto* exporters = dynamic_cast<TreeItemTypes::ExportersTreeRoot*> (exportersPanel->rootItem.get()))
@@ -440,6 +445,9 @@ void ProjectContentComponent::showModule (const String& moduleID)
{ {
showModulesPanel(); showModulesPanel();
if (sidebar == nullptr)
return;
if (auto* modsPanel = sidebar->getModuleTreePanel()) if (auto* modsPanel = sidebar->getModuleTreePanel())
{ {
if (auto* mods = dynamic_cast<TreeItemTypes::EnabledModulesItem*> (modsPanel->rootItem.get())) if (auto* mods = dynamic_cast<TreeItemTypes::EnabledModulesItem*> (modsPanel->rootItem.get()))
@@ -521,8 +529,9 @@ void ProjectContentComponent::showNewExporterMenu()
void ProjectContentComponent::deleteSelectedTreeItems() void ProjectContentComponent::deleteSelectedTreeItems()
{ {
if (auto* tree = sidebar->getTreeWithSelectedItems())
tree->deleteSelectedItems();
if (sidebar != nullptr)
if (auto* tree = sidebar->getTreeWithSelectedItems())
tree->deleteSelectedItems();
} }
void ProjectContentComponent::showBubbleMessage (Rectangle<int> pos, const String& text) void ProjectContentComponent::showBubbleMessage (Rectangle<int> pos, const String& text)
@@ -869,5 +878,6 @@ void ProjectContentComponent::addNewGUIFile()
//============================================================================== //==============================================================================
void ProjectContentComponent::showProjectPanel (const int index) void ProjectContentComponent::showProjectPanel (const int index)
{ {
sidebar->showPanel (index);
if (sidebar != nullptr)
sidebar->showPanel (index);
} }

Loading…
Cancel
Save