Stop using invalid URL to prevent unexpected crash

Verify the input PAC Uri before performing follow-up actions.

Check if the URL is a valid URL to filter some invalid URLs since
these invalid URLs could not fall into any subclass of existing
URLConnections. When the PAC Uri is other invalid URL scheme, it
will cause an UnsupportedOperationException if there is no proper
subclass that implements the openConnection() method.
A malformed URL may crash the system.

Even it's a valid URL, some subclasses(e.g. JarURLConnection)
may not have openConnection() implemented. It will also hit the
problem, so convert the possbile exception from openConnection()
to re-throw it to IOException which is handled in the existing

Bug: 219498290
Test: atest FrameworksNetTests CtsNetTestCases
Test: Test with malformed URL
Change-Id: I22903414380b62051f514e43b93af992f45740b4
(cherry picked from commit 6390b37a3b32fc7583154d53fda3af8fbd95f59f)
Merged-In: I22903414380b62051f514e43b93af992f45740b4
(cherry picked from commit fe57c5bf892c54c495cacd23492532bfa9a63dd7)
Merged-In: I22903414380b62051f514e43b93af992f45740b4
diff --git a/services/core/java/com/android/server/connectivity/ b/services/core/java/com/android/server/connectivity/
index 0070339..38b386f 100644
--- a/services/core/java/com/android/server/connectivity/
+++ b/services/core/java/com/android/server/connectivity/
@@ -44,6 +44,7 @@
 import android.os.SystemProperties;
 import android.provider.Settings;
 import android.util.Log;
+import android.webkit.URLUtil;
@@ -232,8 +233,22 @@
      * @throws IOException if the URL is malformed, or the PAC file is too big.
     private static String get(Uri pacUri) throws IOException {
-        URL url = new URL(pacUri.toString());
-        URLConnection urlConnection = url.openConnection(;
+        if (!URLUtil.isValidUrl(pacUri.toString()))  {
+            throw new IOException("Malformed URL:" + pacUri);
+        }
+        final URL url = new URL(pacUri.toString());
+        URLConnection urlConnection;
+        try {
+            urlConnection = url.openConnection(;
+            // Catch the possible exceptions and rethrow as IOException to not to crash the system
+            // for illegal input.
+        } catch (IllegalArgumentException e) {
+            throw new IOException("Incorrect proxy type for " + pacUri);
+        } catch (UnsupportedOperationException e) {
+            throw new IOException("Unsupported URL connection type for " + pacUri);
+        }
         long contentLength = -1;
         try {
             contentLength = Long.parseLong(urlConnection.getHeaderField("Content-Length"));