summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-01-12 07:07:36 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-01-12 07:07:36 -0300
commitf2ae6f87a448bf65f18eac572732cdf29012d661 (patch)
tree3eace3a12776ff671a9eb20696d5313e7e67891c
parenta625f7d07317ac4fac21962a99a7896ed13010c7 (diff)
Fix situation where TSCN format might crash, closes #3062
-rw-r--r--scene/resources/packed_scene.h5
-rw-r--r--scene/resources/scene_format_text.cpp16
2 files changed, 14 insertions, 7 deletions
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h
index 911ffd2542..415357b61f 100644
--- a/scene/resources/packed_scene.h
+++ b/scene/resources/packed_scene.h
@@ -50,7 +50,6 @@ class SceneState : public Reference {
FLAG_INSTANCE_IS_PLACEHOLDER=(1<<30),
FLAG_MASK=(1<<24)-1,
NO_PARENT_SAVED=0x7FFFFFFF,
- TYPE_INSTANCED=0x7FFFFFFF,
};
@@ -106,6 +105,10 @@ class SceneState : public Reference {
static bool disable_placeholders;
public:
+ enum {
+ TYPE_INSTANCED=0x7FFFFFFF
+ };
+
static void set_disable_placeholders(bool p_disable);
int find_node_by_path(const NodePath& p_node) const;
diff --git a/scene/resources/scene_format_text.cpp b/scene/resources/scene_format_text.cpp
index ca85ca957a..2552f682fa 100644
--- a/scene/resources/scene_format_text.cpp
+++ b/scene/resources/scene_format_text.cpp
@@ -362,18 +362,15 @@ Error ResourceInteractiveLoaderText::poll() {
parent=packed_scene->get_state()->add_node_path(next_tag.fields["parent"]);
}
- if (next_tag.fields.has("owner")) {
- owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]);
- } else {
- if (parent!=-1)
- owner=0; //if no owner, owner is root
- }
if (next_tag.fields.has("type")) {
type=packed_scene->get_state()->add_name(next_tag.fields["type"]);
+ } else {
+ type=SceneState::TYPE_INSTANCED; //no type? assume this was instanced
}
+
if (next_tag.fields.has("instance")) {
instance=packed_scene->get_state()->add_value(next_tag.fields["instance"]);
@@ -384,6 +381,13 @@ Error ResourceInteractiveLoaderText::poll() {
}
}
+ if (next_tag.fields.has("owner")) {
+ owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]);
+ } else {
+ if (parent!=-1 && !(type==SceneState::TYPE_INSTANCED && instance==-1))
+ owner=0; //if no owner, owner is root
+ }
+
int node_id = packed_scene->get_state()->add_node(parent,owner,type,name,instance);