diff options
author | JP Abgrall <jpa@google.com> | 2011-11-28 18:19:40 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-11-28 18:19:40 -0800 |
commit | 064280307728e963cd9bf08796c8863127254ff0 (patch) | |
tree | 0be6cf4212e634e0a7c5770dd670a1aeca1e21db /luni | |
parent | 6b17c8491886a24993167a619ab44afa7505800c (diff) | |
parent | 4ff585466887785d48c02d14a15dcde64934442b (diff) | |
download | libcore-064280307728e963cd9bf08796c8863127254ff0.zip libcore-064280307728e963cd9bf08796c8863127254ff0.tar.gz libcore-064280307728e963cd9bf08796c8863127254ff0.tar.bz2 |
am 4ff58546: libcore: BlockGuard: untag socket on close
* commit '4ff585466887785d48c02d14a15dcde64934442b':
libcore: BlockGuard: untag socket on close
Diffstat (limited to 'luni')
-rw-r--r-- | luni/src/main/java/libcore/io/BlockGuardOs.java | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/luni/src/main/java/libcore/io/BlockGuardOs.java b/luni/src/main/java/libcore/io/BlockGuardOs.java index 07ee520..4f2858d 100644 --- a/luni/src/main/java/libcore/io/BlockGuardOs.java +++ b/luni/src/main/java/libcore/io/BlockGuardOs.java @@ -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); |