forked from Mirrorlandia_minetest/minetest
Fix RemoveRelatvePathComponents
This used to return "/foo" for "../foo" when it should return the enpty string (i.e., error removing all relative components).
This commit is contained in:
parent
59f84ca0a0
commit
f522e7351a
@ -617,48 +617,51 @@ std::string RemoveRelativePathComponents(std::string path)
|
|||||||
{
|
{
|
||||||
size_t pos = path.size();
|
size_t pos = path.size();
|
||||||
size_t dotdot_count = 0;
|
size_t dotdot_count = 0;
|
||||||
while(pos != 0){
|
while (pos != 0) {
|
||||||
size_t component_with_delim_end = pos;
|
size_t component_with_delim_end = pos;
|
||||||
// skip a dir delimiter
|
// skip a dir delimiter
|
||||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
while (pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||||
pos--;
|
pos--;
|
||||||
// strip a path component
|
// strip a path component
|
||||||
size_t component_end = pos;
|
size_t component_end = pos;
|
||||||
while(pos != 0 && !IsDirDelimiter(path[pos-1]))
|
while (pos != 0 && !IsDirDelimiter(path[pos-1]))
|
||||||
pos--;
|
pos--;
|
||||||
size_t component_start = pos;
|
size_t component_start = pos;
|
||||||
|
|
||||||
std::string component = path.substr(component_start,
|
std::string component = path.substr(component_start,
|
||||||
component_end - component_start);
|
component_end - component_start);
|
||||||
bool remove_this_component = false;
|
bool remove_this_component = false;
|
||||||
if(component == "." && component_start != 0){
|
if (component == ".") {
|
||||||
remove_this_component = true;
|
remove_this_component = true;
|
||||||
}
|
} else if (component == "..") {
|
||||||
else if(component == ".."){
|
|
||||||
remove_this_component = true;
|
remove_this_component = true;
|
||||||
dotdot_count += 1;
|
dotdot_count += 1;
|
||||||
}
|
} else if (dotdot_count != 0) {
|
||||||
else if(dotdot_count != 0){
|
|
||||||
remove_this_component = true;
|
remove_this_component = true;
|
||||||
dotdot_count -= 1;
|
dotdot_count -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(remove_this_component){
|
if (remove_this_component) {
|
||||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
while (pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||||
pos--;
|
pos--;
|
||||||
path = path.substr(0, pos) + DIR_DELIM +
|
if (component_start == 0) {
|
||||||
path.substr(component_with_delim_end,
|
// We need to remove the delemiter too
|
||||||
std::string::npos);
|
path = path.substr(component_with_delim_end, std::string::npos);
|
||||||
pos++;
|
} else {
|
||||||
|
path = path.substr(0, pos) + DIR_DELIM +
|
||||||
|
path.substr(component_with_delim_end, std::string::npos);
|
||||||
|
}
|
||||||
|
if (pos > 0)
|
||||||
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dotdot_count > 0)
|
if (dotdot_count > 0)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
// remove trailing dir delimiters
|
// remove trailing dir delimiters
|
||||||
pos = path.size();
|
pos = path.size();
|
||||||
while(pos != 0 && IsDirDelimiter(path[pos-1]))
|
while (pos != 0 && IsDirDelimiter(path[pos-1]))
|
||||||
pos--;
|
pos--;
|
||||||
return path.substr(0, pos);
|
return path.substr(0, pos);
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,10 @@ void TestFilePath::testRemoveRelativePathComponent()
|
|||||||
UASSERT(result == p("/home/user/minetest/worlds/world1"));
|
UASSERT(result == p("/home/user/minetest/worlds/world1"));
|
||||||
path = p(".");
|
path = p(".");
|
||||||
result = fs::RemoveRelativePathComponents(path);
|
result = fs::RemoveRelativePathComponents(path);
|
||||||
UASSERT(result == ".");
|
UASSERT(result == "");
|
||||||
|
path = p("../a");
|
||||||
|
result = fs::RemoveRelativePathComponents(path);
|
||||||
|
UASSERT(result == "");
|
||||||
path = p("./subdir/../..");
|
path = p("./subdir/../..");
|
||||||
result = fs::RemoveRelativePathComponents(path);
|
result = fs::RemoveRelativePathComponents(path);
|
||||||
UASSERT(result == "");
|
UASSERT(result == "");
|
||||||
|
Loading…
Reference in New Issue
Block a user