Fix cases of broken user:// paths.

* Properly validate paths when supplying the project name.
* Ensures that the user data dir will always be valid.

Fixes 69366.
This commit is contained in:
Juan Linietsky 2023-01-14 15:07:28 +01:00
parent ac104a69b8
commit 3a93efefee
2 changed files with 14 additions and 4 deletions

View File

@ -203,16 +203,26 @@ uint64_t OS::get_embedded_pck_offset() const {
}
// Helper function to ensure that a dir name/path will be valid on the OS
String OS::get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator) const {
String OS::get_safe_dir_name(const String &p_dir_name, bool p_allow_paths) const {
String safe_dir_name = p_dir_name;
Vector<String> invalid_chars = String(": * ? \" < > |").split(" ");
if (p_allow_dir_separator) {
if (p_allow_paths) {
// Dir separators are allowed, but disallow ".." to avoid going up the filesystem
invalid_chars.push_back("..");
safe_dir_name = safe_dir_name.replace("\\", "/").strip_edges();
} else {
invalid_chars.push_back("/");
invalid_chars.push_back("\\");
safe_dir_name = safe_dir_name.strip_edges();
// These directory names are invalid.
if (safe_dir_name == ".") {
safe_dir_name = "dot";
} else if (safe_dir_name == "..") {
safe_dir_name = "twodots";
}
}
String safe_dir_name = p_dir_name.replace("\\", "/").strip_edges();
for (int i = 0; i < invalid_chars.size(); i++) {
safe_dir_name = safe_dir_name.replace(invalid_chars[i], "-");
}

View File

@ -237,7 +237,7 @@ public:
virtual uint64_t get_embedded_pck_offset() const;
String get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator = false) const;
String get_safe_dir_name(const String &p_dir_name, bool p_allow_paths = false) const;
virtual String get_godot_dir_name() const;
virtual String get_data_path() const;