From c99fd217e230fbeef07e8bbda2c0a21fb3b0169d Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 18 May 2021 01:59:13 +0200 Subject: [PATCH] AK: Make LexicalPath handle relative paths correctly Previously LexicalPath would consider "." and ".." as equivalent to "/". This is not true though. --- AK/LexicalPath.cpp | 2 +- Tests/AK/TestLexicalPath.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/AK/LexicalPath.cpp b/AK/LexicalPath.cpp index 0e18d00365b..b810ba24626 100644 --- a/AK/LexicalPath.cpp +++ b/AK/LexicalPath.cpp @@ -55,7 +55,7 @@ void LexicalPath::canonicalize() } } if (canonical_parts.is_empty()) { - m_string = m_basename = m_dirname = "/"; + m_string = m_basename = m_dirname = m_is_absolute ? "/" : "."; return; } diff --git a/Tests/AK/TestLexicalPath.cpp b/Tests/AK/TestLexicalPath.cpp index 044f5f157a3..0aa9986c9cd 100644 --- a/Tests/AK/TestLexicalPath.cpp +++ b/Tests/AK/TestLexicalPath.cpp @@ -24,12 +24,16 @@ TEST_CASE(basic) EXPECT_EQ(path.parts().size(), 3u); EXPECT_EQ(path.parts(), Vector({ "abc", "def", "ghi.txt" })); EXPECT_EQ(path.string(), "/abc/def/ghi.txt"); + EXPECT_EQ(LexicalPath(".").string(), "."); + EXPECT_EQ(LexicalPath("..").string(), ".."); } TEST_CASE(dotdot_coalescing) { EXPECT_EQ(LexicalPath("/home/user/../../not/home").string(), "/not/home"); EXPECT_EQ(LexicalPath("/../../../../").string(), "/"); + EXPECT_EQ(LexicalPath("./../../../../").string(), "../../../.."); + EXPECT_EQ(LexicalPath("../../../../../").string(), "../../../../.."); } TEST_CASE(has_extension)