Browse Source

Fix Project Manager hard crashes due to invalid access to Editor Nodes

Marios Staikopoulos 3 years ago
parent
commit
da2b5da0c5
3 changed files with 19 additions and 14 deletions
  1. 7 4
      editor/editor_dir_dialog.cpp
  2. 5 3
      editor/editor_file_dialog.cpp
  3. 7 7
      editor/filesystem_dock.cpp

+ 7 - 4
editor/editor_dir_dialog.cpp

@@ -156,15 +156,18 @@ void EditorDirDialog::_make_dir_confirm() {
 
 
 	String dir = ti->get_metadata(0);
 	String dir = ti->get_metadata(0);
 
 
-	if (EditorFileSystem::get_singleton()->get_filesystem_path(dir + makedirname->get_text())) {
+	DirAccessRef d = DirAccess::open(dir);
+	ERR_FAIL_COND_MSG(!d, "Cannot open directory '" + dir + "'.");
+
+	const String stripped_dirname = makedirname->get_text().strip_edges();
+
+	if (d->dir_exists(stripped_dirname)) {
 		mkdirerr->set_text(TTR("Could not create folder. File with that name already exists."));
 		mkdirerr->set_text(TTR("Could not create folder. File with that name already exists."));
 		mkdirerr->popup_centered();
 		mkdirerr->popup_centered();
 		return;
 		return;
 	}
 	}
 
 
-	DirAccessRef d = DirAccess::open(dir);
-	ERR_FAIL_COND_MSG(!d, "Cannot open directory '" + dir + "'.");
-	Error err = d->make_dir(makedirname->get_text());
+	Error err = d->make_dir(stripped_dirname);
 	if (err != OK) {
 	if (err != OK) {
 		mkdirerr->popup_centered(Size2(250, 80) * EDSCALE);
 		mkdirerr->popup_centered(Size2(250, 80) * EDSCALE);
 	} else {
 	} else {

+ 5 - 3
editor/editor_file_dialog.cpp

@@ -1099,16 +1099,18 @@ EditorFileDialog::Access EditorFileDialog::get_access() const {
 }
 }
 
 
 void EditorFileDialog::_make_dir_confirm() {
 void EditorFileDialog::_make_dir_confirm() {
-	if (EditorFileSystem::get_singleton()->get_filesystem_path(makedirname->get_text().strip_edges())) {
+	const String stripped_dirname = makedirname->get_text().strip_edges();
+
+	if (dir_access->dir_exists(stripped_dirname)) {
 		error_dialog->set_text(TTR("Could not create folder. File with that name already exists."));
 		error_dialog->set_text(TTR("Could not create folder. File with that name already exists."));
 		error_dialog->popup_centered(Size2(250, 50) * EDSCALE);
 		error_dialog->popup_centered(Size2(250, 50) * EDSCALE);
 		makedirname->set_text(""); // Reset label.
 		makedirname->set_text(""); // Reset label.
 		return;
 		return;
 	}
 	}
 
 
-	Error err = dir_access->make_dir(makedirname->get_text().strip_edges());
+	Error err = dir_access->make_dir(stripped_dirname);
 	if (err == OK) {
 	if (err == OK) {
-		dir_access->change_dir(makedirname->get_text().strip_edges());
+		dir_access->change_dir(stripped_dirname);
 		invalidate();
 		invalidate();
 		update_filters();
 		update_filters();
 		update_dir();
 		update_dir();

+ 7 - 7
editor/filesystem_dock.cpp

@@ -1427,18 +1427,18 @@ void FileSystemDock::_make_dir_confirm() {
 		directory = directory.get_base_dir();
 		directory = directory.get_base_dir();
 	}
 	}
 
 
-	if (EditorFileSystem::get_singleton()->get_filesystem_path(directory + dir_name)) {
-		EditorNode::get_singleton()->show_warning(TTR("Could not create folder. File with that name already exists."));
-		return;
-	}
-
 	print_verbose("Making folder " + dir_name + " in " + directory);
 	print_verbose("Making folder " + dir_name + " in " + directory);
 	DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
 	DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
 	Error err = da->change_dir(directory);
 	Error err = da->change_dir(directory);
-	if (err == OK) {
-		err = da->make_dir(dir_name);
+	ERR_FAIL_COND_MSG(err != OK, "Cannot open directory '" + directory + "'.");
+
+	if (da->dir_exists(directory)) {
+		EditorNode::get_singleton()->show_warning(TTR("Could not create folder. File with that name already exists."));
+		return;
 	}
 	}
 
 
+	err = da->make_dir(dir_name);
+
 	if (err == OK) {
 	if (err == OK) {
 		print_verbose("FileSystem: calling rescan.");
 		print_verbose("FileSystem: calling rescan.");
 		_rescan();
 		_rescan();