diff --git a/android/guava-tests/test/com/google/common/net/HostAndPortTest.java b/android/guava-tests/test/com/google/common/net/HostAndPortTest.java index 9f21332f65f9..98da761c7299 100644 --- a/android/guava-tests/test/com/google/common/net/HostAndPortTest.java +++ b/android/guava-tests/test/com/google/common/net/HostAndPortTest.java @@ -93,11 +93,15 @@ public void testFromStringUnparseableNonsense() { checkFromStringCase("[]:", 1, null, 99, false); checkFromStringCase("[]:80", 1, null, 99, false); checkFromStringCase("[]bad", 1, null, 99, false); + checkFromStringCase("[[:]]", 1, null, 99, false); + checkFromStringCase("[[:]]:108", 1, null, 99, false); + checkFromStringCase("[2001:db8::a]:25]:443", 1, null, 99, false); + checkFromStringCase("[::1]:22]", 1, null, 99, false); } public void testFromStringParseableNonsense() { // Examples of nonsense that gets through. - checkFromStringCase("[[:]]", 86, "[:]", 86, false); + checkFromStringCase("[[:]", 86, "[:", 86, false); checkFromStringCase("x:y:z", 87, "x:y:z", 87, false); checkFromStringCase("", 88, "", 88, false); checkFromStringCase(":", 99, "", 99, false); @@ -175,6 +179,8 @@ public void testFromHost() { assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("gmail.com:80")); assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("[gmail.com]")); + + assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("[::1]:22]")); } public void testGetPortOrDefault() { @@ -229,7 +235,7 @@ public void testToString() { // Garbage in, garbage out. assertThat(HostAndPort.fromParts("::]", 107).toString()).isEqualTo("[::]]:107"); - assertThat(HostAndPort.fromString("[[:]]:108").toString()).isEqualTo("[[:]]:108"); + assertThat(HostAndPort.fromString("[[:]:108").toString()).isEqualTo("[[:]:108"); } public void testSerialization() { diff --git a/android/guava/src/com/google/common/net/HostAndPort.java b/android/guava/src/com/google/common/net/HostAndPort.java index d3f2639e1ba7..59446f513e71 100644 --- a/android/guava/src/com/google/common/net/HostAndPort.java +++ b/android/guava/src/com/google/common/net/HostAndPort.java @@ -214,7 +214,7 @@ private static String[] getHostAndPortFromBracketedHost(String hostPortString) { "Bracketed host-port string must start with a bracket: %s", hostPortString); int colonIndex = hostPortString.indexOf(':'); - int closeBracketIndex = hostPortString.lastIndexOf(']'); + int closeBracketIndex = hostPortString.indexOf(']'); checkArgument( colonIndex > -1 && closeBracketIndex > colonIndex, "Invalid bracketed host/port: %s", diff --git a/guava-tests/test/com/google/common/net/HostAndPortTest.java b/guava-tests/test/com/google/common/net/HostAndPortTest.java index f66464b27533..d5723140ec89 100644 --- a/guava-tests/test/com/google/common/net/HostAndPortTest.java +++ b/guava-tests/test/com/google/common/net/HostAndPortTest.java @@ -93,11 +93,15 @@ public void testFromStringUnparseableNonsense() { checkFromStringCase("[]:", 1, null, 99, false); checkFromStringCase("[]:80", 1, null, 99, false); checkFromStringCase("[]bad", 1, null, 99, false); + checkFromStringCase("[[:]]", 1, null, 99, false); + checkFromStringCase("[[:]]:108", 1, null, 99, false); + checkFromStringCase("[2001:db8::a]:25]:443", 1, null, 99, false); + checkFromStringCase("[::1]:22]", 1, null, 99, false); } public void testFromStringParseableNonsense() { // Examples of nonsense that gets through. - checkFromStringCase("[[:]]", 86, "[:]", 86, false); + checkFromStringCase("[[:]", 86, "[:", 86, false); checkFromStringCase("x:y:z", 87, "x:y:z", 87, false); checkFromStringCase("", 88, "", 88, false); checkFromStringCase(":", 99, "", 99, false); @@ -182,6 +186,8 @@ public void testFromHost() { assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("gmail.com:80")); assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("[gmail.com]")); + + assertThrows(IllegalArgumentException.class, () -> HostAndPort.fromHost("[::1]:22]")); } public void testGetPortOrDefault() { @@ -236,7 +242,7 @@ public void testToString() { // Garbage in, garbage out. assertThat(HostAndPort.fromParts("::]", 107).toString()).isEqualTo("[::]]:107"); - assertThat(HostAndPort.fromString("[[:]]:108").toString()).isEqualTo("[[:]]:108"); + assertThat(HostAndPort.fromString("[[:]:108").toString()).isEqualTo("[[:]:108"); } public void testSerialization() { diff --git a/guava/src/com/google/common/net/HostAndPort.java b/guava/src/com/google/common/net/HostAndPort.java index d3f2639e1ba7..59446f513e71 100644 --- a/guava/src/com/google/common/net/HostAndPort.java +++ b/guava/src/com/google/common/net/HostAndPort.java @@ -214,7 +214,7 @@ private static String[] getHostAndPortFromBracketedHost(String hostPortString) { "Bracketed host-port string must start with a bracket: %s", hostPortString); int colonIndex = hostPortString.indexOf(':'); - int closeBracketIndex = hostPortString.lastIndexOf(']'); + int closeBracketIndex = hostPortString.indexOf(']'); checkArgument( colonIndex > -1 && closeBracketIndex > colonIndex, "Invalid bracketed host/port: %s",