am 53c7608a: am a3c3533b: Merge "Finish fixing Zygote descriptor leakage problem"

* commit '53c7608aefb0ed754394e571cac02e96ad6fcdb3':
  Finish fixing Zygote descriptor leakage problem
This commit is contained in:
Dave Platt
2014-02-12 23:10:36 +00:00
committed by Android Git Automerger
2 changed files with 45 additions and 1 deletions

View File

@@ -224,9 +224,37 @@ class ZygoteConnection {
ZygoteInit.setCloseOnExec(serverPipeFd, true);
}
/**
* In order to avoid leaking descriptors to the Zygote child,
* the native code must close the two Zygote socket descriptors
* in the child process before it switches from Zygote-root to
* the UID and privileges of the application being launched.
*
* In order to avoid "bad file descriptor" errors when the
* two LocalSocket objects are closed, the Posix file
* descriptors are released via a dup2() call which closes
* the socket and substitutes an open descriptor to /dev/null.
*/
int [] fdsToClose = { -1, -1 };
FileDescriptor fd = mSocket.getFileDescriptor();
if (fd != null) {
fdsToClose[0] = fd.getInt$();
}
fd = ZygoteInit.getServerSocketFileDescriptor();
if (fd != null) {
fdsToClose[1] = fd.getInt$();
}
fd = null;
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName);
parsedArgs.niceName, fdsToClose);
} catch (IOException ex) {
logAndPrintError(newStderr, "Exception creating pipe", ex);
} catch (ErrnoException ex) {
@@ -814,6 +842,12 @@ class ZygoteConnection {
FileDescriptor[] descriptors, FileDescriptor pipeFd, PrintStream newStderr)
throws ZygoteInit.MethodAndArgsCaller {
/**
* By the time we get here, the native code has closed the two actual Zygote
* socket connections, and substituted /dev/null in their place. The LocalSocket
* objects still need to be closed properly.
*/
closeSocket();
ZygoteInit.closeServerSocket();

View File

@@ -207,6 +207,16 @@ public class ZygoteInit {
sServerSocket = null;
}
/**
* Return the server socket's underlying file descriptor, so that
* ZygoteConnection can pass it to the native code for proper
* closure after a child process is forked off.
*/
static FileDescriptor getServerSocketFileDescriptor() {
return sServerSocket.getFileDescriptor();
}
private static final int UNPRIVILEGED_UID = 9999;
private static final int UNPRIVILEGED_GID = 9999;