Browse Source

Merge pull request #39389 from akien-mga/packedscene-root-aint-got-parents

PackedScene: Prevent crash when root node has `parent` attribute
Rémi Verschelde 5 years ago
parent
commit
201d5a7fc5
2 changed files with 10 additions and 7 deletions
  1. 7 7
      editor/editor_node.cpp
  2. 3 0
      scene/resources/packed_scene.cpp

+ 7 - 7
editor/editor_node.cpp

@@ -903,19 +903,19 @@ void EditorNode::_dialog_display_load_error(String p_file, Error p_error) {
 	if (p_error) {
 		switch (p_error) {
 			case ERR_CANT_OPEN: {
-				show_accept(vformat(TTR("Can't open '%s'. The file could have been moved or deleted."), p_file.get_file()), TTR("OK"));
+				show_accept(vformat(TTR("Can't open file '%s'. The file could have been moved or deleted."), p_file.get_file()), TTR("OK"));
 			} break;
 			case ERR_PARSE_ERROR: {
-				show_accept(vformat(TTR("Error while parsing '%s'."), p_file.get_file()), TTR("OK"));
+				show_accept(vformat(TTR("Error while parsing file '%s'."), p_file.get_file()), TTR("OK"));
 			} break;
 			case ERR_FILE_CORRUPT: {
-				show_accept(vformat(TTR("Unexpected end of file '%s'."), p_file.get_file()), TTR("OK"));
+				show_accept(vformat(TTR("Scene file '%s' appears to be invalid/corrupt."), p_file.get_file()), TTR("OK"));
 			} break;
 			case ERR_FILE_NOT_FOUND: {
-				show_accept(vformat(TTR("Missing '%s' or its dependencies."), p_file.get_file()), TTR("OK"));
+				show_accept(vformat(TTR("Missing file '%s' or one its dependencies."), p_file.get_file()), TTR("OK"));
 			} break;
 			default: {
-				show_accept(vformat(TTR("Error while loading '%s'."), p_file.get_file()), TTR("OK"));
+				show_accept(vformat(TTR("Error while loading file '%s'."), p_file.get_file()), TTR("OK"));
 			} break;
 		}
 	}
@@ -3254,13 +3254,13 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
 
 	if (!new_scene) {
 		sdata.unref();
-		_dialog_display_load_error(lpath, ERR_FILE_NOT_FOUND);
+		_dialog_display_load_error(lpath, ERR_FILE_CORRUPT);
 		opening_prev = false;
 		if (prev != -1) {
 			set_current_scene(prev);
 			editor_data.remove_scene(idx);
 		}
-		return ERR_FILE_NOT_FOUND;
+		return ERR_FILE_CORRUPT;
 	}
 
 	if (p_set_inherited) {

+ 3 - 0
scene/resources/packed_scene.cpp

@@ -98,6 +98,9 @@ Node *SceneState::instance(GenEditState p_edit_state) const {
 			}
 #endif
 			parent = nparent;
+		} else {
+			// i == 0 is root node. Confirm that it doesn't have a parent defined.
+			ERR_FAIL_COND_V_MSG(n.parent != -1, nullptr, vformat("Invalid scene: root node %s cannot specify a parent node.", snames[n.name]));
 		}
 
 		Node *node = nullptr;