Blob Blame History Raw
From 369dd2ee3c82c4417fee04aeec933c74fd198e78 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 23 Jan 2018 15:09:20 +0100
Subject: [PATCH resend] VBoxServiceAutoMount: Change Linux mount code to use
 an options string

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 .../common/VBoxService/VBoxServiceAutoMount.cpp    | 62 +++-------------------
 1 file changed, 8 insertions(+), 54 deletions(-)

diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp
--- ./src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp.orig	2018-11-25 02:36:31.829306539 +0000
+++ ./src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp	2018-11-25 02:41:41.632973288 +0000
@@ -40,6 +40,7 @@
 #include <iprt/ctype.h>
 #include <iprt/dir.h>
 #include <iprt/mem.h>
+#include <iprt/param.h>
 #include <iprt/path.h>
 #include <iprt/semaphore.h>
 #include <iprt/sort.h>
@@ -117,6 +118,9 @@ RT_C_DECLS_END
 # define VBOXSERVICE_AUTOMOUNT_MIQF             SHFL_MIQF_PATH
 #endif
 
+#ifndef MAX_MNTOPT_STR
+#define MAX_MNTOPT_STR PAGE_SIZE
+#endif
 
 /*********************************************************************************************************************************
 *   Structures and Typedefs                                                                                                      *
@@ -398,13 +402,13 @@ static int vbsvcAutoMountSharedFolderOld
     int rc = vbsvcAutoMountPrepareMountPointOld(pszMountPoint, pszShareName, &Opts);
     if (RT_SUCCESS(rc))
     {
+        char szOptBuf[MAX_MNTOPT_STR] = { '\0', };
+        RTStrPrintf(szOptBuf, sizeof(szOptBuf), "uid=%d,gid=%d,dmode=%0o,fmode=%0o,dmask=%0o,fmask=%0o",
+                    Opts.uid, Opts.gid, Opts.dmode, Opts.fmode, Opts.dmask, Opts.fmask);
 # ifdef RT_OS_SOLARIS
         int fFlags = 0;
         if (Opts.ronly)
             fFlags |= MS_RDONLY;
-        char szOptBuf[MAX_MNTOPT_STR] = { '\0', };
-        RTStrPrintf(szOptBuf, sizeof(szOptBuf), "uid=%d,gid=%d,dmode=%0o,fmode=%0o,dmask=%0o,fmask=%0o",
-                    Opts.uid, Opts.gid, Opts.dmode, Opts.fmode, Opts.dmask, Opts.fmask);
         int r = mount(pszShareName,
                       pszMountPoint,
                       fFlags | MS_OPTIONSTR,
@@ -421,34 +425,11 @@ static int vbsvcAutoMountSharedFolderOld
 
 # else /* RT_OS_LINUX */
         unsigned long fFlags = MS_NODEV;
-
-        /*const char *szOptions = { "rw" }; - ??? */
-        struct vbsf_mount_info_new mntinf;
-        RT_ZERO(mntinf);
-
-        mntinf.nullchar     = '\0';
-        mntinf.signature[0] = VBSF_MOUNT_SIGNATURE_BYTE_0;
-        mntinf.signature[1] = VBSF_MOUNT_SIGNATURE_BYTE_1;
-        mntinf.signature[2] = VBSF_MOUNT_SIGNATURE_BYTE_2;
-        mntinf.length       = sizeof(mntinf);
-
-        mntinf.uid   = Opts.uid;
-        mntinf.gid   = Opts.gid;
-        mntinf.ttl   = Opts.ttl;
-        mntinf.dmode = Opts.dmode;
-        mntinf.fmode = Opts.fmode;
-        mntinf.dmask = Opts.dmask;
-        mntinf.fmask = Opts.fmask;
-        mntinf.tag[0] = '\0';
-
-        strcpy(mntinf.name, pszShareName);
-        strcpy(mntinf.nls_name, "\0");
-
         int r = mount(pszShareName,
                       pszMountPoint,
                       "vboxsf",
                       fFlags,
-                      &mntinf);
+                      szOptBuf);
         if (r == 0)
         {
             VGSvcVerbose(0, "vbsvcAutoMountWorker: Shared folder '%s' was mounted to '%s'\n", pszShareName, pszMountPoint);
@@ -481,34 +462,6 @@ static int vbsvcAutoMountSharedFolderOld
         }
         else /* r == -1, we got some error in errno.  */
         {
-            if (errno == EPROTO)
-            {
-                VGSvcVerbose(3, "vbsvcAutoMountWorker: Messed up share name, re-trying ...\n");
-
-                /** @todo r=bird: What on earth is going on here?????  Why can't you
-                 *        strcpy(mntinf.name, pszShareName) to fix it again? */
-
-                /* Sometimes the mount utility messes up the share name.  Try to
-                 * un-mangle it again. */
-                char szCWD[RTPATH_MAX];
-                size_t cchCWD;
-                if (!getcwd(szCWD, sizeof(szCWD)))
-                {
-                    VGSvcError("vbsvcAutoMountWorker: Failed to get the current working directory\n");
-                    szCWD[0] = '\0';
-                }
-                cchCWD = strlen(szCWD);
-                if (!strncmp(pszMountPoint, szCWD, cchCWD))
-                {
-                    while (pszMountPoint[cchCWD] == '/')
-                        ++cchCWD;
-                    /* We checked before that we have enough space */
-                    strcpy(mntinf.name, pszMountPoint + cchCWD);
-                }
-                r = mount(mntinf.name, pszMountPoint, "vboxsf", fFlags, &mntinf);
-            }
-            if (r == -1) /* Was there some error from one of the tries above? */
-            {
                 switch (errno)
                 {
                     /* If we get EINVAL here, the system already has mounted the Shared Folder to another
@@ -527,7 +480,6 @@ static int vbsvcAutoMountSharedFolderOld
                         rc = RTErrConvertFromErrno(errno);
                         break;
                 }
-            }
         }
 # endif
     }
-- 
2.14.3