Repository: mesos Updated Branches: refs/heads/master 15613c806 -> a6f1cf3a5
Fixed fd leaks in Socket::create and replace sentinel with Option. Review: https://reviews.apache.org/r/38809 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/a6f1cf3a Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/a6f1cf3a Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/a6f1cf3a Branch: refs/heads/master Commit: a6f1cf3a59e4a6e0bdff5cd19644cd2bc2653425 Parents: 15613c8 Author: Chi Zhang <[email protected]> Authored: Tue Sep 29 14:27:31 2015 -0700 Committer: Benjamin Mahler <[email protected]> Committed: Tue Sep 29 14:28:07 2015 -0700 ---------------------------------------------------------------------- 3rdparty/libprocess/include/process/socket.hpp | 2 +- 3rdparty/libprocess/src/socket.cpp | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/a6f1cf3a/3rdparty/libprocess/include/process/socket.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/include/process/socket.hpp b/3rdparty/libprocess/include/process/socket.hpp index 817cb37..4b2597f 100644 --- a/3rdparty/libprocess/include/process/socket.hpp +++ b/3rdparty/libprocess/include/process/socket.hpp @@ -61,7 +61,7 @@ public: * * @return An instance of a `Socket`. */ - static Try<Socket> create(Kind kind = DEFAULT_KIND(), int s = -1); + static Try<Socket> create(Kind kind = DEFAULT_KIND(), Option<int> s = None()); /** * Returns the default `Kind` of implementation of `Socket`. http://git-wip-us.apache.org/repos/asf/mesos/blob/a6f1cf3a/3rdparty/libprocess/src/socket.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/socket.cpp b/3rdparty/libprocess/src/socket.cpp index 5879423..6ac834e 100644 --- a/3rdparty/libprocess/src/socket.cpp +++ b/3rdparty/libprocess/src/socket.cpp @@ -34,9 +34,13 @@ using std::string; namespace process { namespace network { -Try<Socket> Socket::create(Kind kind, int s) +Try<Socket> Socket::create(Kind kind, Option<int> s) { - if (s < 0) { + // If the caller passed in a file descriptor, we do + // not own its life cycle and must not close it. + bool owned = s.isNone(); + + if (owned) { // Supported in Linux >= 2.6.27. #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) Try<int> fd = @@ -53,11 +57,13 @@ Try<Socket> Socket::create(Kind kind, int s) Try<Nothing> nonblock = os::nonblock(fd.get()); if (nonblock.isError()) { + os::close(fd.get()); return Error("Failed to create socket, nonblock: " + nonblock.error()); } Try<Nothing> cloexec = os::cloexec(fd.get()); if (cloexec.isError()) { + os::close(fd.get()); return Error("Failed to create socket, cloexec: " + cloexec.error()); } #endif @@ -67,8 +73,12 @@ Try<Socket> Socket::create(Kind kind, int s) switch (kind) { case POLL: { - Try<std::shared_ptr<Socket::Impl>> socket = PollSocketImpl::create(s); + Try<std::shared_ptr<Socket::Impl>> socket = + PollSocketImpl::create(s.get()); if (socket.isError()) { + if (owned) { + os::close(s.get()); + } return Error(socket.error()); } return Socket(socket.get()); @@ -76,8 +86,11 @@ Try<Socket> Socket::create(Kind kind, int s) #ifdef USE_SSL_SOCKET case SSL: { Try<std::shared_ptr<Socket::Impl>> socket = - LibeventSSLSocketImpl::create(s); + LibeventSSLSocketImpl::create(s.get()); if (socket.isError()) { + if (owned) { + os::close(s.get()); + } return Error(socket.error()); } return Socket(socket.get());
