From 1eb2b97db74f21ef8f8a85802b376463fe2f6c0d Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 14 Jul 2022 21:29:24 +0200 Subject: [PATCH] Fix access after delete of workspace folders when deleting parent and child --- IDE/src/ui/ProjectPanel.bf | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index ec17bf88..0f1ee302 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -1798,12 +1798,34 @@ namespace IDE.ui if (mListViewToProjectMap.TryGetValue(projectListViewItem, let projectItem)) mProjectToWorkspaceFolderMap.Remove(projectItem); } + + HashSet deletedFolders = scope .(); + bool HasDeletedParent(WorkspaceFolder folder) + { + WorkspaceFolder parent = folder; + repeat + { + parent = parent.mParent; + + if (deletedFolders.Contains(Internal.UnsafeCastToPtr(parent))) + return true; + } + while (parent != null); + + return false; + } + for (let folder in foldersToDelete) { - let folderItem = folder.mListView; - mListViewToWorkspaceFolderMap.Remove(folderItem); - folderItem.mParentItem.RemoveChildItem(folderItem); - gApp.mWorkspace.mWorkspaceFolders.Remove(folder); + if (!HasDeletedParent(folder)) + { + let folderItem = folder.mListView; + mListViewToWorkspaceFolderMap.Remove(folderItem); + folderItem.mParentItem.RemoveChildItem(folderItem); + } + + gApp.mWorkspace.mWorkspaceFolders.Remove(folder); + deletedFolders.Add(Internal.UnsafeCastToPtr(folder)); delete folder; }