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 c080ec5da2)
This commit is contained in:
Rémi Verschelde 2020-06-08 13:05:09 +02:00
parent 1a1c30702d
commit f3fcdfbdd0
2 changed files with 5 additions and 2 deletions

View File

@ -3426,13 +3426,13 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
if (!new_scene) { if (!new_scene) {
sdata.unref(); sdata.unref();
_dialog_display_load_error(lpath, ERR_FILE_NOT_FOUND); _dialog_display_load_error(lpath, ERR_FILE_CORRUPT);
opening_prev = false; opening_prev = false;
if (prev != -1) { if (prev != -1) {
set_current_scene(prev); set_current_scene(prev);
editor_data.remove_scene(idx); editor_data.remove_scene(idx);
} }
return ERR_FILE_NOT_FOUND; return ERR_FILE_CORRUPT;
} }
if (p_set_inherited) { if (p_set_inherited) {

View File

@ -101,6 +101,9 @@ Node *SceneState::instance(GenEditState p_edit_state) const {
} }
#endif #endif
parent = nparent; 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; Node *node = NULL;