From edf661e64a593de14b6fa8b3686fc12b51a51ea0 Mon Sep 17 00:00:00 2001 From: Christopher Dykes Date: Sat, 1 Jul 2017 23:50:37 -0700 Subject: [PATCH] Don't attempt to lock the file descriptor in readv/writev if it's a socket Summary: There is no way to lock a socket on Windows, so these calls will always fail. Just don't do the lock on Windows. To do it properly with sockets, this should probably be forwarding to `sendmsg`/`recvmsg`, but this is good enough for now. Reviewed By: simpkins Differential Revision: D5307901 fbshipit-source-id: 9855274e932a3e2ec3cacae10363200187e0c01b --- folly/portability/SysUio.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/folly/portability/SysUio.cpp b/folly/portability/SysUio.cpp index 9a80d27c..74196c00 100644 --- a/folly/portability/SysUio.cpp +++ b/folly/portability/SysUio.cpp @@ -70,11 +70,18 @@ static ssize_t doVecOperation(int fd, const iovec* iov, int count) { return -1; } - if (lockf(fd, F_LOCK, 0) == -1) { + // We only need to worry about locking if the file descriptor is + // not a socket. We have no way of locking sockets :( + // The correct way to do this for sockets is via sendmsg/recvmsg, + // but this is good enough for now. + bool shouldLock = !folly::portability::sockets::is_fh_socket(fd); + if (shouldLock && lockf(fd, F_LOCK, 0) == -1) { return -1; } SCOPE_EXIT { - lockf(fd, F_ULOCK, 0); + if (shouldLock) { + lockf(fd, F_ULOCK, 0); + } }; ssize_t bytesProcessed = 0; -- 2.34.1