summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--luni/src/test/java/libcore/java/net/URLTest.java7
-rwxr-xr-xojluni/src/main/java/java/net/URLStreamHandler.java22
2 files changed, 17 insertions, 12 deletions
diff --git a/luni/src/test/java/libcore/java/net/URLTest.java b/luni/src/test/java/libcore/java/net/URLTest.java
index 629015f3cd..7a323af58e 100644
--- a/luni/src/test/java/libcore/java/net/URLTest.java
+++ b/luni/src/test/java/libcore/java/net/URLTest.java
@@ -779,4 +779,11 @@ public final class URLTest extends TestCase {
assertEquals(host, url.getHost());
assertEquals(fragment, url.getRef());
}
+
+ // http://b/33351987
+ public void testMultipleUserField() throws Exception {
+ final String host = "http://multiple@users@url.com";
+ URL url = new URL(host);
+ assertNull(url.getUserInfo());
+ }
}
diff --git a/ojluni/src/main/java/java/net/URLStreamHandler.java b/ojluni/src/main/java/java/net/URLStreamHandler.java
index ddea036627..0892d6741d 100755
--- a/ojluni/src/main/java/java/net/URLStreamHandler.java
+++ b/ojluni/src/main/java/java/net/URLStreamHandler.java
@@ -169,26 +169,24 @@ public abstract class URLStreamHandler {
(spec.charAt(start + 1) == '/')) {
start += 2;
i = spec.indexOf('/', start);
- if (i < 0) {
+ if (i < 0 || i > limit) {
i = spec.indexOf('?', start);
- if (i < 0)
+ if (i < 0 || i > limit)
i = limit;
}
- // ----- BEGIN android -----
- // i may become greater than limit
- // b/31858037
- if (i > limit) {
- i = limit;
- }
- // ----- END android -----
-
host = authority = spec.substring(start, i);
int ind = authority.indexOf('@');
if (ind != -1) {
- userInfo = authority.substring(0, ind);
- host = authority.substring(ind+1);
+ if (ind != authority.lastIndexOf('@')) {
+ // more than one '@' in authority. This is not server based
+ userInfo = null;
+ host = null;
+ } else {
+ userInfo = authority.substring(0, ind);
+ host = authority.substring(ind+1);
+ }
} else {
userInfo = null;
}