Avoid caching services with missing binders.

When fetching system services early during boot, if the underlying
binder interface hasn't been published yet, we end up caching a
manager class that is broken for the remainder of the process
lifetime, and innocent downstream callers end up using the broken
cached manager.

Fix this by using an explicit exception to quickly abort manager
creation when the underlying binder is missing.  The exception is
only used to skip the remainder of the manager creation, and it
doesn't actually crash the process.

Bug: 28634953
Change-Id: I0cb62261e6d6833660704b93a11185aa11a2ac97
This commit is contained in:
Jeff Sharkey
2016-05-10 12:54:45 -06:00
parent 0b9f2f715f
commit bed14ecfc5

View File

@@ -34,6 +34,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.util.Log;
/**
@@ -95,10 +96,10 @@ public class NetworkStatsManager {
/**
* {@hide}
*/
public NetworkStatsManager(Context context) {
public NetworkStatsManager(Context context) throws ServiceNotFoundException {
mContext = context;
mService = INetworkStatsService.Stub.asInterface(
ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
ServiceManager.getServiceOrThrow(Context.NETWORK_STATS_SERVICE));
}
/**