From f3fcdfbdd00a5fefc4c57bf0af6e72099b7134f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Mon, 8 Jun 2020 13:05:09 +0200 Subject: [PATCH] PackedScene: Prevent crash when root node has `parent` attribute The crash happens further down when setting an invalid owner in `Node::_set_owner_nocheck` but I couldn't figure out how to fix it. But here the proper fix is to catch the invalid scene file early on and fail loading it. Part of #17372. (cherry picked from commit c080ec5da220474a80789afa33cc4f5612cddb50) --- editor/editor_node.cpp | 4 ++-- scene/resources/packed_scene.cpp | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index e017cc17020..05bbbe6d545 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -3426,13 +3426,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) { diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 3e7d350eece..c6f52d70873 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -101,6 +101,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 = NULL;