From 369dd2ee3c82c4417fee04aeec933c74fd198e78 Mon Sep 17 00:00:00 2001 From: Hans de Goede 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 --- .../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 #include #include +#include #include #include #include @@ -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 } @@ -1417,45 +1417,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.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.tag, g_szTag, sizeof(g_szTag)); AssertCompile(sizeof(MntInfo.tag) >= 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) -- 2.14.3