Commit 4ff58546 authored by JP Abgrall's avatar JP Abgrall
Browse files

libcore: BlockGuard: untag socket on close

java.net.Socket creates the socket on connect(). But in case of failure
during the connect() it closes the socket.
During the create, BlockGuard's socket() is the one tagging the socket.
But in case of failure, nobody untags that socket.
So now we untag scokets on close() in BlockGuard

Bug: 5274621
Change-Id: I282665a05e2dc184df77c84ceab49fb55b7695af
parent 0c180b1a
......@@ -42,6 +42,14 @@ public class BlockGuardOs extends ForwardingOs {
}
}
private void untagSocket(FileDescriptor fd) throws ErrnoException {
try {
SocketTagger.get().untag(fd);
} catch (SocketException e) {
throw new ErrnoException("socket", EINVAL, e);
}
}
@Override public FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException {
BlockGuard.getThreadPolicy().onNetwork();
return tagSocket(os.accept(fd, peerAddress));
......@@ -49,11 +57,14 @@ public class BlockGuardOs extends ForwardingOs {
@Override public void close(FileDescriptor fd) throws ErrnoException {
try {
if (S_ISSOCK(Libcore.os.fstat(fd).st_mode) && isLingerSocket(fd)) {
// If the fd is a socket with SO_LINGER set, we might block indefinitely.
// We allow non-linger sockets so that apps can close their network connections in
// methods like onDestroy which will run on the UI thread.
BlockGuard.getThreadPolicy().onNetwork();
if (S_ISSOCK(Libcore.os.fstat(fd).st_mode)) {
if (isLingerSocket(fd)) {
// If the fd is a socket with SO_LINGER set, we might block indefinitely.
// We allow non-linger sockets so that apps can close their network
// connections in methods like onDestroy which will run on the UI thread.
BlockGuard.getThreadPolicy().onNetwork();
}
untagSocket(fd);
}
} catch (ErrnoException ignored) {
// We're called via Socket.close (which doesn't ask for us to be called), so we
......@@ -74,6 +85,8 @@ public class BlockGuardOs extends ForwardingOs {
os.connect(fd, address, port);
}
// TODO: Untag newFd when needed for dup2(FileDescriptor oldFd, int newFd)
@Override public void fdatasync(FileDescriptor fd) throws ErrnoException {
BlockGuard.getThreadPolicy().onWriteToDisk();
os.fdatasync(fd);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment