From f9f15fce9dcdfb071c203f1fef099e11ecda7d15 Mon Sep 17 00:00:00 2001 From: Tetsutoki Shiozawa Date: Mon, 19 Feb 2018 10:24:43 +0900 Subject: [PATCH] Fix: ConnectivityManager is initialized with a wrong context ActivityThread#setHttpProxy uses a system context to get a ConnectivityManager instance. If it's not already cached, the system service registry will cache this instance initialized with the system context, and subsequent calls to get this service will return the bad instance. This patch uses the application context instead, unless it's not available for some unlikely reason. A possible symptom of this issue is to have Bluetooth tethering failing with a security exception, because it's requested by the "android" package without system uid. Merged-In: Ib8815f010883cdb94fcad2cdfb237de39327b20a Bug: 73572062 Change-Id: Id652c1625194dc73dcbf8dfcad4b4e2e6fbebf4e --- core/java/android/app/ActivityThread.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2ecd3120345d5..aa360848ace22 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -963,7 +963,8 @@ public final class ActivityThread { } public void setHttpProxy(String host, String port, String exclList, Uri pacFileUrl) { - final ConnectivityManager cm = ConnectivityManager.from(getSystemContext()); + final ConnectivityManager cm = ConnectivityManager.from( + getApplication() != null ? getApplication() : getSystemContext()); final Network network = cm.getBoundNetworkForProcess(); if (network != null) { Proxy.setHttpProxySystemProperty(cm.getDefaultProxy());