RecoverySystemService: Dump exception stack on IOExceptions.
We occasionally hit "java.io.IOException: Connection reset by peer" when
communicating with uncrypt. Change to print verbose exception stack for
future debugging.
Also conservatively change the two potential causes: a) by removing the
call to dos.flush() after sending the last status code; b) by closing
the streams quietly instead.
Bug: 27782920
Change-Id: Ice6da1f27cb1ee83207c9f34958c0e012270167e
diff --git a/services/core/java/com/android/server/RecoverySystemService.java b/services/core/java/com/android/server/RecoverySystemService.java
index d284d07..276687f 100644
--- a/services/core/java/com/android/server/RecoverySystemService.java
+++ b/services/core/java/com/android/server/RecoverySystemService.java
@@ -79,7 +79,7 @@
uncryptFile.write(filename + "\n");
} catch (IOException e) {
Slog.e(TAG, "IOException when writing \"" + RecoverySystem.UNCRYPT_PACKAGE_FILE +
- "\": " + e.getMessage());
+ "\": ", e);
return false;
}
@@ -94,8 +94,11 @@
}
// Read the status from the socket.
- try (DataInputStream dis = new DataInputStream(socket.getInputStream());
- DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) {
+ DataInputStream dis = null;
+ DataOutputStream dos = null;
+ try {
+ dis = new DataInputStream(socket.getInputStream());
+ dos = new DataOutputStream(socket.getOutputStream());
int lastStatus = Integer.MIN_VALUE;
while (true) {
int status = dis.readInt();
@@ -111,7 +114,7 @@
if (listener != null) {
try {
listener.onProgress(status);
- } catch (RemoteException unused) {
+ } catch (RemoteException ignored) {
Slog.w(TAG, "RemoteException when posting progress");
}
}
@@ -121,7 +124,6 @@
// waits for the ack so the socket won't be
// destroyed before we receive the code.
dos.writeInt(0);
- dos.flush();
break;
}
} else {
@@ -131,14 +133,15 @@
// for the ack so the socket won't be destroyed before
// we receive the code.
dos.writeInt(0);
- dos.flush();
return false;
}
}
} catch (IOException e) {
- Slog.e(TAG, "IOException when reading status: " + e);
+ Slog.e(TAG, "IOException when reading status: ", e);
return false;
} finally {
+ IoUtils.closeQuietly(dis);
+ IoUtils.closeQuietly(dos);
IoUtils.closeQuietly(socket);
}
@@ -169,11 +172,11 @@
LocalSocketAddress.Namespace.RESERVED));
done = true;
break;
- } catch (IOException unused) {
+ } catch (IOException ignored) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
- Slog.w(TAG, "Interrupted: " + e);
+ Slog.w(TAG, "Interrupted: ", e);
}
}
}
@@ -200,8 +203,12 @@
return false;
}
- try (DataInputStream dis = new DataInputStream(socket.getInputStream());
- DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) {
+ DataInputStream dis = null;
+ DataOutputStream dos = null;
+ try {
+ dis = new DataInputStream(socket.getInputStream());
+ dos = new DataOutputStream(socket.getOutputStream());
+
// Send the BCB commands if it's to setup BCB.
if (isSetup) {
dos.writeInt(command.length());
@@ -215,7 +222,6 @@
// Ack receipt of the status code. uncrypt waits for the ack so
// the socket won't be destroyed before we receive the code.
dos.writeInt(0);
- dos.flush();
if (status == 100) {
Slog.i(TAG, "uncrypt " + (isSetup ? "setup" : "clear") +
@@ -226,9 +232,11 @@
return false;
}
} catch (IOException e) {
- Slog.e(TAG, "IOException when getting output stream: " + e);
+ Slog.e(TAG, "IOException when communicating with uncrypt: ", e);
return false;
} finally {
+ IoUtils.closeQuietly(dis);
+ IoUtils.closeQuietly(dos);
IoUtils.closeQuietly(socket);
}