Skip to content

Commit f522e73

Browse files
ShadowNinjaZeno-
authored andcommittedDec 20, 2016
Fix RemoveRelatvePathComponents
This used to return "/foo" for "../foo" when it should return the enpty string (i.e., error removing all relative components).
1 parent 59f84ca commit f522e73

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed
 

Diff for: ‎src/filesys.cpp

+19-16
Original file line numberDiff line numberDiff line change
@@ -617,48 +617,51 @@ std::string RemoveRelativePathComponents(std::string path)
617617
{
618618
size_t pos = path.size();
619619
size_t dotdot_count = 0;
620-
while(pos != 0){
620+
while (pos != 0) {
621621
size_t component_with_delim_end = pos;
622622
// skip a dir delimiter
623-
while(pos != 0 && IsDirDelimiter(path[pos-1]))
623+
while (pos != 0 && IsDirDelimiter(path[pos-1]))
624624
pos--;
625625
// strip a path component
626626
size_t component_end = pos;
627-
while(pos != 0 && !IsDirDelimiter(path[pos-1]))
627+
while (pos != 0 && !IsDirDelimiter(path[pos-1]))
628628
pos--;
629629
size_t component_start = pos;
630630

631631
std::string component = path.substr(component_start,
632632
component_end - component_start);
633633
bool remove_this_component = false;
634-
if(component == "." && component_start != 0){
634+
if (component == ".") {
635635
remove_this_component = true;
636-
}
637-
else if(component == ".."){
636+
} else if (component == "..") {
638637
remove_this_component = true;
639638
dotdot_count += 1;
640-
}
641-
else if(dotdot_count != 0){
639+
} else if (dotdot_count != 0) {
642640
remove_this_component = true;
643641
dotdot_count -= 1;
644642
}
645643

646-
if(remove_this_component){
647-
while(pos != 0 && IsDirDelimiter(path[pos-1]))
644+
if (remove_this_component) {
645+
while (pos != 0 && IsDirDelimiter(path[pos-1]))
648646
pos--;
649-
path = path.substr(0, pos) + DIR_DELIM +
650-
path.substr(component_with_delim_end,
651-
std::string::npos);
652-
pos++;
647+
if (component_start == 0) {
648+
// We need to remove the delemiter too
649+
path = path.substr(component_with_delim_end, std::string::npos);
650+
} else {
651+
path = path.substr(0, pos) + DIR_DELIM +
652+
path.substr(component_with_delim_end, std::string::npos);
653+
}
654+
if (pos > 0)
655+
pos++;
653656
}
654657
}
655658

656-
if(dotdot_count > 0)
659+
if (dotdot_count > 0)
657660
return "";
658661

659662
// remove trailing dir delimiters
660663
pos = path.size();
661-
while(pos != 0 && IsDirDelimiter(path[pos-1]))
664+
while (pos != 0 && IsDirDelimiter(path[pos-1]))
662665
pos--;
663666
return path.substr(0, pos);
664667
}

Diff for: ‎src/unittest/test_filepath.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,10 @@ void TestFilePath::testRemoveRelativePathComponent()
251251
UASSERT(result == p("/home/user/minetest/worlds/world1"));
252252
path = p(".");
253253
result = fs::RemoveRelativePathComponents(path);
254-
UASSERT(result == ".");
254+
UASSERT(result == "");
255+
path = p("../a");
256+
result = fs::RemoveRelativePathComponents(path);
257+
UASSERT(result == "");
255258
path = p("./subdir/../..");
256259
result = fs::RemoveRelativePathComponents(path);
257260
UASSERT(result == "");

0 commit comments

Comments
 (0)
Please sign in to comment.