]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
*: set missing CLOEXEC on opened fds 25822/head
authorPatrick Donnelly <pdonnell@redhat.com>
Fri, 7 Sep 2018 21:19:38 +0000 (14:19 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 7 Jan 2019 21:10:10 +0000 (13:10 -0800)
Otherwise these descriptors may leak across execve() during e.g. MDS respawn.

Fixes: http://tracker.ceph.com/issues/35850
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 86dbd9e755ae0472db3d8c04bc444c502193dc13)

Conflicts:
CMakeLists.txt
src/common/CMakeLists.txt
src/common/Preforker.h
src/common/SubProcess.cc
src/common/admin_socket.cc
src/crimson/CMakeLists.txt
src/global/signal_handler.cc
src/log/Log.cc
src/mon/MonitorDBStore.h
src/os/bluestore/bluestore_tool.cc

54 files changed:
CMakeLists.txt
src/CMakeLists.txt
src/auth/Crypto.cc
src/ceph_osd.cc
src/client/fuse_ll.cc
src/common/HeartbeatMap.cc
src/common/OutputDataSocket.cc
src/common/Preforker.h
src/common/admin_socket.cc
src/common/admin_socket_client.cc
src/common/blkdev.cc
src/common/buffer.cc
src/common/compat.cc
src/common/config.cc
src/common/pipe.c [deleted file]
src/common/pipe.h [deleted file]
src/global/global_init.cc
src/global/pidfile.cc
src/global/signal_handler.cc
src/include/compat.h
src/include/denc.h
src/include/encoding.h
src/include/random.h
src/include/sock_compat.h
src/include/uuid.h
src/kv/MemDB.cc
src/log/Log.cc
src/mds/MDCache.cc
src/mon/LogMonitor.cc
src/mon/Monitor.cc
src/mon/MonitorDBStore.h
src/msg/Message.cc
src/msg/async/Event.cc
src/msg/async/EventEpoll.cc
src/msg/async/PosixStack.cc
src/msg/async/net_handler.cc
src/msg/async/net_handler.h
src/msg/async/rdma/RDMAConnectedSocketImpl.cc
src/msg/async/rdma/RDMAServerSocketImpl.cc
src/msg/simple/Accepter.cc
src/msg/simple/Pipe.cc
src/os/bluestore/BlueStore.cc
src/os/bluestore/KernelDevice.cc
src/os/bluestore/NVMEDevice.cc
src/os/bluestore/PMEMDevice.cc
src/os/bluestore/bluestore_tool.cc
src/os/filestore/BtrfsFileStoreBackend.cc
src/os/filestore/FileJournal.cc
src/os/filestore/FileStore.cc
src/os/filestore/GenericFileStoreBackend.cc
src/os/filestore/LFNIndex.cc
src/os/kstore/KStore.cc
src/rgw/rgw_http_client.cc
src/test/objectstore/test_bluefs.cc

index 59f966d9d76df67af27a47b6726985e8d10072e0..8f4a77b40b599774661170a498edeaad304f578c 100644 (file)
@@ -95,6 +95,8 @@ endif()
 CHECK_FUNCTION_EXISTS(strerror_r HAVE_Strerror_R)
 CHECK_FUNCTION_EXISTS(name_to_handle_at HAVE_NAME_TO_HANDLE_AT)
 CHECK_FUNCTION_EXISTS(pipe2 HAVE_PIPE2)
+CHECK_FUNCTION_EXISTS(accept4 HAVE_ACCEPT4)
+
 set(CMAKE_REQUIRED_LIBRARIES pthread)
 CHECK_FUNCTION_EXISTS(pthread_spin_init HAVE_PTHREAD_SPINLOCK)
 CHECK_FUNCTION_EXISTS(pthread_set_name_np HAVE_PTHREAD_SET_NAME_NP)
