Skip to content

Commit cf34d32

Browse files
committed
Merge pull request godotengine#97746 from stijn-h/fix-qo-crash
Fix double free in QuickOpenDialog deconstructor
2 parents 1917bc3 + 6d23fac commit cf34d32

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

editor/gui/editor_quick_open_dialog.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,16 @@ QuickOpenResultContainer::QuickOpenResultContainer() {
223223
}
224224

225225
QuickOpenResultContainer::~QuickOpenResultContainer() {
226-
for (QuickOpenResultItem *E : result_items) {
227-
memdelete(E);
226+
if (never_opened) {
227+
for (QuickOpenResultItem *E : result_items) {
228+
memdelete(E);
229+
}
228230
}
229231
}
230232

231233
void QuickOpenResultContainer::init(const Vector<StringName> &p_base_types) {
232234
base_types = p_base_types;
235+
never_opened = false;
233236

234237
const int display_mode_behavior = EDITOR_GET("filesystem/quick_open_dialog/default_display_mode");
235238
const bool adaptive_display_mode = (display_mode_behavior == 0);
@@ -574,13 +577,9 @@ void QuickOpenResultContainer::_toggle_display_mode() {
574577
void QuickOpenResultContainer::_set_display_mode(QuickOpenDisplayMode p_display_mode) {
575578
content_display_mode = p_display_mode;
576579

577-
const bool first_time = !list->is_visible() && !grid->is_visible();
578-
579-
if (!first_time) {
580-
const bool show_list = (content_display_mode == QuickOpenDisplayMode::LIST);
581-
if ((show_list && list->is_visible()) || (!show_list && grid->is_visible())) {
582-
return;
583-
}
580+
const bool show_list = (content_display_mode == QuickOpenDisplayMode::LIST);
581+
if ((show_list && list->is_visible()) || (!show_list && grid->is_visible())) {
582+
return;
584583
}
585584

586585
hide();
@@ -596,6 +595,8 @@ void QuickOpenResultContainer::_set_display_mode(QuickOpenDisplayMode p_display_
596595
next_root = Object::cast_to<CanvasItem>(grid);
597596
}
598597

598+
const bool first_time = !list->is_visible() && !grid->is_visible();
599+
599600
prev_root->hide();
600601
for (QuickOpenResultItem *item : result_items) {
601602
item->set_display_mode(content_display_mode);

editor/gui/editor_quick_open_dialog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ class QuickOpenResultContainer : public VBoxContainer {
9696
int selection_index = -1;
9797
int num_visible_results = 0;
9898
int max_total_results = 0;
99+
99100
bool showing_history = false;
101+
bool never_opened = true;
100102

101103
QuickOpenDisplayMode content_display_mode = QuickOpenDisplayMode::LIST;
102104
Vector<QuickOpenResultItem *> result_items;

0 commit comments

Comments
 (0)