From 9ad9d1f3b3a5e6d1440a0f8d38e1b3246e00412d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Thu, 30 May 2019 16:03:12 +0200 Subject: 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 --- core/project_settings.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'core/project_settings.cpp') 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); -- cgit v1.2.3