diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index b34e8a7e07a..7f4daf49a44 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -646,7 +646,7 @@ public abstract class StringUtils { String prefix = ""; if (prefixIndex != -1) { prefix = pathToUse.substring(0, prefixIndex + 1); - if (prefix.contains("/")) { + if (prefix.contains(FOLDER_SEPARATOR)) { prefix = ""; } else { @@ -659,7 +659,7 @@ public abstract class StringUtils { } String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR); - List pathElements = new LinkedList<>(); + LinkedList pathElements = new LinkedList<>(); int tops = 0; for (int i = pathArray.length - 1; i >= 0; i--) { @@ -687,6 +687,10 @@ public abstract class StringUtils { for (int i = 0; i < tops; i++) { pathElements.add(0, TOP_PATH); } + // If nothing else left, at least explicitly point to current path. + if (pathElements.size() == 1 && "".equals(pathElements.getLast()) && !prefix.endsWith(FOLDER_SEPARATOR)) { + pathElements.add(0, CURRENT_PATH); + } return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR); } diff --git a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java index c0b0ab5afbf..80e83aba887 100644 --- a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java @@ -378,53 +378,59 @@ public class StringUtilsTests { assertEquals("../mypath/myfile", StringUtils.cleanPath("mypath/../../mypath/myfile")); assertEquals("/../mypath/myfile", StringUtils.cleanPath("/../mypath/myfile")); assertEquals("/mypath/myfile", StringUtils.cleanPath("/a/:b/../../mypath/myfile")); - assertEquals("file:///c:/path/to/the%20file.txt", StringUtils.cleanPath("file:///c:/some/../path/to/the%20file.txt")); + assertEquals("/", StringUtils.cleanPath("/")); + assertEquals("/", StringUtils.cleanPath("/mypath/../")); + assertEquals("", StringUtils.cleanPath("mypath/..")); + assertEquals("", StringUtils.cleanPath("mypath/../.")); + assertEquals("./", StringUtils.cleanPath("mypath/../")); + assertEquals("./", StringUtils.cleanPath("././")); + assertEquals("./", StringUtils.cleanPath("./")); + assertEquals("../", StringUtils.cleanPath("../")); + assertEquals("../", StringUtils.cleanPath("./../")); + assertEquals("../", StringUtils.cleanPath(".././")); + assertEquals("file:/", StringUtils.cleanPath("file:/")); + assertEquals("file:/", StringUtils.cleanPath("file:/mypath/../")); + assertEquals("file:", StringUtils.cleanPath("file:mypath/..")); + assertEquals("file:", StringUtils.cleanPath("file:mypath/../.")); + assertEquals("file:./", StringUtils.cleanPath("file:mypath/../")); + assertEquals("file:./", StringUtils.cleanPath("file:././")); + assertEquals("file:./", StringUtils.cleanPath("file:./")); + assertEquals("file:../", StringUtils.cleanPath("file:../")); + assertEquals("file:../", StringUtils.cleanPath("file:./../")); + assertEquals("file:../", StringUtils.cleanPath("file:.././")); + assertEquals("file:///c:/path/the%20file.txt", StringUtils.cleanPath("file:///c:/some/../path/the%20file.txt")); } @Test public void testPathEquals() { assertTrue("Must be true for the same strings", - StringUtils.pathEquals("/dummy1/dummy2/dummy3", - "/dummy1/dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dummy2/dummy3")); assertTrue("Must be true for the same win strings", - StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", - "C:\\dummy1\\dummy2\\dummy3")); + StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\dummy2\\dummy3")); assertTrue("Must be true for one top path on 1", - StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", - "/dummy1/dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", "/dummy1/dummy2/dummy3")); assertTrue("Must be true for one win top path on 2", - StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", - "C:\\dummy1\\bin\\..\\dummy2\\dummy3")); + StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\..\\dummy2\\dummy3")); assertTrue("Must be true for two top paths on 1", - StringUtils.pathEquals("/dummy1/bin/../dummy2/bin/../dummy3", - "/dummy1/dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/bin/../dummy2/bin/../dummy3", "/dummy1/dummy2/dummy3")); assertTrue("Must be true for two win top paths on 2", - StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", - "C:\\dummy1\\bin\\..\\dummy2\\bin\\..\\dummy3")); + StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\..\\dummy2\\bin\\..\\dummy3")); assertTrue("Must be true for double top paths on 1", - StringUtils.pathEquals("/dummy1/bin/tmp/../../dummy2/dummy3", - "/dummy1/dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/bin/tmp/../../dummy2/dummy3", "/dummy1/dummy2/dummy3")); assertTrue("Must be true for double top paths on 2 with similarity", - StringUtils.pathEquals("/dummy1/dummy2/dummy3", - "/dummy1/dum/dum/../../dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dum/dum/../../dummy2/dummy3")); assertTrue("Must be true for current paths", - StringUtils.pathEquals("./dummy1/dummy2/dummy3", - "dummy1/dum/./dum/../../dummy2/dummy3")); + StringUtils.pathEquals("./dummy1/dummy2/dummy3", "dummy1/dum/./dum/../../dummy2/dummy3")); assertFalse("Must be false for relative/absolute paths", - StringUtils.pathEquals("./dummy1/dummy2/dummy3", - "/dummy1/dum/./dum/../../dummy2/dummy3")); + StringUtils.pathEquals("./dummy1/dummy2/dummy3", "/dummy1/dum/./dum/../../dummy2/dummy3")); assertFalse("Must be false for different strings", - StringUtils.pathEquals("/dummy1/dummy2/dummy3", - "/dummy1/dummy4/dummy3")); + StringUtils.pathEquals("/dummy1/dummy2/dummy3", "/dummy1/dummy4/dummy3")); assertFalse("Must be false for one false path on 1", - StringUtils.pathEquals("/dummy1/bin/tmp/../dummy2/dummy3", - "/dummy1/dummy2/dummy3")); + StringUtils.pathEquals("/dummy1/bin/tmp/../dummy2/dummy3", "/dummy1/dummy2/dummy3")); assertFalse("Must be false for one false win top path on 2", - StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", - "C:\\dummy1\\bin\\tmp\\..\\dummy2\\dummy3")); + StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3", "C:\\dummy1\\bin\\tmp\\..\\dummy2\\dummy3")); assertFalse("Must be false for top path on 1 + difference", - StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", - "/dummy1/dummy2/dummy4")); + StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3", "/dummy1/dummy2/dummy4")); } @Test