index c5100a3cd75ec875e48fed823091e47550ca8431..51890818747d15926c404727e1499f7b1d5033ac 100644 (file)
@@ -500,9 +500,9 @@ set(libcommon_files
   osd/OpRequest.cc
   common/blkdev.cc
   common/common_init.cc
-  common/pipe.c
   common/ceph_argparse.cc
   common/ceph_context.cc
+  common/compat.cc
   common/code_environment.cc
   common/dout.cc
   common/signal.cc
index 7bb5d054057a6fbd65d7dca4b59e726b24625d06..359a994362c44ef6a6d5542977f65d2f2019e1ce 100644 (file)
@@ -15,6 +15,8 @@
 #include <sstream>
 #include <limits>
 
+#include <fcntl.h>
+
 #include "Crypto.h"
 #ifdef USE_OPENSSL
 # include <openssl/aes.h>
@@ -53,7 +55,7 @@ void CryptoRandom::get_bytes(char *buf, int len)
 
 // open /dev/urandom once on construction and reuse the fd for all reads
 CryptoRandom::CryptoRandom()
-  : fd(TEMP_FAILURE_RETRY(::open("/dev/urandom", O_RDONLY)))
+  : fd(TEMP_FAILURE_RETRY(::open("/dev/urandom", O_CLOEXEC|O_RDONLY)))
 {
   if (fd < 0) {
     throw std::system_error(errno, std::system_category());
index d3fe2e15fee9936691eb5dbdb29f9e7ecbf984ff..0d753f45d64b0e943cb78da6c063ef720488e174 100644 (file)
@@ -267,7 +267,7 @@ int main(int argc, const char **argv)
   {
     char fn[PATH_MAX];
     snprintf(fn, sizeof(fn), "%s/type", data_path.c_str());
-    int fd = ::open(fn, O_RDONLY);
+    int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
     if (fd >= 0) {
       bufferlist bl;
       bl.read_fd(fd, 64);
index 86f91d31b2306a5246023fa7f5ef89f26d4f4c71..42321101279dec93d0a3f5d8cc8ff600c2469a7c 100644 (file)
@@ -418,7 +418,7 @@ static void fuse_ll_mkdir(fuse_req_t req, fuse_ino_t parent, const char *name,
   if (cfuse->fino_snap(parent) == CEPH_SNAPDIR &&
       fuse_multithreaded && fuse_syncfs_on_mksnap) {
     int err = 0;
-    int fd = ::open(cfuse->mountpoint, O_RDONLY | O_DIRECTORY);
+    int fd = ::open(cfuse->mountpoint, O_RDONLY | O_DIRECTORY | O_CLOEXEC);
     if (fd < 0) {
       err = errno;
     } else {
index 62a703f911459d3615d3f3cfca764b8607c2a93d..8a7d3feac674ad1aba39189f138d0561d8dfcccf 100644 (file)
@@ -170,7 +170,7 @@ void HeartbeatMap::check_touch_file()
   if (is_healthy()) {
     string path = m_cct->_conf->heartbeat_file;
     if (path.length()) {
-      int fd = ::open(path.c_str(), O_WRONLY|O_CREAT, 0644);
+      int fd = ::open(path.c_str(), O_WRONLY|O_CREAT|O_CLOEXEC, 0644);
       if (fd >= 0) {
        ::utimes(path.c_str(), NULL);
        ::close(fd);
index bbee667f329f91083cc361c26e4ab86f01e26866..f2244cde84b82513c7d313ebfb278a1a1955022a 100644 (file)
@@ -14,9 +14,9 @@
 
 #include "common/OutputDataSocket.h"
 #include "common/errno.h"
-#include "common/pipe.h"
 #include "common/safe_io.h"
 #include "include/compat.h"
+#include "include/sock_compat.h"
 
 #include <poll.h>
 #include <sys/un.h>
@@ -117,10 +117,10 @@ OutputDataSocket::~OutputDataSocket()
 std::string OutputDataSocket::create_shutdown_pipe(int *pipe_rd, int *pipe_wr)
 {
   int pipefd[2];
-  int ret = pipe_cloexec(pipefd);
-  if (ret < 0) {
+  if (pipe_cloexec(pipefd) < 0) {
+    int e = errno;
     ostringstream oss;
-    oss << "OutputDataSocket::create_shutdown_pipe error: " << cpp_strerror(ret);
+    oss << "OutputDataSocket::create_shutdown_pipe error: " << cpp_strerror(e);
     return oss.str();
   }
   
@@ -142,7 +142,7 @@ std::string OutputDataSocket::bind_and_listen(const std::string &sock_path, int
        << (sizeof(address.sun_path) - 1);
     return oss.str();
   }
-  int sock_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+  int sock_fd = socket_cloexec(PF_UNIX, SOCK_STREAM, 0);
   if (sock_fd < 0) {
     int err = errno;
     ostringstream oss;
@@ -150,14 +150,6 @@ std::string OutputDataSocket::bind_and_listen(const std::string &sock_path, int
        << "failed to create socket: " << cpp_strerror(err);
     return oss.str();
   }
-  int r = fcntl(sock_fd, F_SETFD, FD_CLOEXEC);
-  if (r < 0) {
-    r = errno;
-    VOID_TEMP_FAILURE_RETRY(::close(sock_fd));
-    ostringstream oss;
-    oss << "OutputDataSocket::bind_and_listen: failed to fcntl on socket: " << cpp_strerror(r);
-    return oss.str();
-  }
   memset(&address, 0, sizeof(struct sockaddr_un));
   address.sun_family = AF_UNIX;
   snprintf(address.sun_path, sizeof(address.sun_path),
@@ -241,15 +233,15 @@ bool OutputDataSocket::do_accept()
   struct sockaddr_un address;
   socklen_t address_length = sizeof(address);
   ldout(m_cct, 30) << "OutputDataSocket: calling accept" << dendl;
-  int connection_fd = accept(m_sock_fd, (struct sockaddr*) &address,
+  int connection_fd = accept_cloexec(m_sock_fd, (struct sockaddr*) &address,
                             &address_length);
-  ldout(m_cct, 30) << "OutputDataSocket: finished accept" << dendl;
   if (connection_fd < 0) {
     int err = errno;
     lderr(m_cct) << "OutputDataSocket: do_accept error: '"
                           << cpp_strerror(err) << dendl;
     return false;
   }
+  ldout(m_cct, 30) << "OutputDataSocket: finished accept" << dendl;
 
   handle_connection(connection_fd);
   close_connection(connection_fd);
index 8925d944daa3458f8a6e04f39d9939ac9a9c3e72..19de9581399e717d1a0afe7701b52ec8b12026ca 100644 (file)
@@ -9,8 +9,10 @@
 #include <sstream>
 
 #include "include/assert.h"
-#include "common/safe_io.h"
 #include "common/errno.h"
+#include "common/safe_io.h"
+#include "include/compat.h"
+#include "include/sock_compat.h"
 
 /**
  * pre-fork fork/daemonize helper class
@@ -34,22 +36,23 @@ public:
 
   int prefork(std::string &err) {
     assert(!forked);
-    int r = ::socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
     std::ostringstream oss;
+    int r = socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, fd);
     if (r < 0) {
-      oss << "[" << getpid() << "]: unable to create socketpair: " << cpp_strerror(errno);
+      int e = errno;
+      oss << "[" << getpid() << "]: unable to create socketpair: " << cpp_strerror(e);
       err = oss.str();
-      return r;
+      return (errno = e, -1);
     }
 
     forked = true;
 
     childpid = fork();
     if (childpid < 0) {
-      r = -errno;
-      oss << "[" << getpid() << "]: unable to fork: " << cpp_strerror(errno);
+      int e = errno;
+      oss << "[" << getpid() << "]: unable to fork: " << cpp_strerror(e);
       err = oss.str();
-      return r;
+      return (errno = e, -1);
     }
     if (is_child()) {
       ::close(fd[0]);
index d23ca645169f59a22abfdbddd29fed50427aaaa0..a521771d6432fc0fd5387c24c6989432490e2381 100644 (file)
 #include "common/admin_socket_client.h"
 #include "common/dout.h"
 #include "common/errno.h"
-#include "common/pipe.h"
 #include "common/Thread.h"
 #include "common/version.h"
 
 
 // re-include our assert to clobber the system one; fix dout:
 #include "include/assert.h"
+#include "include/compat.h"
+#include "include/sock_compat.h"
 
 #define dout_subsys ceph_subsys_asok
 #undef dout_prefix
@@ -105,10 +106,10 @@ AdminSocket::~AdminSocket()
 std::string AdminSocket::create_shutdown_pipe(int *pipe_rd, int *pipe_wr)
 {
   int pipefd[2];
-  int ret = pipe_cloexec(pipefd);
-  if (ret < 0) {
+  if (pipe_cloexec(pipefd) < 0) {
+    int e = errno;
     ostringstream oss;
-    oss << "AdminSocket::create_shutdown_pipe error: " << cpp_strerror(ret);
+    oss << "AdminSocket::create_shutdown_pipe error: " << cpp_strerror(e);
     return oss.str();
   }
   
@@ -157,7 +158,7 @@ std::string AdminSocket::bind_and_listen(const std::string &sock_path, int *fd)
        << (sizeof(address.sun_path) - 1);
     return oss.str();
   }
-  int sock_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+  int sock_fd = socket_cloexec(PF_UNIX, SOCK_STREAM, 0);
   if (sock_fd < 0) {
     int err = errno;
     ostringstream oss;
@@ -165,14 +166,6 @@ std::string AdminSocket::bind_and_listen(const std::string &sock_path, int *fd)
        << "failed to create socket: " << cpp_strerror(err);
     return oss.str();
   }
-  int r = fcntl(sock_fd, F_SETFD, FD_CLOEXEC);
-  if (r < 0) {
-    r = errno;
-    retry_sys_call(::close, sock_fd);
-    ostringstream oss;
-    oss << "AdminSocket::bind_and_listen: failed to fcntl on socket: " << cpp_strerror(r);
-    return oss.str();
-  }
   memset(&address, 0, sizeof(struct sockaddr_un));
   address.sun_family = AF_UNIX;
   snprintf(address.sun_path, sizeof(address.sun_path),
@@ -283,15 +276,15 @@ bool AdminSocket::do_accept()
   struct sockaddr_un address;
   socklen_t address_length = sizeof(address);
   ldout(m_cct, 30) << "AdminSocket: calling accept" << dendl;
-  int connection_fd = accept(m_sock_fd, (struct sockaddr*) &address,
+  int connection_fd = accept_cloexec(m_sock_fd, (struct sockaddr*) &address,
                             &address_length);
-  ldout(m_cct, 30) << "AdminSocket: finished accept" << dendl;
   if (connection_fd < 0) {
     int err = errno;
     lderr(m_cct) << "AdminSocket: do_accept error: '"
                           << cpp_strerror(err) << dendl;
     return false;
   }
+  ldout(m_cct, 30) << "AdminSocket: finished accept" << dendl;
 
   char cmd[1024];
   unsigned pos = 0;
index 3742c3f1b2b2419d451b6d25cd3e44198bef0683..9886bba6c06d7d7683aa6f90628c38b4e593dc5b 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <arpa/inet.h>
+#include <fcntl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 
@@ -21,6 +22,9 @@
 #include "common/safe_io.h"
 #include "common/admin_socket_client.h"
 
+#include "include/compat.h"
+#include "include/sock_compat.h"
+
 using std::ostringstream;
 
 const char* get_rand_socket_path()
@@ -43,7 +47,7 @@ const char* get_rand_socket_path()
 
 static std::string asok_connect(const std::string &path, int *fd)
 {
-  int socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+  int socket_fd = socket_cloexec(PF_UNIX, SOCK_STREAM, 0);
   if(socket_fd < 0) {
     int err = errno;
     ostringstream oss;
index 0cd5bafd2acfc768a0d8485d6ff16c5bc971c9b5..67627e6a2d528703ff3bc8f55fee4623fb5b287d 100644 (file)
@@ -291,7 +291,7 @@ int _get_vdo_stats_handle(const char *devname, std::string *vdo_name)
     target[r] = 0;
     if (expect == target) {
       snprintf(fn, sizeof(fn), "/sys/kvdo/%s/statistics", de->d_name);
-      vdo_fd = ::open(fn, O_RDONLY); //DIRECTORY);
+      vdo_fd = ::open(fn, O_RDONLY|O_CLOEXEC); //DIRECTORY);
       if (vdo_fd >= 0) {
        *vdo_name = de->d_name;
        break;
@@ -324,7 +324,7 @@ int get_vdo_stats_handle(const char *devname, std::string *vdo_name)
 int64_t get_vdo_stat(int vdo_fd, const char *property)
 {
   int64_t ret = 0;
-  int fd = ::openat(vdo_fd, property, O_RDONLY);
+  int fd = ::openat(vdo_fd, property, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     return 0;
   }
index 6449b4d04e66979726a6081e6635eb83e066aefb..ac7108811a17c8bf6db659e65b1d17967b10c480 100644 (file)
@@ -2266,7 +2266,7 @@ void buffer::list::decode_base64(buffer::list& e)
 
 int buffer::list::read_file(const char *fn, std::string *error)
 {
-  int fd = TEMP_FAILURE_RETRY(::open(fn, O_RDONLY));
+  int fd = TEMP_FAILURE_RETRY(::open(fn, O_RDONLY|O_CLOEXEC));
   if (fd < 0) {
     int err = errno;
     std::ostringstream oss;
@@ -2343,7 +2343,7 @@ int buffer::list::read_fd_zero_copy(int fd, size_t len)
 
 int buffer::list::write_file(const char *fn, int mode)
 {
-  int fd = TEMP_FAILURE_RETRY(::open(fn, O_WRONLY|O_CREAT|O_TRUNC, mode));
+  int fd = TEMP_FAILURE_RETRY(::open(fn, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, mode));
   if (fd < 0) {
     int err = errno;
     cerr << "bufferlist::write_file(" << fn << "): failed to open file: "
index 66f6e7e8f6b30f60e604ca467af8d6af5d9788a4..1cfc4db973ab924586cf0e80491274c6953f300e 100644 (file)
@@ -1,19 +1,34 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
 
+#include <errno.h>
 #include <fcntl.h>
 #include <stdint.h>
-#include <unistd.h>
 #include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/param.h>
 #include <sys/mount.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
 #if defined(__linux__) 
 #include <sys/vfs.h>
 #endif
 
-#include "include/compat.h" 
+#include "include/compat.h"
+#include "include/sock_compat.h"
 #include "common/safe_io.h"
 
 // The type-value for a ZFS FS in fstatfs.
@@ -76,3 +91,96 @@ int ceph_posix_fallocate(int fd, off_t offset, off_t len) {
 #endif
 } 
 
+int pipe_cloexec(int pipefd[2])
+{
+#if defined(HAVE_PIPE2)
+  return pipe2(pipefd, O_CLOEXEC);
+#else
+  if (pipe(pipefd) == -1)
+    return -1;
+
+  /*
+   * The old-fashioned, race-condition prone way that we have to fall
+   * back on if pipe2 does not exist.
+   */
+  if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) < 0) {
+    goto fail;
+  }
+
+  if (fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) < 0) {
+    goto fail;
+  }
+
+  return 0;
+fail:
+  int save_errno = errno;
+  VOID_TEMP_FAILURE_RETRY(close(pipefd[0]));
+  VOID_TEMP_FAILURE_RETRY(close(pipefd[1]));
+  return (errno = save_errno, -1);
+#endif
+}
+
+
+int socket_cloexec(int domain, int type, int protocol)
+{
+#ifdef SOCK_CLOEXEC
+  return socket(domain, type|SOCK_CLOEXEC, protocol);
+#else
+  int fd = socket(domain, type, protocol);
+  if (fd == -1)
+    return -1;
+
+  if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
+    goto fail;
+
+  return fd;
+fail:
+  int save_errno = errno;
+  VOID_TEMP_FAILURE_RETRY(close(fd));
+  return (errno = save_errno, -1);
+#endif
+}
+
+int socketpair_cloexec(int domain, int type, int protocol, int sv[2])
+{
+#ifdef SOCK_CLOEXEC
+  return socketpair(domain, type|SOCK_CLOEXEC, protocol, sv);
+#else
+  int rc = socketpair(domain, type, protocol, sv);
+  if (rc == -1)
+    return -1;
+
+  if (fcntl(sv[0], F_SETFD, FD_CLOEXEC) < 0)
+    goto fail;
+
+  if (fcntl(sv[1], F_SETFD, FD_CLOEXEC) < 0)
+    goto fail;
+
+  return 0;
+fail:
+  int save_errno = errno;
+  VOID_TEMP_FAILURE_RETRY(close(sv[0]));
+  VOID_TEMP_FAILURE_RETRY(close(sv[1]));
+  return (errno = save_errno, -1);
+#endif
+}
+
+int accept_cloexec(int sockfd, struct sockaddr* addr, socklen_t* addrlen)
+{
+#ifdef HAVE_ACCEPT4
+  return accept4(sockfd, addr, addrlen, SOCK_CLOEXEC);
+#else
+  int fd = accept(sockfd, addr, addrlen);
+  if (fd == -1)
+    return -1;
+
+  if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
+    goto fail;
+
+  return fd;
+fail:
+  int save_errno = errno;
+  VOID_TEMP_FAILURE_RETRY(close(fd));
+  return (errno = save_errno, -1);
+#endif
+}
index 8becf6a42c00ee328be336040cb7d6fd226f0fa7..24ac74c6dbd317bdbfc3e47384f6e72cdec42bfa 100644 (file)
@@ -74,7 +74,7 @@ int ceph_resolve_file_search(const std::string& filename_list,
   int ret = -ENOENT;
   list<string>::iterator iter;
   for (iter = ls.begin(); iter != ls.end(); ++iter) {
-    int fd = ::open(iter->c_str(), O_RDONLY);
+    int fd = ::open(iter->c_str(), O_RDONLY|O_CLOEXEC);
     if (fd < 0) {
       ret = -errno;
       continue;
diff --git a/src/common/pipe.c b/src/common/pipe.c
deleted file mode 100644 (file)
index 7353cb7..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2011 New Dream Network
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-#include "include/compat.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-int pipe_cloexec(int pipefd[2])
-{
-       int ret;
-
-#if defined(HAVE_PIPE2) && defined(O_CLOEXEC)
-       ret = pipe2(pipefd, O_CLOEXEC);
-       if (ret == -1)
-               return -errno;
-       return 0;
-#else
-       ret = pipe(pipefd);
-       if (ret == -1)
-               return -errno;
-
-       /*
-        * The old-fashioned, race-condition prone way that we have to fall
-        * back on if O_CLOEXEC does not exist.
-        */
-       ret = fcntl(pipefd[0], F_SETFD, FD_CLOEXEC);
-       if (ret == -1) {
-               ret = -errno;
-               goto out;
-       }
-
-       ret = fcntl(pipefd[1], F_SETFD, FD_CLOEXEC);
-       if (ret == -1) {
-               ret = -errno;
-               goto out;
-       }
-
-       return 0;
-
-out:
-       VOID_TEMP_FAILURE_RETRY(close(pipefd[0]));
-       VOID_TEMP_FAILURE_RETRY(close(pipefd[1]));
-
-       return ret;
-#endif
-}
diff --git a/src/common/pipe.h b/src/common/pipe.h
deleted file mode 100644 (file)
index b57ec0c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2011 New Dream Network
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-
-#ifndef CEPH_COMMON_PIPE_H
-#define CEPH_COMMON_PIPE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Create a pipe and set both ends to have F_CLOEXEC
- *
- * @param pipefd       pipe array, just as in pipe(2)
- * @return             0 on success, errno otherwise 
- */
-int pipe_cloexec(int pipefd[2]);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
index 8fd9247b0421a885be4034f9ef4abbfe60e0cd65..fad2254987a64c13a9e665fabff311c963a3faf4 100644 (file)
@@ -427,7 +427,7 @@ void global_init_daemonize(CephContext *cct)
 
 int reopen_as_null(CephContext *cct, int fd)
 {
-  int newfd = open("/dev/null", O_RDONLY);
+  int newfd = open("/dev/null", O_RDONLY|O_CLOEXEC);
   if (newfd < 0) {
     int err = errno;
     lderr(cct) << __func__ << " failed to open /dev/null: " << cpp_strerror(err)
@@ -445,6 +445,7 @@ int reopen_as_null(CephContext *cct, int fd)
   }
   // close newfd (we cloned it to target fd)
   VOID_TEMP_FAILURE_RETRY(close(newfd));
+  // N.B. FD_CLOEXEC is cleared on fd (see dup2(2))
   return 0;
 }
 
index 14e5871872a3b3996c9ceebab7a28bc6d4e917e1..6dd5a756957c3a906e639fa4b2a387afef65b8fd 100644 (file)
@@ -141,7 +141,7 @@ int pidfh::open(const md_config_t *conf)
     return -ENAMETOOLONG;
 
   int fd;
-  fd = ::open(pf_path, O_CREAT|O_RDWR, 0644);
+  fd = ::open(pf_path, O_CREAT|O_RDWR|O_CLOEXEC, 0644);
   if (fd < 0) {
     int err = errno;
     derr << __func__ << ": failed to open pid file '"
index ae860e214560c0f19b93b2277404b5581273de44..f60129e1f2ccef847b00cf170951798837b76dcc 100644 (file)
@@ -251,7 +251,7 @@ struct SignalHandler : public Thread {
     : stop(false), lock("SignalHandler::lock")
   {
     // create signal pipe
-    int r = pipe(pipefd);
+    int r = pipe_cloexec(pipefd);
     assert(r == 0);
     r = fcntl(pipefd[0], F_SETFL, O_NONBLOCK);
     assert(r == 0);
@@ -388,7 +388,7 @@ void SignalHandler::register_handler(int signum, signal_handler_t handler, bool
 
   safe_handler *h = new safe_handler;
 
-  r = pipe(h->pipefd);
+  r = pipe_cloexec(h->pipefd);
   assert(r == 0);
   r = fcntl(h->pipefd[0], F_SETFL, O_NONBLOCK);
   assert(r == 0);
index 06b4b127a7ecdd3d2ce7455946beb2d28f4a8df5..c930b727564b449d09016c59e7dcbb8ee6c41faa 100644 (file)
 
 int ceph_posix_fallocate(int fd, off_t offset, off_t len);
 
+int pipe_cloexec(int pipefd[2]);
+
 #endif /* !CEPH_COMPAT_H */
index b0079f2a2325260e86843cf2ec75b70019681ba6..397701c2d67c1d8d76b3938165742777fec6e9d1 100644 (file)
@@ -100,7 +100,7 @@ inline constexpr bool denc_supported = denc_traits<T>::supported;
     snprintf(fn, sizeof(fn),                                           \
             ENCODE_STRINGIFY(ENCODE_DUMP_PATH) "/%s__%d.%x", #Type,            \
             getpid(), i++);                                            \
-    int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT, 0644);               \
+    int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT|O_CLOEXEC, 0644);             \
     if (fd >= 0) {                                                     \
       size_t len = p.get_pos() - __denc_dump_pre;                      \
       int r = ::write(fd, __denc_dump_pre, len);                       \
index 45c8f66efeea1995734d0eef9e96eb9727101023..0e4cd619e6d2a4a4fd33e838669ac37d878ef1d2 100644 (file)
@@ -144,7 +144,7 @@ WRITE_INTTYPE_ENCODER(int16_t, le16)
       break;                                                           \
     char fn[PATH_MAX];                                                 \
     snprintf(fn, sizeof(fn), ENCODE_STRINGIFY(ENCODE_DUMP_PATH) "/%s__%d.%x", #cl, getpid(), i++); \
-    int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT, 0644);               \
+    int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT|O_CLOEXEC, 0644);             \
     if (fd >= 0) {                                                     \
       ::ceph::bufferlist sub;                                          \
       sub.substr_of(bl, pre_off, bl.length() - pre_off);               \
index cbfee2d7235b16541b10caf0b9ba0d3d179901a5..b3cb80c31d29f20379ad77c568c5ab966efdc268 100644 (file)
@@ -91,7 +91,7 @@ void randomize_rng(const SeedT seed, MutexT& m, EngineT& e)
 template <typename MutexT, typename EngineT>
 void randomize_rng(MutexT& m, EngineT& e)
 {
-  thread_local std::random_device rd;
+  std::random_device rd;
  
   std::lock_guard<MutexT> lg(m);
   e.seed(rd());
@@ -107,7 +107,7 @@ void randomize_rng(const SeedT n)
 template <typename EngineT = std::default_random_engine>
 void randomize_rng()
 {
-  thread_local std::random_device rd;
+  std::random_device rd;
   detail::engine<EngineT>().seed(rd());
 }
 
index f9dc24b1ddc6bdba7210a23cb292b2422a7a9489..14b5efa1df2dbfc7b109a028e4beb4aa53ab6342 100644 (file)
@@ -1,7 +1,19 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ */
+
 #ifndef CEPH_SOCK_COMPAT_H
 #define CEPH_SOCK_COMPAT_H
 
 #include "include/compat.h"
+#include <sys/socket.h>
 
 /*
  * This optimization may not be available on all platforms (e.g. OSX).
@@ -24,4 +36,8 @@
 # endif
 #endif
 
+int socket_cloexec(int domain, int type, int protocol);
+int socketpair_cloexec(int domain, int type, int protocol, int sv[2]);
+int accept_cloexec(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
+
 #endif
index 98ee4b70be1feecab5389e68481a795b08966c8c..ebbb08c846663328c37140ee1c82c0a115a52f49 100644 (file)
@@ -6,12 +6,13 @@
  */
 
 #include "encoding.h"
+
 #include <ostream>
+#include <random>
 
 #include <boost/uuid/uuid.hpp>
 #include <boost/uuid/uuid_generators.hpp>
 #include <boost/uuid/uuid_io.hpp>
-#include <boost/random/random_device.hpp>
 
 struct uuid_d {
   boost::uuids::uuid uuid;
@@ -26,8 +27,8 @@ struct uuid_d {
   }
 
   void generate_random() {
-    boost::random::random_device rng("/dev/urandom");
-    boost::uuids::basic_random_generator<boost::random::random_device> gen(&rng);
+    std::random_device rng;
+    boost::uuids::basic_random_generator gen(rng);
     uuid = gen();
   }
   
index 438fe095ba3e4a2b1110c22f70c6b98189555a81..daa805e1c5bb23760a864c7f87dac5a5ee59a83e 100644 (file)
@@ -69,7 +69,7 @@ void MemDB::_save()
   dout(10) << __func__ << " Saving MemDB to file: "<< _get_data_fn().c_str() << dendl;
   int mode = 0644;
   int fd = TEMP_FAILURE_RETRY(::open(_get_data_fn().c_str(),
-                                     O_WRONLY|O_CREAT|O_TRUNC, mode));
+                                     O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, mode));
   if (fd < 0) {
     int err = errno;
     cerr << "write_file(" << _get_data_fn().c_str() << "): failed to open file: "
@@ -95,7 +95,7 @@ int MemDB::_load()
   /*
    * Open file and read it in single shot.
    */
-  int fd = TEMP_FAILURE_RETRY(::open(_get_data_fn().c_str(), O_RDONLY));
+  int fd = TEMP_FAILURE_RETRY(::open(_get_data_fn().c_str(), O_RDONLY|O_CLOEXEC));
   if (fd < 0) {
     int err = errno;
     cerr << "can't open " << _get_data_fn().c_str() << ": "
index 9240751dd1228b1989ee45d05010cde42a3d737e..061b93021cd42df577a617af25e20cf3ae5371dc 100644 (file)
@@ -23,6 +23,8 @@
 #define DEFAULT_MAX_NEW    100
 #define DEFAULT_MAX_RECENT 10000
 
+#include <fcntl.h>
+
 #define PREALLOC 1000000
 
 
@@ -145,12 +147,11 @@ void Log::reopen_log_file()
   if (m_fd >= 0)
     VOID_TEMP_FAILURE_RETRY(::close(m_fd));
   if (m_log_file.length()) {
-    m_fd = ::open(m_log_file.c_str(), O_CREAT|O_WRONLY|O_APPEND, 0644);
+    m_fd = ::open(m_log_file.c_str(), O_CREAT|O_WRONLY|O_APPEND|O_CLOEXEC, 0644);
     if (m_fd >= 0 && (m_uid || m_gid)) {
-      int r = ::fchown(m_fd, m_uid, m_gid);
-      if (r < 0) {
-       r = -errno;
-       cerr << "failed to chown " << m_log_file << ": " << cpp_strerror(r)
+      if (::fchown(m_fd, m_uid, m_gid) < 0) {
+       int e = errno;
+       cerr << "failed to chown " << m_log_file << ": " << cpp_strerror(e)
             << std::endl;
       }
     }
index 9ec17384adbe062879757afc65e66877fbc435de..129b4ee844798644af1c89fbcadcc540942fb1f7 100644 (file)
@@ -12306,7 +12306,7 @@ int MDCache::dump_cache(std::string_view fn, Formatter *f)
 
     dout(1) << "dump_cache to " << path << dendl;
 
-    fd = ::open(path, O_WRONLY|O_CREAT|O_EXCL, 0600);
+    fd = ::open(path, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0600);
     if (fd < 0) {
       derr << "failed to open " << path << ": " << cpp_strerror(errno) << dendl;
       return errno;
index 9ed08596ee5c17b5d5b1876d1d5d05be7c708096..27e9e45f5cb518be1ed9a0cd1dfae13ce34aac22 100644 (file)
@@ -185,7 +185,7 @@ void LogMonitor::update_from_paxos(bool *need_bootstrap)
              << "' logging " << p->second.length() << " bytes" << dendl;
     string log_file = channels.get_log_file(p->first);
 
-    int fd = ::open(log_file.c_str(), O_WRONLY|O_APPEND|O_CREAT, 0600);
+    int fd = ::open(log_file.c_str(), O_WRONLY|O_APPEND|O_CREAT|O_CLOEXEC, 0600);
     if (fd < 0) {
       int err = -errno;
       dout(1) << "unable to write to '" << log_file << "' for channel '"
index a1d0217935aea31334dfe2b58ac09c282ed4790e..cef6be3d9243c26a1a898f286ba9fd235c789bc3 100644 (file)
@@ -5654,7 +5654,7 @@ int Monitor::write_default_keyring(bufferlist& bl)
   os << g_conf->mon_data << "/keyring";
 
   int err = 0;
-  int fd = ::open(os.str().c_str(), O_WRONLY|O_CREAT, 0600);
+  int fd = ::open(os.str().c_str(), O_WRONLY|O_CREAT|O_CLOEXEC, 0600);
   if (fd < 0) {
     err = -errno;
     dout(0) << __func__ << " failed to open " << os.str() 
index f1e0efd7da879ecaf66bc49c6b735058086b08e1..093600b652d75bc09776d716060e37103fa63bb9 100644 (file)
@@ -608,7 +608,7 @@ class MonitorDBStore
       if (!g_conf->mon_debug_dump_json) {
         dump_fd_binary = ::open(
           g_conf->mon_debug_dump_location.c_str(),
-          O_CREAT|O_APPEND|O_WRONLY, 0644);
+          O_CREAT|O_APPEND|O_WRONLY|O_CLOEXEC, 0644);
         if (dump_fd_binary < 0) {
           dump_fd_binary = -errno;
           derr << "Could not open log file, got "
index 13c314d4b471b3a5c1c76293cf09bdd286352b8d..ce7f8fe41549e5962cac5cf0a04d48fcec56d37b 100644 (file)
@@ -262,7 +262,7 @@ void Message::encode(uint64_t features, int crcflags)
       snprintf(fn, sizeof(fn), ENCODE_STRINGIFY(ENCODE_DUMP) "/%s__%d.%x",
               abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status),
               getpid(), i++);
-      int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT, 0644);
+      int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT|O_CLOEXEC, 0644);
       if (fd >= 0) {
        bl.write_fd(fd);
        ::close(fd);
index 9e16efd867cee32e3f7a239c613f3317a5780783..ed38b7cce9b7015175b7b9dca2161266e3e2077a 100644 (file)
@@ -14,6 +14,7 @@
  *
  */
 
+#include "include/compat.h"
 #include "common/errno.h"
 #include "Event.h"
 
@@ -141,9 +142,10 @@ int EventCenter::init(int n, unsigned i, const std::string &t)
     return 0;
 
   int fds[2];
-  if (pipe(fds) < 0) {
-    lderr(cct) << __func__ << " can't create notify pipe" << dendl;
-    return -errno;
+  if (pipe_cloexec(fds) < 0) {
+    int e = errno;
+    lderr(cct) << __func__ << " can't create notify pipe: " << cpp_strerror(e) << dendl;
+    return -e;
   }
 
   notify_receive_fd = fds[0];
index 17f3a294659c00c056d7bdb124b568c7f574cb51..37b469736247fa8e900f42e007b7cd82dd4bc4c8 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "common/errno.h"
+#include <fcntl.h>
 #include "EventEpoll.h"
 
 #define dout_subsys ceph_subsys_ms
@@ -37,6 +38,14 @@ int EpollDriver::init(EventCenter *c, int nevent)
                        << cpp_strerror(errno) << dendl;
     return -errno;
   }
+  if (::fcntl(epfd, F_SETFD, FD_CLOEXEC) == -1) {
+    int e = errno;
+    ::close(epfd);
+    lderr(cct) << __func__ << " unable to set cloexec: "
+                       << cpp_strerror(e) << dendl;
+
+    return -e;
+  }
 
   size = nevent;
 
index 9a2ceab6b85e8c7b694c25c0bd98eda8d6cee8bd..fc963bf5805b2eda130f579edadc650528dc8f47 100644 (file)
@@ -30,6 +30,7 @@
 #include "common/strtol.h"
 #include "common/dout.h"
 #include "msg/Messenger.h"
+#include "include/compat.h"
 #include "include/sock_compat.h"
 
 #define dout_subsys ceph_subsys_ms
@@ -183,12 +184,11 @@ int PosixServerSocketImpl::accept(ConnectedSocket *sock, const SocketOptions &op
   assert(sock);
   sockaddr_storage ss;
   socklen_t slen = sizeof(ss);
-  int sd = ::accept(_fd, (sockaddr*)&ss, &slen);
+  int sd = accept_cloexec(_fd, (sockaddr*)&ss, &slen);
   if (sd < 0) {
     return -errno;
   }
 
-  handler.set_close_on_exec(sd);
   int r = handler.set_nonblock(sd);
   if (r < 0) {
     ::close(sd);
@@ -229,7 +229,6 @@ int PosixWorker::listen(entity_addr_t &sa, const SocketOptions &opt,
     return -errno;
   }
 
-  net.set_close_on_exec(listen_sd);
   r = net.set_socket_options(listen_sd, opt.nodelay, opt.rcbuf_size);
   if (r < 0) {
     ::close(listen_sd);
index 99ca1f32d9279462fe6b98ca36d484a3ca15b31d..4e9a2bcbec30b3fd9d4ea6c545fcf15a75b60466 100644 (file)
 #include <arpa/inet.h>
 
 #include "net_handler.h"
-#include "common/errno.h"
 #include "common/debug.h"
+#include "common/errno.h"
+#include "include/compat.h"
+#include "include/sock_compat.h"
 
 #define dout_subsys ceph_subsys_ms
 #undef dout_prefix
@@ -36,7 +38,7 @@ int NetHandler::create_socket(int domain, bool reuse_addr)
   int s;
   int r = 0;
 
-  if ((s = ::socket(domain, SOCK_STREAM, 0)) == -1) {
+  if ((s = socket_cloexec(domain, SOCK_STREAM, 0)) == -1) {
     r = errno;
     lderr(cct) << __func__ << " couldn't create socket " << cpp_strerror(r) << dendl;
     return -r;
@@ -82,22 +84,6 @@ int NetHandler::set_nonblock(int sd)
   return 0;
 }
 
-void NetHandler::set_close_on_exec(int sd)
-{
-  int flags = fcntl(sd, F_GETFD, 0);
-  if (flags < 0) {
-    int r = errno;
-    lderr(cct) << __func__ << " fcntl(F_GETFD): "
-              << cpp_strerror(r) << dendl;
-    return;
-  }
-  if (fcntl(sd, F_SETFD, flags | FD_CLOEXEC)) {
-    int r = errno;
-    lderr(cct) << __func__ << " fcntl(F_SETFD): "
-              << cpp_strerror(r) << dendl;
-  }
-}
-
 int NetHandler::set_socket_options(int sd, bool nodelay, int size)
 {
   int r = 0;
index c4fb73ee2914beabe7a032ebcc242b64ba684d11..1904237724fe73345269883ce233e7e2e912169d 100644 (file)
@@ -27,7 +27,6 @@ namespace ceph {
     int create_socket(int domain, bool reuse_addr=false);
     explicit NetHandler(CephContext *c): cct(c) {}
     int set_nonblock(int sd);
-    void set_close_on_exec(int sd);
     int set_socket_options(int sd, bool nodelay, int size);
     int connect(const entity_addr_t &addr, const entity_addr_t& bind_addr);
     
index eca63e6054b9d3584cdc88e063a1cd0f65385233..495da733c0a2ccfb730cdbd71b941df15c5e16f1 100644 (file)
@@ -177,7 +177,6 @@ int RDMAConnectedSocketImpl::try_connect(const entity_addr_t& peer_addr, const S
   if (tcp_fd < 0) {
     return -errno;
   }
-  net.set_close_on_exec(tcp_fd);
 
   int r = net.set_socket_options(tcp_fd, opts.nodelay, opts.rcbuf_size);
   if (r < 0) {
index 6e473d12ea7c9379d63ce71bae9d6d46fc353941..c1b9b0bb5e2fb3881e77011731224585a0973553 100644 (file)
@@ -17,6 +17,9 @@
 #include "msg/async/net_handler.h"
 #include "RDMAStack.h"
 
+#include "include/compat.h"
+#include "include/sock_compat.h"
+
 #define dout_subsys ceph_subsys_ms
 #undef dout_prefix
 #define dout_prefix *_dout << " RDMAServerSocketImpl "
@@ -46,7 +49,6 @@ int RDMAServerSocketImpl::listen(entity_addr_t &sa, const SocketOptions &opt)
   if (rc < 0) {
     goto err;
   }
-  net.set_close_on_exec(server_setup_socket);
 
   rc = ::bind(server_setup_socket, sa.get_sockaddr(), sa.get_sockaddr_len());
   if (rc < 0) {
@@ -79,12 +81,11 @@ int RDMAServerSocketImpl::accept(ConnectedSocket *sock, const SocketOptions &opt
   assert(sock);
   sockaddr_storage ss;
   socklen_t slen = sizeof(ss);
-  int sd = ::accept(server_setup_socket, (sockaddr*)&ss, &slen);
+  int sd = accept_cloexec(server_setup_socket, (sockaddr*)&ss, &slen);
   if (sd < 0) {
     return -errno;
   }
 
-  net.set_close_on_exec(sd);
   int r = net.set_nonblock(sd);
   if (r < 0) {
     ::close(sd);
index 16ea0413c2981398ced63bf45197a5dfc0bda88a..1cee8e88fe86c16c7f9e50d6af490e1f3ce5d7c1 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include "include/compat.h"
+#include "include/sock_compat.h"
 #include <iterator>
 #include <sys/socket.h>
 #include <netinet/tcp.h>
  * Accepter
  */
 
-static int set_close_on_exec(int fd)
-{
-  int flags = fcntl(fd, F_GETFD, 0);
-  if (flags < 0) {
-    return errno;
-  }
-  if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC)) {
-    return errno;
-  }
-  return 0;
-}
-
 int Accepter::create_selfpipe(int *pipe_rd, int *pipe_wr) {
   int selfpipe[2];
-#ifdef HAVE_PIPE2
-  int ret = ::pipe2(selfpipe, (O_CLOEXEC|O_NONBLOCK));
-#else
-  int ret = ::pipe(selfpipe);
-  if (ret == 0) {
-    for (size_t i = 0; i < std::size(selfpipe); i++) {
-      int f = fcntl(selfpipe[i], F_GETFL);
-      ceph_assert(f != -1);
-      f = fcntl(selfpipe[i], F_SETFL, f | O_NONBLOCK);
-      ceph_assert(f != -1);
-    }
-  }
-#endif
-  if (ret < 0 ) {
+  if (pipe_cloexec(selfpipe) < 0) {
+    int e = errno;
     lderr(msgr->cct) << __func__ << " unable to create the selfpipe: "
-                    << cpp_strerror(errno) << dendl;
-    return -errno;
+                    << cpp_strerror(e) << dendl;
+    return -e;
+  }
+  for (size_t i = 0; i < std::size(selfpipe); i++) {
+    int rc = fcntl(selfpipe[i], F_GETFL);
+    ceph_assert(rc != -1);
+    rc = fcntl(selfpipe[i], F_SETFL, rc | O_NONBLOCK);
+    ceph_assert(rc != -1);
   }
   *pipe_rd = selfpipe[0];
   *pipe_wr = selfpipe[1];
@@ -97,19 +80,14 @@ int Accepter::bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports)
   }
 
   /* socket creation */
-  listen_sd = ::socket(family, SOCK_STREAM, 0);
-  ldout(msgr->cct,10) <<  __func__ << " socket sd: " << listen_sd << dendl;
+  listen_sd = socket_cloexec(family, SOCK_STREAM, 0);
   if (listen_sd < 0) {
+    int e = errno;
     lderr(msgr->cct) << __func__ << " unable to create socket: "
-                    << cpp_strerror(errno) << dendl;
-    return -errno;
-  }
-
-  if (set_close_on_exec(listen_sd)) {
-    lderr(msgr->cct) << __func__ << " unable to set_close_exec(): "
-                    << cpp_strerror(errno) << dendl;
+                    << cpp_strerror(e) << dendl;
+    return -e;
   }
-  
+  ldout(msgr->cct,10) <<  __func__ << " socket sd: " << listen_sd << dendl;
 
   // use whatever user specified (if anything)
   entity_addr_t listen_addr = bind_addr;
@@ -342,20 +320,16 @@ void *Accepter::entry()
     // accept
     sockaddr_storage ss;
     socklen_t slen = sizeof(ss);
-    int sd = ::accept(listen_sd, (sockaddr*)&ss, &slen);
+    int sd = accept_cloexec(listen_sd, (sockaddr*)&ss, &slen);
     if (sd >= 0) {
-      int r = set_close_on_exec(sd);
-      if (r) {
-       ldout(msgr->cct,1) << __func__ << " set_close_on_exec() failed "
-             << cpp_strerror(r) << dendl;
-      }
       errors = 0;
       ldout(msgr->cct,10) << __func__ << " incoming on sd " << sd << dendl;
       
       msgr->add_accept_pipe(sd);
     } else {
+      int e = errno;
       ldout(msgr->cct,0) << __func__ << " no incoming connection?  sd = " << sd
-             << " errno " << errno << " " << cpp_strerror(errno) << dendl;
+             << " errno " << e << " " << cpp_strerror(e) << dendl;
       if (++errors > msgr->cct->_conf->ms_max_accept_failures) {
         lderr(msgr->cct) << "accetper has encoutered enough errors, just do ceph_abort()." << dendl;
         ceph_abort();
index 9bde7679ee423d90ac4e852e9756c645697dfdca..c7170ae4621d97726e457b439e8c26b1cf60071a 100644 (file)
@@ -34,6 +34,7 @@
 #include "auth/cephx/CephxProtocol.h"
 #include "auth/AuthSessionHandler.h"
 
+#include "include/compat.h"
 #include "include/sock_compat.h"
 #include "include/random.h"
 
@@ -1022,10 +1023,11 @@ int Pipe::connect()
     ::close(sd);
 
   // create socket?
-  sd = ::socket(peer_addr.get_family(), SOCK_STREAM, 0);
+  sd = socket_cloexec(peer_addr.get_family(), SOCK_STREAM, 0);
   if (sd < 0) {
-    rc = -errno;
-    lderr(msgr->cct) << "connect couldn't create socket " << cpp_strerror(rc) << dendl;
+    int e = errno;
+    lderr(msgr->cct) << "connect couldn't create socket " << cpp_strerror(e) << dendl;
+    rc = -e;
     goto fail;
   }
 
index b833c00cc872ffa1ceec0245d5d83f625d04bc4b..8eb77de3f8da396d2a5ffb6738ac39c3cd7854a9 100644 (file)
@@ -4388,7 +4388,7 @@ int BlueStore::_open_path()
     return -EINVAL;
   }
   ceph_assert(path_fd < 0);
-  path_fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_DIRECTORY));
+  path_fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_DIRECTORY|O_CLOEXEC));
   if (path_fd < 0) {
     int r = -errno;
     derr << __func__ << " unable to open " << path << ": " << cpp_strerror(r)
@@ -4417,7 +4417,7 @@ int BlueStore::_write_bdev_label(CephContext *cct,
   z.zero();
   bl.append(std::move(z));
 
-  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_WRONLY));
+  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_WRONLY|O_CLOEXEC));
   if (fd < 0) {
     fd = -errno;
     derr << __func__ << " failed to open " << path << ": " << cpp_strerror(fd)
@@ -4444,7 +4444,7 @@ int BlueStore::_read_bdev_label(CephContext* cct, string path,
                                bluestore_bdev_label_t *label)
 {
   dout(10) << __func__ << dendl;
-  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_RDONLY));
+  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_RDONLY|O_CLOEXEC));
   if (fd < 0) {
     fd = -errno;
     derr << __func__ << " failed to open " << path << ": " << cpp_strerror(fd)
@@ -4761,7 +4761,7 @@ void BlueStore::_close_alloc()
 int BlueStore::_open_fsid(bool create)
 {
   ceph_assert(fsid_fd < 0);
-  int flags = O_RDWR;
+  int flags = O_RDWR|O_CLOEXEC;
   if (create)
     flags |= O_CREAT;
   fsid_fd = ::openat(path_fd, "fsid", flags, 0644);
@@ -5493,7 +5493,7 @@ int BlueStore::_setup_block_symlink_or_file(
   dout(20) << __func__ << " name " << name << " path " << epath
           << " size " << size << " create=" << (int)create << dendl;
   int r = 0;
-  int flags = O_RDWR;
+  int flags = O_RDWR|O_CLOEXEC;
   if (create)
     flags |= O_CREAT;
   if (epath.length()) {
index 00290aed87feb4eb07a1fb4adee306a27e8c206f..8120ef7978c046c2f6bd076735a1b293949ba5ca 100644 (file)
@@ -68,13 +68,13 @@ int KernelDevice::open(const string& p)
   int r = 0;
   dout(1) << __func__ << " path " << path << dendl;
 
-  fd_direct = ::open(path.c_str(), O_RDWR | O_DIRECT);
+  fd_direct = ::open(path.c_str(), O_RDWR | O_DIRECT | O_CLOEXEC);
   if (fd_direct < 0) {
     r = -errno;
     derr << __func__ << " open got: " << cpp_strerror(r) << dendl;
     return r;
   }
-  fd_buffered = ::open(path.c_str(), O_RDWR);
+  fd_buffered = ::open(path.c_str(), O_RDWR | O_CLOEXEC);
   if (fd_buffered < 0) {
     r = -errno;
     derr << __func__ << " open got: " << cpp_strerror(r) << dendl;
index 2c2d80c13d635b915e09ca0b26a58d5f396c11b3..75926293dc92fcbaf40e112fce49d43fa204dfca 100644 (file)
@@ -740,7 +740,7 @@ int NVMEDevice::open(const string& p)
   dout(1) << __func__ << " path " << p << dendl;
 
   string serial_number;
-  int fd = ::open(p.c_str(), O_RDONLY);
+  int fd = ::open(p.c_str(), O_RDONLY | O_CLOEXEC);
   if (fd < 0) {
     r = -errno;
     derr << __func__ << " unable to open " << p << ": " << cpp_strerror(r)
index 137cad60dd0348d130727dd8f37d4c5b4a108b55..70458d25fc76603ae1cc0d5c3c201f285d796f76 100644 (file)
@@ -61,7 +61,7 @@ int PMEMDevice::open(const string& p)
   int r = 0;
   dout(1) << __func__ << " path " << path << dendl;
 
-  fd = ::open(path.c_str(), O_RDWR);
+  fd = ::open(path.c_str(), O_RDWR | O_CLOEXEC);
   if (fd < 0) {
     r = -errno;
     derr << __func__ << " open got: " << cpp_strerror(r) << dendl;
index 50834d369cf43905c6dc0da24dabffee41ac3325..1f11ab0fb3287712becb5327ac7952672077fb56 100644 (file)
@@ -401,7 +401,7 @@ int main(int argc, char **argv)
        }
       } else {
        v += "\n";
-       int fd = ::open(p.c_str(), O_CREAT|O_TRUNC|O_WRONLY, 0600);
+       int fd = ::open(p.c_str(), O_CREAT|O_TRUNC|O_WRONLY|O_CLOEXEC, 0600);
        if (fd < 0) {
          cerr << "error writing " << p << ": " << cpp_strerror(errno)
               << std::endl;
@@ -580,7 +580,7 @@ int main(int argc, char **argv)
          exit(EXIT_FAILURE);
        }
        string path = out_dir + "/" + dir + "/" + file;
-       int fd = ::open(path.c_str(), O_CREAT|O_WRONLY|O_TRUNC, 0644);
+       int fd = ::open(path.c_str(), O_CREAT|O_WRONLY|O_TRUNC|O_CLOEXEC, 0644);
        if (fd < 0) {
          r = -errno;
          cerr << "open " << path << " failed: " << cpp_strerror(r) << std::endl;
index 8718432ec671647206254d37744e69b9d9509723..840dce8a592d0f1cb6d77ba91adca10a4bd07b31 100644 (file)
@@ -69,7 +69,7 @@ int BtrfsFileStoreBackend::detect_features()
 
   // clone_range?
   if (m_filestore_btrfs_clone_range) {
-    int fd = ::openat(get_basedir_fd(), "clone_range_test", O_CREAT|O_WRONLY, 0600);
+    int fd = ::openat(get_basedir_fd(), "clone_range_test", O_CREAT|O_WRONLY|O_CLOEXEC, 0600);
     if (fd >= 0) {
       if (::unlinkat(get_basedir_fd(), "clone_range_test", 0) < 0) {
        r = -errno;
@@ -108,7 +108,7 @@ int BtrfsFileStoreBackend::detect_features()
     r = -errno;
     dout(0) << "detect_feature: failed to create simple subvolume " << vol_args.name << ": " << cpp_strerror(r) << dendl;
   }
-  int srcfd = ::openat(get_basedir_fd(), vol_args.name, O_RDONLY);
+  int srcfd = ::openat(get_basedir_fd(), vol_args.name, O_RDONLY|O_CLOEXEC);
   if (srcfd < 0) {
     r = -errno;
     dout(0) << "detect_feature: failed to open " << vol_args.name << ": " << cpp_strerror(r) << dendl;
@@ -445,7 +445,7 @@ int BtrfsFileStoreBackend::rollback_to(const string& name)
   snprintf(s, sizeof(s), "%s/%s", get_basedir_path().c_str(), name.c_str());
 
   // roll back
-  vol_args.fd = ::open(s, O_RDONLY);
+  vol_args.fd = ::open(s, O_RDONLY|O_CLOEXEC);
   if (vol_args.fd < 0) {
     ret = -errno;
     dout(0) << "rollback_to: error opening '" << s << "': " << cpp_strerror(ret) << dendl;
index fb5aace2995da39bae8bcc3127337f47c3b18932..c7002cb78c6261ac6d1698afc6ffff29ad7501df 100644 (file)
@@ -71,7 +71,7 @@ int FileJournal::_open(bool forwrite, bool create)
           << cpp_strerror(err) << dendl;
     }
   }
-  fd = TEMP_FAILURE_RETRY(::open(fn.c_str(), flags, 0644));
+  fd = TEMP_FAILURE_RETRY(::open(fn.c_str(), flags|O_CLOEXEC, 0644));
   if (fd < 0) {
     int err = errno;
     dout(2) << "FileJournal::_open unable to open journal "
index 37a7d9e8545ba60ac33abbfddf87c6c36b6dc0ae..5688131fdfbba65d5c184b5c399c05f2aa72ac98 100644 (file)
@@ -294,7 +294,7 @@ int FileStore::lfn_open(const coll_t& cid,
     goto fail;
   }
 
-  r = ::open((*path)->path(), flags, 0644);
+  r = ::open((*path)->path(), flags|O_CLOEXEC, 0644);
   if (r < 0) {
     r = -errno;
     dout(10) << "error opening file " << (*path)->path() << " with flags="
@@ -851,7 +851,7 @@ int FileStore::mkfs()
   uuid_d old_omap_fsid;
 
   dout(1) << "mkfs in " << basedir << dendl;
-  basedir_fd = ::open(basedir.c_str(), O_RDONLY);
+  basedir_fd = ::open(basedir.c_str(), O_RDONLY|O_CLOEXEC);
   if (basedir_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": failed to open base dir " << basedir << ": " << cpp_strerror(ret) << dendl;
@@ -860,7 +860,7 @@ int FileStore::mkfs()
 
   // open+lock fsid
   snprintf(fsid_fn, sizeof(fsid_fn), "%s/fsid", basedir.c_str());
-  fsid_fd = ::open(fsid_fn, O_RDWR|O_CREAT, 0644);
+  fsid_fd = ::open(fsid_fn, O_RDWR|O_CREAT|O_CLOEXEC, 0644);
   if (fsid_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": failed to open " << fsid_fn << ": " << cpp_strerror(ret) << dendl;
@@ -975,7 +975,7 @@ int FileStore::mkfs()
 
       if (backend->can_checkpoint()) {
        // create snap_1 too
-       current_fd = ::open(current_fn.c_str(), O_RDONLY);
+       current_fd = ::open(current_fn.c_str(), O_RDONLY|O_CLOEXEC);
        ceph_assert(current_fd >= 0);
        char s[NAME_MAX];
        snprintf(s, sizeof(s), COMMIT_SNAP_ITEM, 1ull);
@@ -1000,7 +1000,7 @@ int FileStore::mkfs()
   int omap_fsid_fd;
   char omap_fsid_fn[PATH_MAX];
   snprintf(omap_fsid_fn, sizeof(omap_fsid_fn), "%s/osd_uuid", omap_dir.c_str());
-  omap_fsid_fd = ::open(omap_fsid_fn, O_RDWR|O_CREAT, 0644);
+  omap_fsid_fd = ::open(omap_fsid_fn, O_RDWR|O_CREAT|O_CLOEXEC, 0644);
   if (omap_fsid_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": failed to open " << omap_fsid_fn << ": " << cpp_strerror(ret) << dendl;
@@ -1076,7 +1076,7 @@ int FileStore::mkjournal()
   int ret;
   char fn[PATH_MAX];
   snprintf(fn, sizeof(fn), "%s/fsid", basedir.c_str());
-  int fd = ::open(fn, O_RDONLY, 0644);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC, 0644);
   if (fd < 0) {
     int err = errno;
     derr << __FUNC__ << ": open error: " << cpp_strerror(err) << dendl;
@@ -1158,7 +1158,7 @@ bool FileStore::test_mount_in_use()
 
   // verify fs isn't in use
 
-  fsid_fd = ::open(fn, O_RDWR, 0644);
+  fsid_fd = ::open(fn, O_RDWR|O_CLOEXEC, 0644);
   if (fsid_fd < 0)
     return 0;   // no fsid, ok.
   bool inuse = lock_fsid() < 0;
@@ -1173,7 +1173,7 @@ bool FileStore::is_rotational()
   if (backend) {
     rotational = backend->is_rotational();
   } else {
-    int fd = ::open(basedir.c_str(), O_RDONLY);
+    int fd = ::open(basedir.c_str(), O_RDONLY|O_CLOEXEC);
     if (fd < 0)
       return true;
     struct statfs st;
@@ -1197,7 +1197,7 @@ bool FileStore::is_journal_rotational()
   if (backend) {
     journal_rotational = backend->is_journal_rotational();
   } else {
-    int fd = ::open(journalpath.c_str(), O_RDONLY);
+    int fd = ::open(journalpath.c_str(), O_RDONLY|O_CLOEXEC);
     if (fd < 0)
       return true;
     struct statfs st;
@@ -1259,7 +1259,7 @@ int FileStore::_detect_fs()
   int x = rand();
   int y = x+1;
   snprintf(fn, sizeof(fn), "%s/xattr_test", basedir.c_str());
-  int tmpfd = ::open(fn, O_CREAT|O_WRONLY|O_TRUNC, 0700);
+  int tmpfd = ::open(fn, O_CREAT|O_WRONLY|O_TRUNC|O_CLOEXEC, 0700);
   if (tmpfd < 0) {
     int ret = -errno;
     derr << __FUNC__ << ": unable to create " << fn << ": " << cpp_strerror(ret) << dendl;
@@ -1436,7 +1436,7 @@ int FileStore::upgrade()
 
 int FileStore::read_op_seq(uint64_t *seq)
 {
-  int op_fd = ::open(current_op_seq_fn.c_str(), O_CREAT|O_RDWR, 0644);
+  int op_fd = ::open(current_op_seq_fn.c_str(), O_CREAT|O_RDWR|O_CLOEXEC, 0644);
   if (op_fd < 0) {
     int r = -errno;
     ceph_assert(!m_filestore_fail_eio || r != -EIO);
@@ -1492,7 +1492,7 @@ int FileStore::mount()
 
   // get fsid
   snprintf(buf, sizeof(buf), "%s/fsid", basedir.c_str());
-  fsid_fd = ::open(buf, O_RDWR, 0644);
+  fsid_fd = ::open(buf, O_RDWR|O_CLOEXEC, 0644);
   if (fsid_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": error opening '" << buf << "': "
@@ -1555,7 +1555,7 @@ int FileStore::mount()
   }
 
   // open some dir handles
-  basedir_fd = ::open(basedir.c_str(), O_RDONLY);
+  basedir_fd = ::open(basedir.c_str(), O_RDONLY|O_CLOEXEC);
   if (basedir_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": failed to open " << basedir << ": "
@@ -1665,7 +1665,7 @@ int FileStore::mount()
   }
   initial_op_seq = 0;
 
-  current_fd = ::open(current_fn.c_str(), O_RDONLY);
+  current_fd = ::open(current_fn.c_str(), O_RDONLY|O_CLOEXEC);
   if (current_fd < 0) {
     ret = -errno;
     derr << __FUNC__ << ": error opening: " << current_fn << ": " << cpp_strerror(ret) << dendl;
@@ -1716,7 +1716,7 @@ int FileStore::mount()
   } else {
     int omap_fsid_fd;
     // if osd_uuid exists, compares osd_uuid with fsid
-    omap_fsid_fd = ::open(omap_fsid_buf, O_RDONLY, 0644);
+    omap_fsid_fd = ::open(omap_fsid_buf, O_RDONLY|O_CLOEXEC, 0644);
     if (omap_fsid_fd < 0) {
         ret = -errno;
         derr << __FUNC__ << ": error opening '" << omap_fsid_buf << "': "
@@ -2442,7 +2442,7 @@ void FileStore::_set_global_replay_guard(const coll_t& cid,
 
   char fn[PATH_MAX];
   get_cdir(cid, fn, sizeof(fn));
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     int err = errno;
     derr << __FUNC__ << ": " << cid << " error " << cpp_strerror(err) << dendl;
@@ -2476,7 +2476,7 @@ int FileStore::_check_global_replay_guard(const coll_t& cid,
 {
   char fn[PATH_MAX];
   get_cdir(cid, fn, sizeof(fn));
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     dout(10) << __FUNC__ << ": " << cid << " dne" << dendl;
     return 1;  // if collection does not exist, there is no guard, and we can replay.
@@ -2508,7 +2508,7 @@ void FileStore::_set_replay_guard(const coll_t& cid,
 {
   char fn[PATH_MAX];
   get_cdir(cid, fn, sizeof(fn));
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     int err = errno;
     derr << __FUNC__ << ": " << cid << " error " << cpp_strerror(err) << dendl;
@@ -2567,7 +2567,7 @@ void FileStore::_close_replay_guard(const coll_t& cid,
 {
   char fn[PATH_MAX];
   get_cdir(cid, fn, sizeof(fn));
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     int err = errno;
     derr << __FUNC__ << ": " << cid << " error " << cpp_strerror(err) << dendl;
@@ -2640,7 +2640,7 @@ int FileStore::_check_replay_guard(const coll_t& cid, const SequencerPosition& s
 
   char fn[PATH_MAX];
   get_cdir(cid, fn, sizeof(fn));
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     dout(10) << __FUNC__ << ": " << cid << " dne" << dendl;
     return 1;  // if collection does not exist, there is no guard, and we can replay.
@@ -3869,10 +3869,10 @@ int FileStore::_do_copy_range(int from, int to, uint64_t srcoff, uint64_t len, u
 #ifdef CEPH_HAVE_SPLICE
   if (backend->has_splice()) {
     int pipefd[2];
-    if (pipe(pipefd) < 0) {
-      r = -errno;
-      derr << " pipe " << " got " << cpp_strerror(r) << dendl;
-      return r;
+    if (pipe_cloexec(pipefd) < 0) {
+      int e = errno;
+      derr << " pipe " << " got " << cpp_strerror(e) << dendl;
+      return -e;
     }
 
     loff_t dstpos = dstoff;
@@ -5002,7 +5002,7 @@ int FileStore::_collection_set_bits(const coll_t& c, int bits)
   char n[PATH_MAX];
   int r;
   int32_t v = bits;
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     r = -errno;
     goto out;
@@ -5023,7 +5023,7 @@ int FileStore::collection_bits(CollectionHandle& ch)
   int r;
   char n[PATH_MAX];
   int32_t bits;
-  int fd = ::open(fn, O_RDONLY);
+  int fd = ::open(fn, O_RDONLY|O_CLOEXEC);
   if (fd < 0) {
     bits = r = -errno;
     goto out;
index 7f3e9b23188e775b3c182cba4adb1e8230fe882f..6ecc3e7d9853ed819d57bfa030f508ffddc4a0ec 100644 (file)
@@ -70,7 +70,7 @@ GenericFileStoreBackend::GenericFileStoreBackend(FileStore *fs):
   {
     // NOTE: the below won't work on btrfs; we'll assume rotational.
     string fn = get_basedir_path();
-    int fd = ::open(fn.c_str(), O_RDONLY);
+    int fd = ::open(fn.c_str(), O_RDONLY|O_CLOEXEC);
     if (fd < 0) {
       return;
     }
@@ -91,7 +91,7 @@ GenericFileStoreBackend::GenericFileStoreBackend(FileStore *fs):
   {
     // NOTE: the below won't work on btrfs; we'll assume rotational.
     string fn = get_journal_path();
-    int fd = ::open(fn.c_str(), O_RDONLY);
+    int fd = ::open(fn.c_str(), O_RDONLY|O_CLOEXEC);
     if (fd < 0) {
       return;
     }
@@ -115,7 +115,7 @@ int GenericFileStoreBackend::detect_features()
   char fn[PATH_MAX];
   snprintf(fn, sizeof(fn), "%s/fiemap_test", get_basedir_path().c_str());
 
-  int fd = ::open(fn, O_CREAT|O_RDWR|O_TRUNC, 0644);
+  int fd = ::open(fn, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC, 0644);
   if (fd < 0) {
     fd = -errno;
     derr << "detect_features: unable to create " << fn << ": " << cpp_strerror(fd) << dendl;
@@ -218,9 +218,10 @@ int GenericFileStoreBackend::detect_features()
     int pipefd[2];
     loff_t off_in = 0;
     int r;
-    if ((r = pipe(pipefd)) < 0)
-      dout(0) << "detect_features: splice  pipe met error " << cpp_strerror(errno) << dendl;
-    else {
+    if (pipe_cloexec(pipefd) < 0) {
+      int e = errno;
+      dout(0) << "detect_features: splice pipe met error " << cpp_strerror(e) << dendl;
+    } else {
       lseek(fd, 0, SEEK_SET);
       r = splice(fd, &off_in, pipefd[1], NULL, 10, 0);
       if (!(r < 0 && errno == EINVAL)) {
index 9dfebeb951c3c214ecad21242eb29c696c696d20..a35577877d0c48dad1d20d22b8f9276cebbb13f5 100644 (file)
@@ -169,7 +169,7 @@ int LFNIndex::collection_list_partial(const ghobject_t &start,
 int LFNIndex::fsync_dir(const vector<string> &path)
 {
   maybe_inject_failure();
-  int fd = ::open(get_full_path_subdir(path).c_str(), O_RDONLY);
+  int fd = ::open(get_full_path_subdir(path).c_str(), O_RDONLY|O_CLOEXEC);
   if (fd < 0)
     return -errno;
   FDCloser f(fd);
@@ -897,7 +897,7 @@ int LFNIndex::lfn_unlink(const vector<string> &path,
     }
   }
   string full_path = get_full_path(path, mangled_name);
-  int fd = ::open(full_path.c_str(), O_RDONLY);
+  int fd = ::open(full_path.c_str(), O_RDONLY|O_CLOEXEC);
   if (fd < 0)
     return -errno;
   FDCloser f(fd);
index 3cf63e4e9c45b4187015798e48d79ba3900efe17..3cb8e4a02584941792d72408768727d59466e7be 100644 (file)
@@ -693,7 +693,7 @@ void KStore::_shutdown_logger()
 int KStore::_open_path()
 {
   ceph_assert(path_fd < 0);
-  path_fd = ::open(path.c_str(), O_DIRECTORY);
+  path_fd = ::open(path.c_str(), O_DIRECTORY|O_CLOEXEC);
   if (path_fd < 0) {
     int r = -errno;
     derr << __func__ << " unable to open " << path << ": " << cpp_strerror(r)
index e467093a8b09e3801272384c71dd3bab457a9c3a..f1b346d0bd45902ee65df7e91aa1ad30b917244e 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "include/compat.h"
+#include "common/errno.h"
 
 #include <boost/utility/string_ref.hpp>
 
@@ -1043,21 +1044,19 @@ int RGWHTTPManager::set_request_state(RGWHTTPClient *client, RGWHTTPRequestSetSt
 
 int RGWHTTPManager::start()
 {
-  int r = pipe(thread_pipe);
-  if (r < 0) {
-    r = -errno;
-    ldout(cct, 0) << "ERROR: pipe() returned errno=" << r << dendl;
-    return r;
+  if (pipe_cloexec(thread_pipe) < 0) {
+    int e = errno;
+    ldout(cct, 0) << "ERROR: pipe(): " << cpp_strerror(e) << dendl;
+    return -e;
   }
 
   // enable non-blocking reads
-  r = ::fcntl(thread_pipe[0], F_SETFL, O_NONBLOCK);
-  if (r < 0) {
-    r = -errno;
-    ldout(cct, 0) << "ERROR: fcntl() returned errno=" << r << dendl;
+  if (::fcntl(thread_pipe[0], F_SETFL, O_NONBLOCK) < 0) {
+    int e = errno;
+    ldout(cct, 0) << "ERROR: fcntl(): " << cpp_strerror(e) << dendl;
     TEMP_FAILURE_RETRY(::close(thread_pipe[0]));
     TEMP_FAILURE_RETRY(::close(thread_pipe[1]));
-    return r;
+    return -e;
   }
 
 #ifdef HAVE_CURL_MULTI_WAIT
index 80435b3c228dbf855d762f4a44952ad52e1024ca..bef64f6d34f5edb6c574e363fab1f4b72134053c 100644 (file)
@@ -7,6 +7,7 @@
 #include <time.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <random>
 #include <thread>
 #include "global/global_init.h"
 #include "common/ceph_argparse.h"
@@ -33,8 +34,8 @@ string get_temp_bdev(uint64_t size)
 std::unique_ptr<char[]> gen_buffer(uint64_t size)
 {
     std::unique_ptr<char[]> buffer = std::make_unique<char[]>(size);
-    boost::random::random_device rand;
-    rand.generate(buffer.get(), buffer.get() + size);
+    std::independent_bits_engine<std::default_random_engine, CHAR_BIT, unsigned char> e;
+    std::generate(buffer.get(), buffer.get()+size, std::ref(e));
     return buffer;
 }