Browse Source

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.
Juan Linietsky 2 years ago
parent
commit
3a93efefee
2 changed files with 14 additions and 4 deletions
  1. 13 3
      core/os/os.cpp
  2. 1 1
      core/os/os.h

+ 13 - 3
core/os/os.cpp

@@ -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
 // 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(" ");
 	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
 		// Dir separators are allowed, but disallow ".." to avoid going up the filesystem
 		invalid_chars.push_back("..");
 		invalid_chars.push_back("..");
+		safe_dir_name = safe_dir_name.replace("\\", "/").strip_edges();
 	} else {
 	} else {
 		invalid_chars.push_back("/");
 		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++) {
 	for (int i = 0; i < invalid_chars.size(); i++) {
 		safe_dir_name = safe_dir_name.replace(invalid_chars[i], "-");
 		safe_dir_name = safe_dir_name.replace(invalid_chars[i], "-");
 	}
 	}

+ 1 - 1
core/os/os.h

@@ -237,7 +237,7 @@ public:
 
 
 	virtual uint64_t get_embedded_pck_offset() const;
 	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_godot_dir_name() const;
 
 
 	virtual String get_data_path() const;
 	virtual String get_data_path() const;