Abort connecting to native daemon during shutdown

Symptom:
System_server crashed due to unsolved "netd" service.

Root cause:
Init intentionally killed services when shutdown was triggered.
NativeDaemonConnector unnecessarily tried to reconnect the killed
daemon and NetworkManagemantService got a callback of connection.
Finally, NetworkManagemantService failed to get netd service and it
crashed with NPE.

Solution:
Do not retry connecting to the target native daemon when the device
is in the middle of shutdown.

Bug: 64237349
Change-Id: I2514cdc47b3eea785b5ffe5bd8bb27609bcc1726
This commit is contained in:
Tetsutoki Shiozawa
2017-07-13 15:37:40 +09:00
committed by Koji Fukui
parent 89194d6e45
commit a00d4b0bf4

View File

@@ -24,11 +24,13 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.SystemProperties;
import android.util.LocalLog; import android.util.LocalLog;
import android.util.Slog; import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.android.server.power.ShutdownThread;
import com.google.android.collect.Lists; import com.google.android.collect.Lists;
import java.io.FileDescriptor; import java.io.FileDescriptor;
@@ -136,6 +138,12 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo
listenToSocket(); listenToSocket();
} catch (Exception e) { } catch (Exception e) {
loge("Error in NativeDaemonConnector: " + e); loge("Error in NativeDaemonConnector: " + e);
String shutdownAct = SystemProperties.get(
ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
if (shutdownAct != null && shutdownAct.length() > 0) {
// The device is in middle of shutdown.
break;
}
SystemClock.sleep(5000); SystemClock.sleep(5000);
} }
} }