Merge "Crash the system server if network stack is lost"

This commit is contained in:
Remi NGUYEN VAN
2019-04-10 01:41:20 +00:00
committed by Gerrit Code Review

View File

@@ -32,6 +32,7 @@ import android.net.dhcp.IDhcpServerCallbacks;
import android.net.ip.IIpClientCallbacks; import android.net.ip.IIpClientCallbacks;
import android.net.util.SharedLog; import android.net.util.SharedLog;
import android.os.Binder; import android.os.Binder;
import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
@@ -148,14 +149,18 @@ public class NetworkStackClient {
private class NetworkStackConnection implements ServiceConnection { private class NetworkStackConnection implements ServiceConnection {
@Override @Override
public void onServiceConnected(ComponentName name, IBinder service) { public void onServiceConnected(ComponentName name, IBinder service) {
log("Network stack service connected"); logi("Network stack service connected");
registerNetworkStackService(service); registerNetworkStackService(service);
} }
@Override @Override
public void onServiceDisconnected(ComponentName name) { public void onServiceDisconnected(ComponentName name) {
// TODO: crash/reboot the system ? // The system has lost its network stack (probably due to a crash in the
logWtf("Lost network stack connector", null); // network stack process): better crash rather than stay in a bad state where all
// networking is broken.
// onServiceDisconnected is not being called on device shutdown, so this method being
// called always indicates a bad state for the system server.
maybeCrashWithTerribleFailure("Lost network stack");
} }
}; };
@@ -211,8 +216,7 @@ public class NetworkStackClient {
} }
if (intent == null) { if (intent == null) {
logWtf("Could not resolve the network stack", null); maybeCrashWithTerribleFailure("Could not resolve the network stack");
// TODO: crash/reboot system server ?
return; return;
} }
@@ -220,9 +224,9 @@ public class NetworkStackClient {
// NetworkStackConnection.onServiceConnected(). // NetworkStackConnection.onServiceConnected().
if (!context.bindServiceAsUser(intent, new NetworkStackConnection(), if (!context.bindServiceAsUser(intent, new NetworkStackConnection(),
Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM)) { Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM)) {
logWtf("Could not bind to network stack with " + intent, null); maybeCrashWithTerribleFailure(
"Could not bind to network stack in-process, or in app with " + intent);
return; return;
// TODO: crash/reboot system server if no network stack after a timeout ?
} }
log("Network stack service start requested"); log("Network stack service start requested");
@@ -270,6 +274,16 @@ public class NetworkStackClient {
} }
} }
private void maybeCrashWithTerribleFailure(@NonNull String message) {
logWtf(message, null);
if (Build.IS_DEBUGGABLE) {
throw new IllegalStateException(message);
}
}
/**
* Log a message in the local log.
*/
private void log(@NonNull String message) { private void log(@NonNull String message) {
synchronized (mLog) { synchronized (mLog) {
mLog.log(message); mLog.log(message);
@@ -289,6 +303,15 @@ public class NetworkStackClient {
} }
} }
/**
* Log a message in the local and system logs.
*/
private void logi(@NonNull String message) {
synchronized (mLog) {
mLog.i(message);
}
}
/** /**
* For non-system server clients, get the connector registered by the system server. * For non-system server clients, get the connector registered by the system server.
*/ */