summarylogtreecommitdiffstats
path: root/016-VBoxServiceAutoMount-Change-Linux-mount-code-to-use-.patch
blob: 6a15a333788e6c13397edb63b3bf659fa1fe4fb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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	2019-04-16 11:09:11.000000000 +0100
+++ ./src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp	2019-04-26 17:10:47.178485356 +0100
@@ -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>
@@ -114,6 +115,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                                                                                                      *
@@ -400,13 +399,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,
@@ -423,35 +422,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.cMaxIoPages = Opts.cMaxIoPages;
-        mntinf.szTag[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);
@@ -484,34 +459,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
@@ -530,7 +477,6 @@ static int vbsvcAutoMountSharedFolderOld
                         rc = RTErrConvertFromErrno(errno);
                         break;
                 }
-            }
         }
 # endif
     }
@@ -1464,51 +1410,21 @@ static int vbsvcAutomounterMountIt(PVBSV
     }
 
 #  if defined(RT_OS_LINUX)
-    /*
-     * Linux a bit more work...
-     */
-    struct vbsf_mount_info_new MntInfo;
-    RT_ZERO(MntInfo);
-    struct vbsf_mount_opts MntOpts;
-    RT_ZERO(MntOpts);
-    MntInfo.nullchar     = '\0';
-    MntInfo.signature[0] = VBSF_MOUNT_SIGNATURE_BYTE_0;
-    MntInfo.signature[1] = VBSF_MOUNT_SIGNATURE_BYTE_1;
-    MntInfo.signature[2] = VBSF_MOUNT_SIGNATURE_BYTE_2;
-    MntInfo.length       = sizeof(MntInfo);
-    MntInfo.ttl          = MntOpts.ttl              = -1 /*default*/;
-    MntInfo.msDirCacheTTL= MntOpts.msDirCacheTTL    = -1 /*default*/;
-    MntInfo.msInodeTTL   = MntOpts.msInodeTTL       = -1 /*default*/;
-    MntInfo.cMaxIoPages  = MntOpts.cMaxIoPages      = 0 /*default*/;
-    MntInfo.cbDirBuf     = MntOpts.cbDirBuf         = 0 /*default*/;
-    MntInfo.enmCacheMode = MntOpts.enmCacheMode     = kVbsfCacheMode_Default;
-    MntInfo.uid          = MntOpts.uid   = 0;
-    MntInfo.gid          = MntOpts.gid   = gidMount;
-    MntInfo.dmode        = MntOpts.dmode = 0770;
-    MntInfo.fmode        = MntOpts.fmode = 0770;
-    MntInfo.dmask        = MntOpts.dmask = 0000;
-    MntInfo.fmask        = MntOpts.fmask = 0000;
-    memcpy(MntInfo.szTag, g_szTag, sizeof(g_szTag)); AssertCompile(sizeof(MntInfo.szTag) >= sizeof(g_szTag));
-    rc = RTStrCopy(MntInfo.name, sizeof(MntInfo.name), pEntry->pszName);
-    if (RT_FAILURE(rc))
+    unsigned long fFlags = MS_NODEV;
+    char szOpts[MAX_MNTOPT_STR] = { '\0', };
+    ssize_t cchOpts = RTStrPrintf2(szOpts, sizeof(szOpts),
+                                   "uid=0,gid=%d,dmode=0770,fmode=0770,dmask=0000,fmask=0000", gidMount);
+    if (cchOpts <= 0)
     {
-        VGSvcError("vbsvcAutomounterMountIt: Share name '%s' is too long for the MntInfo.name field!\n", pEntry->pszName);
-        return rc;
+        VGSvcError("vbsvcAutomounterMountIt: szOpts overflow! %zd\n", cchOpts);
+        return VERR_BUFFER_OVERFLOW;
     }
 
-    errno = 0;
-    unsigned long fFlags = MS_NODEV;
-    rc = mount(pEntry->pszName, pEntry->pszActualMountPoint, "vboxsf", fFlags, &MntInfo);
+    rc = mount(pEntry->pszName, pEntry->pszActualMountPoint, "vboxsf", fFlags, szOpts);
     if (rc == 0)
     {
         VGSvcVerbose(0, "vbsvcAutomounterMountIt: Successfully mounted '%s' on '%s'\n",
                      pEntry->pszName, pEntry->pszActualMountPoint);
-
-        errno = 0;
-        rc = vbsfmount_complete(pEntry->pszName, pEntry->pszActualMountPoint, fFlags, &MntOpts);
-        if (rc != 0) /* Ignorable. /etc/mtab is probably a link to /proc/mounts. */
-            VGSvcVerbose(1, "vbsvcAutomounterMountIt: vbsfmount_complete failed: %s (%d/%d)\n",
-                         rc == 1 ? "open_memstream" : rc == 2 ? "setmntent" : rc == 3 ? "addmntent" : "unknown", rc, errno);
         return VINF_SUCCESS;
     }
     else if (errno == EINVAL)