]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Fusion does not need to fork on certain file opens anymore.
authorJohn Wolfe <jwolfe@vmware.com>
Tue, 4 May 2021 02:39:40 +0000 (19:39 -0700)
committerJohn Wolfe <jwolfe@vmware.com>
Tue, 4 May 2021 02:39:40 +0000 (19:39 -0700)
An NFS issue in MacOS 10.4 was worked around by forking and
sending credentials to the child.  Removing the work-around
since it is no longer needed.

open-vm-tools/lib/file/fileIOPosix.c

index 30f01c21bd1438396f470c6d0c7a08182b9f12b1..6752726078df7c47b4c1f583ad58681f370fe8e1 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************
- * Copyright (C) 1998-2019 VMware, Inc. All rights reserved.
+ * Copyright (C) 1998-2021 VMware, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published
@@ -454,329 +454,6 @@ FileIO_CreateFDPosix(int posix,  // IN: UNIX file descriptor
 
 
 #if defined(__APPLE__)
-/*
- *----------------------------------------------------------------------
- *
- * ProxySendResults --
- *
- *      Send the results of a open from the proxy.
- *
- * Results:
- *     None.
- *
- * Side effects:
- *     None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ProxySendResults(int sock_fd,     // IN:
-                 int send_fd,     // IN:
-                 int send_errno)  // IN:
-{
-   struct iovec iov;
-   struct msghdr msg;
-   char cmsgBuf[CMSG_SPACE(sizeof send_fd)];
-
-   iov.iov_base = &send_errno;
-   iov.iov_len = sizeof send_errno;
-
-   if (send_fd == -1) {
-      msg.msg_control = NULL;
-      msg.msg_controllen = 0;
-   } else {
-      struct cmsghdr *cmsg;
-
-      msg.msg_control = cmsgBuf;
-      msg.msg_controllen = sizeof cmsgBuf;
-
-      cmsg = CMSG_FIRSTHDR(&msg);
-
-      cmsg->cmsg_level = SOL_SOCKET;
-      cmsg->cmsg_len = CMSG_LEN(sizeof send_fd);
-      cmsg->cmsg_type = SCM_RIGHTS;
-
-      (*(int *) CMSG_DATA(cmsg)) = send_fd;
-
-      msg.msg_controllen = cmsg->cmsg_len;
-   }
-
-   msg.msg_name = NULL;
-   msg.msg_namelen = 0;
-   msg.msg_iov = &iov;
-   msg.msg_iovlen = 1;
-   msg.msg_flags = 0;
-
-   sendmsg(sock_fd, &msg, 0);
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * ProxyReceiveResults --
- *
- *      Receive the results of an open from the proxy.
- *
- * Results:
- *      None
- *
- * Side effects:
- *      None
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ProxyReceiveResults(int sock_fd,      // IN:
-                    int *recv_fd,     // OUT:
-                    int *recv_errno)  // OUT:
-{
-   int err;
-   struct iovec iov;
-   struct msghdr msg;
-   uint8_t cmsgBuf[CMSG_SPACE(sizeof(int))];
-
-   iov.iov_base = recv_errno;
-   iov.iov_len = sizeof *recv_errno;
-
-   msg.msg_control = cmsgBuf;
-   msg.msg_controllen = sizeof cmsgBuf;
-   msg.msg_name = NULL;
-   msg.msg_namelen = 0;
-   msg.msg_iov = &iov;
-   msg.msg_iovlen = 1;
-
-   err = recvmsg(sock_fd, &msg, 0);
-
-   if (err <= 0) {
-      *recv_fd = -1;
-      *recv_errno = (err == 0) ? EIO : errno;
-
-      return;
-   }
-
-   if (msg.msg_controllen == 0) {
-      *recv_fd = -1;
-   } else {
-      struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
-
-      if ((cmsg->cmsg_level == SOL_SOCKET) &&
-          (cmsg->cmsg_type == SCM_RIGHTS)) {
-         *recv_fd = *((int *) CMSG_DATA(cmsg));
-      } else {
-         *recv_fd = -1;
-         *recv_errno = EIO;
-      }
-   }
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * ProxyOpen --
- *
- *      Open a file via a proxy.
- *
- * Results:
- *      -1 on error
- *      >= 0 on success
- *
- * Side effects:
- *      errno is set on error
- *
- *----------------------------------------------------------------------
- */
-
-static int
-ProxyOpen(const char *pathName,  // IN:
-          int flags,             // IN:
-          int mode)              // IN:
-{
-   int err;
-   pid_t pid;
-   int fds[2];
-   int proxyFD;
-
-   int saveErrno = 0;
-
-   if (pathName == NULL) {
-      errno = EFAULT;
-      return -1;
-   }
-
-   err = socketpair(AF_UNIX, SOCK_DGRAM, 0, fds);
-   if (err == -1) {
-      errno = ENOMEM; // Out of resources...
-      return err;
-   }
-
-   pid = fork();
-   if (pid == -1) {
-      proxyFD = -1;
-      saveErrno = ENOMEM; // Out of resources...
-      goto bail;
-   }
-
-   if (pid == 0) { /* child:  use fd[0] */
-      proxyFD = Posix_Open(pathName, flags, mode);
-
-      ProxySendResults(fds[0], proxyFD, errno);
-
-      _exit(0);
-   } else {        /* parent: use fd[1] */
-      ProxyReceiveResults(fds[1], &proxyFD, &saveErrno);
-
-      waitpid(pid, &err, 0);
-   }
-
-bail:
-
-   close(fds[0]);
-   close(fds[1]);
-
-   errno = saveErrno;
-
-   return proxyFD;
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * ProxyUse --
- *
- *      Determine is the open proxy is to be used.
- *
- * Results:
- *     0       Success, useProxy is set
- *     > 0     Failure (errno value); useProxy is undefined
- *
- * Side effects:
- *     None
- *
- *----------------------------------------------------------------------
- */
-
-static int
-ProxyUse(const char *pathName,  // IN:
-         Bool *useProxy)        // IN:
-{
-   char *path;
-   UnicodeIndex index;
-   struct statfs sfbuf;
-   struct stat statbuf;
-
-   if (pathName == NULL) {
-      errno = EFAULT;
-      return -1;
-   }
-
-   if ((Posix_Lstat(pathName, &statbuf) == 0) &&
-       S_ISLNK(statbuf.st_mode)) {
-      *useProxy = TRUE;
-
-      return 0;
-   }
-
-   /*
-    * Construct the path to the directory that contains the filePath.
-    */
-
-   index = Unicode_FindLast(pathName, "/");
-
-   if (index == UNICODE_INDEX_NOT_FOUND) {
-      path = Unicode_Duplicate(".");
-   } else {
-      char *temp;
-
-      temp = Unicode_Substr(pathName, 0, index + 1);
-      path = Unicode_Append(temp, ".");
-      Posix_Free(temp);
-   }
-
-   /*
-    * Attempt to obtain information about the testPath (directory
-    * containing filePath).
-    */
-
-   if (Posix_Statfs(path, &sfbuf) == 0) {
-      /*
-       * The testPath exists; determine proxy usage explicitely.
-       */
-
-      *useProxy = strcmp(sfbuf.f_fstypename, "nfs") == 0 ?  TRUE : FALSE;
-   } else {
-      /*
-       * A statfs error of some sort; Err on the side of caution.
-       */
-
-      *useProxy = TRUE;
-   }
-
-   Posix_Free(path);
-
-   return 0;
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * PosixFileOpener --
- *
- *      Open a file. Use a proxy when creating a file or on NFS.
- *
- *      Why a proxy? The Mac OS X 10.4.* NFS client interacts with our
- *      use of settid() and doesn't send the proper credentials on opens.
- *      This leads to files being written without error but containing no
- *      data. The proxy avoids all of this unhappiness.
- *
- * Results:
- *      -1 on error
- *      >= 0 on success
- *
- * Side effects:
- *      errno is set
- *
- *----------------------------------------------------------------------
- */
-
-int
-PosixFileOpener(const char *pathName,  // IN:
-                int flags,             // IN:
-                mode_t mode)           // IN:
-{
-   Bool useProxy;
-
-   if ((flags & O_ACCMODE) || (flags & O_CREAT)) {
-      int err;
-
-      /*
-       * Open for write and/or O_CREAT. Determine proxy usage.
-       */
-
-      err = ProxyUse(pathName, &useProxy);
-      if (err != 0) {
-         errno = err;
-
-         return -1;
-      }
-   } else {
-      /*
-       * No write access, no need for a proxy.
-       */
-
-      useProxy = FALSE;
-   }
-
-   return useProxy ? ProxyOpen(pathName, flags, mode) :
-                     Posix_Open(pathName, flags, mode);
-}
-
-
 /*
  *----------------------------------------------------------------------
  *
@@ -966,7 +643,7 @@ FileIOCreateRetry(FileIODescriptor *file,   // OUT:
          fd = FileIO_PrivilegedPosixOpen(pathName, flags);
       }
    } else {
-      fd = PosixFileOpener(pathName, flags, mode);
+      fd = Posix_Open(pathName, flags, mode);
    }
 #else
    {
@@ -976,7 +653,7 @@ FileIOCreateRetry(FileIODescriptor *file,   // OUT:
          uid = Id_BeginSuperUser();
       }
 
-      fd = PosixFileOpener(pathName, flags, mode);
+      fd = Posix_Open(pathName, flags, mode);
 
       error = errno;
 
@@ -2727,7 +2404,7 @@ FileIO_PrivilegedPosixOpen(const char *pathName,  // IN:
 
 #if defined(__APPLE__)
    if (privilegedOpenerFunc != NULL) {
-      fd = privilegedOpenerFunc(pathName, flags);
+      fd = (*privilegedOpenerFunc)(pathName, flags);
    } else
 #endif
    {