Remove peercred check from NativeCrashListener. am: b9eb093c3c am: 9e5ef0e5d7
am: 3fa69351b8
Change-Id: Ib7623d18827b6e7d9a8f81d499d783498055d657
This commit is contained in:
@@ -20,7 +20,6 @@ import android.app.ApplicationErrorReport.CrashInfo;
|
|||||||
import android.system.ErrnoException;
|
import android.system.ErrnoException;
|
||||||
import android.system.Os;
|
import android.system.Os;
|
||||||
import android.system.StructTimeval;
|
import android.system.StructTimeval;
|
||||||
import android.system.StructUcred;
|
|
||||||
import android.system.UnixSocketAddress;
|
import android.system.UnixSocketAddress;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
@@ -105,9 +104,9 @@ final class NativeCrashListener extends Thread {
|
|||||||
|
|
||||||
if (DEBUG) Slog.i(TAG, "Starting up");
|
if (DEBUG) Slog.i(TAG, "Starting up");
|
||||||
|
|
||||||
// The file system entity for this socket is created with 0700 perms, owned
|
// The file system entity for this socket is created with 0777 perms, owned
|
||||||
// by system:system. debuggerd runs as root, so is capable of connecting to
|
// by system:system. selinux restricts things so that only crash_dump can
|
||||||
// it, but 3rd party apps cannot.
|
// access it.
|
||||||
{
|
{
|
||||||
File socketFile = new File(DEBUGGERD_SOCKET_PATH);
|
File socketFile = new File(DEBUGGERD_SOCKET_PATH);
|
||||||
if (socketFile.exists()) {
|
if (socketFile.exists()) {
|
||||||
@@ -121,6 +120,7 @@ final class NativeCrashListener extends Thread {
|
|||||||
DEBUGGERD_SOCKET_PATH);
|
DEBUGGERD_SOCKET_PATH);
|
||||||
Os.bind(serverFd, sockAddr);
|
Os.bind(serverFd, sockAddr);
|
||||||
Os.listen(serverFd, 1);
|
Os.listen(serverFd, 1);
|
||||||
|
Os.chmod(DEBUGGERD_SOCKET_PATH, 0777);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
FileDescriptor peerFd = null;
|
FileDescriptor peerFd = null;
|
||||||
@@ -129,19 +129,14 @@ final class NativeCrashListener extends Thread {
|
|||||||
peerFd = Os.accept(serverFd, null /* peerAddress */);
|
peerFd = Os.accept(serverFd, null /* peerAddress */);
|
||||||
if (MORE_DEBUG) Slog.v(TAG, "Got debuggerd socket " + peerFd);
|
if (MORE_DEBUG) Slog.v(TAG, "Got debuggerd socket " + peerFd);
|
||||||
if (peerFd != null) {
|
if (peerFd != null) {
|
||||||
// Only the superuser is allowed to talk to us over this socket
|
// the reporting thread may take responsibility for
|
||||||
StructUcred credentials =
|
// acking the debugger; make sure we play along.
|
||||||
Os.getsockoptUcred(peerFd, SOL_SOCKET, SO_PEERCRED);
|
consumeNativeCrashData(peerFd);
|
||||||
if (credentials.uid == 0) {
|
|
||||||
// the reporting thread may take responsibility for
|
|
||||||
// acking the debugger; make sure we play along.
|
|
||||||
consumeNativeCrashData(peerFd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Slog.w(TAG, "Error handling connection", e);
|
Slog.w(TAG, "Error handling connection", e);
|
||||||
} finally {
|
} finally {
|
||||||
// Always ack debuggerd's connection to us. The actual
|
// Always ack crash_dump's connection to us. The actual
|
||||||
// byte written is irrelevant.
|
// byte written is irrelevant.
|
||||||
if (peerFd != null) {
|
if (peerFd != null) {
|
||||||
try {
|
try {
|
||||||
@@ -194,7 +189,7 @@ final class NativeCrashListener extends Thread {
|
|||||||
return totalRead;
|
return totalRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the crash report from the debuggerd connection
|
// Read a crash report from the connection
|
||||||
void consumeNativeCrashData(FileDescriptor fd) {
|
void consumeNativeCrashData(FileDescriptor fd) {
|
||||||
if (MORE_DEBUG) Slog.i(TAG, "debuggerd connected");
|
if (MORE_DEBUG) Slog.i(TAG, "debuggerd connected");
|
||||||
final byte[] buf = new byte[4096];
|
final byte[] buf = new byte[4096];
|
||||||
@@ -205,6 +200,10 @@ final class NativeCrashListener extends Thread {
|
|||||||
Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, timeout);
|
Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, timeout);
|
||||||
Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, timeout);
|
Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, timeout);
|
||||||
|
|
||||||
|
// The socket is guarded by an selinux neverallow rule that only
|
||||||
|
// permits crash_dump to connect to it. This allows us to trust the
|
||||||
|
// received values.
|
||||||
|
|
||||||
// first, the pid and signal number
|
// first, the pid and signal number
|
||||||
int headerBytes = readExactly(fd, buf, 0, 8);
|
int headerBytes = readExactly(fd, buf, 0, 8);
|
||||||
if (headerBytes != 8) {
|
if (headerBytes != 8) {
|
||||||
|
|||||||
Reference in New Issue
Block a user