Fix URL parser may return wrong host name

Due to a missing bound check in parseURL, it may include part of the
fragment in the authority field, and returns wrong host name.

Bug: 31858037
Test: libcore.java.net.URLTest#testFragmentWith{Slash,Query}
Change-Id: I1fc39907cc67f6d674a3790070833123fdef9414
(cherry picked from commit 78a4344540081fd229b188504d2fee820b7d452a)
(cherry picked from commit f98287d57549ccaae7b6e8dec9feadd4e0d413c3)
diff --git a/luni/src/test/java/libcore/java/net/URLTest.java b/luni/src/test/java/libcore/java/net/URLTest.java
index 789e3e9..629015f 100644
--- a/luni/src/test/java/libcore/java/net/URLTest.java
+++ b/luni/src/test/java/libcore/java/net/URLTest.java
@@ -757,4 +757,26 @@
         assertEquals("/some/path", new URL("http://foobar.com/some/path#").getFile());
         assertEquals("/some/path", new URL("http://foobar.com/some/path?#").getFile());
     }
+
+    // http://b/31858037
+    public void testFragmentWithSlash() throws Exception {
+        final String host = "example.com";
+        final String fragment = "@not-a-host-name/a";
+        URL url = new URL(String.format("http://%s#%s", host, fragment));
+        assertNull(url.getUserInfo());
+        assertEquals(host, url.getAuthority());
+        assertEquals(host, url.getHost());
+        assertEquals(fragment, url.getRef());
+    }
+
+    // http://b/31858037
+    public void testFragmentWithQuery() throws Exception {
+        final String host = "example.com";
+        final String fragment = "@not-a-host-name?a";
+        URL url = new URL(String.format("http://%s#%s", host, fragment));
+        assertNull(url.getUserInfo());
+        assertEquals(host, url.getAuthority());
+        assertEquals(host, url.getHost());
+        assertEquals(fragment, url.getRef());
+    }
 }
diff --git a/ojluni/src/main/java/java/net/URLStreamHandler.java b/ojluni/src/main/java/java/net/URLStreamHandler.java
index e177363..ddea036 100755
--- a/ojluni/src/main/java/java/net/URLStreamHandler.java
+++ b/ojluni/src/main/java/java/net/URLStreamHandler.java
@@ -175,6 +175,14 @@
                     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('@');