diff options
-rw-r--r-- | drivers/unix/dir_access_unix.cpp | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index a183a37446..cf54f3fea0 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -223,37 +223,36 @@ Error DirAccessUnix::make_dir(String p_dir) { Error DirAccessUnix::change_dir(String p_dir) { GLOBAL_LOCK_FUNCTION + p_dir = fix_path(p_dir); - // make sure current_dir is valid absolute path - if (current_dir == "." || current_dir == "") { - char real_current_dir_name[2048]; - getcwd(real_current_dir_name, 2048); - current_dir.parse_utf8(real_current_dir_name); - } - - if (p_dir == ".") { - return OK; - } + char real_current_dir_name[2048]; + getcwd(real_current_dir_name, 2048); + String prev_dir; + if (prev_dir.parse_utf8(real_current_dir_name)) + prev_dir = real_current_dir_name; //no utf8, maybe latin? - p_dir = fix_path(p_dir); + chdir(current_dir.utf8().get_data()); //ascii since this may be unicode or wathever the host os wants + bool worked = (chdir(p_dir.utf8().get_data()) == 0); // we can only give this utf8 - String prev_dir = current_dir; + String base = _get_root_path(); + if (base != "") { - if (p_dir.is_rel_path()) { - String next_dir = current_dir + "/" + p_dir; - next_dir = next_dir.simplify_path(); - current_dir = next_dir; - } else { - current_dir = p_dir; + getcwd(real_current_dir_name, 2048); + String new_dir; + new_dir.parse_utf8(real_current_dir_name); + if (!new_dir.begins_with(base)) + worked = false; } - bool worked = (chdir(current_dir.utf8().get_data()) == 0); // we can only give this utf8 - if (!worked) { - current_dir = prev_dir; - return ERR_INVALID_PARAMETER; + if (worked) { + + getcwd(real_current_dir_name, 2048); + if (current_dir.parse_utf8(real_current_dir_name)) + current_dir = real_current_dir_name; //no utf8, maybe latin? } - return OK; + chdir(prev_dir.utf8().get_data()); + return worked ? OK : ERR_INVALID_PARAMETER; } String DirAccessUnix::get_current_dir() { |