You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-09 12:50:35 +00:00
Prevent circular references to scene being saved, fixes #24384
This commit is contained in:
@@ -1501,7 +1501,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(FileAccess *f, const Varia
|
|||||||
|
|
||||||
if (!resource_set.has(res)) {
|
if (!resource_set.has(res)) {
|
||||||
f->store_32(OBJECT_EMPTY);
|
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();
|
ERR_FAIL();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1650,6 +1650,10 @@ void ResourceFormatSaverBinaryInstance::_find_resources(const Variant &p_variant
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) {
|
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();
|
int idx = external_resources.size();
|
||||||
external_resources[res] = idx;
|
external_resources[res] = idx;
|
||||||
return;
|
return;
|
||||||
@@ -1774,6 +1778,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const RES &p
|
|||||||
takeover_paths = false;
|
takeover_paths = false;
|
||||||
|
|
||||||
local_path = p_path.get_base_dir();
|
local_path = p_path.get_base_dir();
|
||||||
|
path = ProjectSettings::get_singleton()->localize_path(p_path);
|
||||||
|
|
||||||
_find_resources(p_resource, true);
|
_find_resources(p_resource, true);
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ public:
|
|||||||
class ResourceFormatSaverBinaryInstance {
|
class ResourceFormatSaverBinaryInstance {
|
||||||
|
|
||||||
String local_path;
|
String local_path;
|
||||||
|
String path;
|
||||||
|
|
||||||
bool relative_paths;
|
bool relative_paths;
|
||||||
bool bundle_resources;
|
bool bundle_resources;
|
||||||
|
|||||||
@@ -1361,7 +1361,9 @@ String ResourceFormatSaverTextInstance::_write_resource(const RES &res) {
|
|||||||
if (internal_resources.has(res)) {
|
if (internal_resources.has(res)) {
|
||||||
return "SubResource( " + itos(internal_resources[res]) + " )";
|
return "SubResource( " + itos(internal_resources[res]) + " )";
|
||||||
} else if (res->get_path().length() && res->get_path().find("::") == -1) {
|
} else if (res->get_path().length() && res->get_path().find("::") == -1) {
|
||||||
|
if (res->get_path() == local_path) { //circular reference attempt
|
||||||
|
return "null";
|
||||||
|
}
|
||||||
//external resource
|
//external resource
|
||||||
String path = relative_paths ? local_path.path_to_file(res->get_path()) : res->get_path();
|
String path = relative_paths ? local_path.path_to_file(res->get_path()) : res->get_path();
|
||||||
return "Resource( \"" + path + "\" )";
|
return "Resource( \"" + path + "\" )";
|
||||||
@@ -1386,6 +1388,10 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) {
|
if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) {
|
||||||
|
if (res->get_path() == local_path) {
|
||||||
|
ERR_PRINTS("Circular reference to resource being saved found: '"+local_path+"' will be null next time it's loaded.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
int index = external_resources.size();
|
int index = external_resources.size();
|
||||||
external_resources[res] = index;
|
external_resources[res] = index;
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user