summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2019-05-30 16:03:12 +0200
committerRémi Verschelde <rverschelde@gmail.com>2019-05-30 16:03:12 +0200
commit9ad9d1f3b3a5e6d1440a0f8d38e1b3246e00412d (patch)
tree949cdc058de52f706d3f0fffe755969c76affe2e
parent7310c84367ad336f3c58253f7adea6ba21e24b91 (diff)
Don't localize paths that contain but are not in the resource path
This issue could be triggered if you try to access a path which contains the resource path string in its absolute path, while pointing to a directory which is *not* in the resource path. It's clearer with an example: with `/my/project` as resource path, the previous logic would also localize `/my/project_data` to `res://data`, which is incorrect and would lead to a cryptic error. Fixes #24761. Co-authored-by: volzhs <volzhs@gmail.com>
-rw-r--r--core/project_settings.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/core/project_settings.cpp b/core/project_settings.cpp
index 2fd22d4789..4c37142ffd 100644
--- a/core/project_settings.cpp
+++ b/core/project_settings.cpp
@@ -75,11 +75,19 @@ String ProjectSettings::localize_path(const String &p_path) const {
memdelete(dir);
- if (!cwd.begins_with(resource_path)) {
+ // Ensure that we end with a '/'.
+ // This is important to ensure that we do not wrongly localize the resource path
+ // in an absolute path that just happens to contain this string but points to a
+ // different folder (e.g. "/my/project" as resource_path would be contained in
+ // "/my/project_data", even though the latter is not part of res://.
+ // `plus_file("")` is an easy way to ensure we have a trailing '/'.
+ const String res_path = resource_path.plus_file("");
+
+ if (!cwd.begins_with(res_path)) {
return p_path;
};
- return cwd.replace_first(resource_path, "res:/");
+ return cwd.replace_first(res_path, "res://");
} else {
memdelete(dir);