diff options
author | Juan Linietsky <juan@godotengine.org> | 2019-02-24 10:45:08 -0300 |
---|---|---|
committer | Juan Linietsky <juan@godotengine.org> | 2019-02-24 10:48:38 -0300 |
commit | 3ea04c1366eb83327b4552a8e84b68a8130f6bc1 (patch) | |
tree | eb5dce4d670a368a0bcbac12aa5d7805cf84ab45 /core/io | |
parent | 755c69025295291d3a361e336f9289edb6634f4d (diff) |
Prevent circular references to scene being saved, fixes #24384
Diffstat (limited to 'core/io')
-rw-r--r-- | core/io/resource_format_binary.cpp | 7 | ||||
-rw-r--r-- | core/io/resource_format_binary.h | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index d2c656b8eb..6c48942d72 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -1501,7 +1501,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia if (!resource_set.has(res)) { f->store_32(OBJECT_EMPTY); - ERR_EXPLAIN("Resource was not pre cached for the resource section, bug?"); + ERR_EXPLAIN("Resource was not pre cached for the resource section, most likely due to circular refedence."); ERR_FAIL(); } @@ -1650,6 +1650,10 @@ void ResourceFormatSaverBinaryInstance::_find_resources(const Variant &p_variant return; if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) { + if (res->get_path() == path) { + ERR_PRINTS("Circular reference to resource being saved found: '" + local_path + "' will be null next time it's loaded."); + return; + } int idx = external_resources.size(); external_resources[res] = idx; return; @@ -1774,6 +1778,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p takeover_paths = false; local_path = p_path.get_base_dir(); + path = ProjectSettings::get_singleton()->localize_path(p_path); _find_resources(p_resource, true); diff --git a/core/io/resource_format_binary.h b/core/io/resource_format_binary.h index c3c477b805..a4894e4033 100644 --- a/core/io/resource_format_binary.h +++ b/core/io/resource_format_binary.h @@ -114,6 +114,7 @@ public: class ResourceFormatSaverBinaryInstance { String local_path; + String path; bool relative_paths; bool bundle_resources; |