VirtualBox

Ignore:
Timestamp:
Jun 25, 2024 10:28:21 AM (8 months ago)
Author:
vboxsync
Message:

doc/manual,include/VBox,Frontends/VBoxManage,HostServices/SharedFolders,
Main/{include,SharedFolder,Console,Machine,VirtualBox.xidl}: Add a
new attribute to ISharedFolder for specifying a symbolic link creation
policy to restrict the source pathname when creating symbolic links
within a guest. The symbolic link policies are represented by a new
enumeration of type SymlinkPolicy_T which includes values for no
restrictions ('any'), symlink sources only within the subtree of the
share ('subtree'), symlink sources as any relative path ('relative'),
and no symlinks allowed ('forbidden'). The symlink policy can only be
applied to permanent shared folders at this stage. bugref:10619

Location:
trunk/src/VBox/HostServices/SharedFolders/testcase
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedFolders/testcase/Makefile.kmk

    r98415 r105016  
    6969 tstSharedFolderService_DEFS    = VBOX_WITH_HGCM UNITTEST
    7070 tstSharedFolderService_INCS    = ..
     71 ifneq ($(KBUILD_TARGET),win)
     72  tstSharedFolderService_DEFS  += VBOX_WITH_XPCOM
     73  tstSharedFolderService_INCS  += $(VBOX_XPCOM_INCS)
     74 endif
     75 tstSharedFolderService_INCS.win += $(VBOX_PATH_SDK)/bindings/mscom/include
    7176 tstSharedFolderService_SOURCES = \
    7277        tstSharedFolderService.cpp \
  • trunk/src/VBox/HostServices/SharedFolders/testcase/tstSharedFolderService.cpp

    r104560 r105016  
    587587}
    588588
     589extern int testRTSymlinkCreate(const char *pszSymlink, const char *pszTarget, RTSYMLINKTYPE enmType, uint32_t fCreate)
     590{
     591    if (g_fFailIfNotLowercase && !RTStrIsLowerCased(strpbrk(pszSymlink, "/\\")))
     592        return VERR_FILE_NOT_FOUND;
     593    RT_NOREF4(pszSymlink, pszTarget, enmType, fCreate);
     594    return 0;
     595}
     596
    589597
    590598/*********************************************************************************************************************************
     
    678686}
    679687
     688static void fillTestShflStringUtf8(union TESTSHFLSTRING *pDest,
     689                                   const char *pcszSource)
     690{
     691    const size_t cchSource = strlen(pcszSource);
     692    AssertRelease(  cchSource * 2 + 2
     693                  < sizeof(*pDest) - RT_UOFFSETOF(SHFLSTRING, String));
     694    pDest->string.u16Length = (uint16_t)cchSource;
     695    pDest->string.u16Size   = pDest->string.u16Length + 1;
     696    memcpy(pDest->string.String.utf8, pcszSource, pDest->string.u16Size);
     697}
     698
    680699static SHFLROOT initWithWritableMapping(RTTEST hTest,
    681700                                        VBOXHGCMSVCFNTABLE *psvcTable,
     
    683702                                        const char *pcszFolderName,
    684703                                        const char *pcszMapping,
    685                                         bool fCaseSensitive = true)
     704                                        bool fCaseSensitive = true,
     705                                        SymlinkPolicy_T enmSymlinkPolicy = SymlinkPolicy_AllowedToAnyTarget)
    686706{
    687707    VBOXHGCMSVCPARM aParms[RT_MAX(SHFL_CPARMS_ADD_MAPPING,
     
    706726    HGCMSvcSetPv(&aParms[1], &Mapping,   RT_UOFFSETOF(SHFLSTRING, String)
    707727                                   + Mapping.string.u16Size);
    708     HGCMSvcSetU32(&aParms[2], 1);
     728    HGCMSvcSetU32(&aParms[2], SHFL_ADD_MAPPING_F_WRITABLE | SHFL_ADD_MAPPING_F_CREATE_SYMLINKS);
    709729    HGCMSvcSetPv(&aParms[3], &AutoMountPoint, SHFLSTRING_HEADER_SIZE + AutoMountPoint.string.u16Size);
     730    HGCMSvcSetU32(&aParms[4], enmSymlinkPolicy);
    710731    rc = psvcTable->pfnHostCall(psvcTable->pvService, SHFL_FN_ADD_MAPPING,
    711732                                SHFL_CPARMS_ADD_MAPPING, aParms);
     
    774795        *pResult = CreateParms.Result;
    775796    return VINF_SUCCESS;
     797}
     798
     799static int createSymlink(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT Root,
     800                         const char *pcszSourcePath, const char *pcszSymlinkPath)
     801{
     802    VBOXHGCMSVCPARM aParms[SHFL_CPARMS_SYMLINK];
     803    union TESTSHFLSTRING sourcePath;
     804    union TESTSHFLSTRING symlinkPath;
     805    SHFLFSOBJINFO ObjInfo;
     806    VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
     807
     808    /* vbsfSymlink() only supports UTF-8 */
     809    fillTestShflStringUtf8(&sourcePath, pcszSourcePath);
     810    fillTestShflStringUtf8(&symlinkPath, pcszSymlinkPath);
     811    psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
     812                       psvcTable->pvService, SHFL_FN_SET_UTF8,
     813                       RT_ELEMENTS(aParms), aParms, 0);
     814
     815    RT_ZERO(ObjInfo);
     816    HGCMSvcSetU32(&aParms[0], Root);
     817    HGCMSvcSetPv(&aParms[1], &symlinkPath,  RT_UOFFSETOF(SHFLSTRING, String)
     818                                + symlinkPath.string.u16Size);
     819    HGCMSvcSetPv(&aParms[2], &sourcePath,   RT_UOFFSETOF(SHFLSTRING, String)
     820                                + sourcePath.string.u16Size);
     821    HGCMSvcSetPv(&aParms[3], &ObjInfo, sizeof(ObjInfo));
     822    psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
     823                       psvcTable->pvService, SHFL_FN_SYMLINK,
     824                       RT_ELEMENTS(aParms), aParms, 0);
     825    return callHandle.rc;
    776826}
    777827
     
    10061056}
    10071057
     1058static int testSymlinkCreationForSpecificPolicy(RTTEST hTest, SymlinkPolicy_T enmSymlinkPolicy)
     1059{
     1060    VBOXHGCMSVCFNTABLE  svcTable;
     1061    VBOXHGCMSVCHELPERS  svcHelpers;
     1062    SHFLROOT Root;
     1063    const RTFILE hFile = (RTFILE) 0x10000;
     1064    SHFLCREATERESULT Result;
     1065    int rc;
     1066
     1067    Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
     1068                                   "/test/mapping", "testname",
     1069                                   true, enmSymlinkPolicy);
     1070    g_testRTFileOpen_hFile = hFile;
     1071    rc = createFile(&svcTable, Root, "file", SHFL_CF_ACCESS_READ, NULL, &Result);
     1072    RTTEST_CHECK_RC_OK(hTest, rc);
     1073    RTTEST_CHECK_MSG(hTest,
     1074                     !strcmp(&g_testRTFileOpen_szName[RTPATH_STYLE == RTPATH_STR_F_STYLE_DOS ? 2 : 0],
     1075                             "/test/mapping/file"),
     1076                     (hTest, "pszFilename=%s\n", &g_testRTFileOpen_szName[RTPATH_STYLE == RTPATH_STR_F_STYLE_DOS ? 2 : 0]));
     1077    RTTEST_CHECK_MSG(hTest, g_testRTFileOpen_fOpen == 0x181,
     1078                     (hTest, "fOpen=%llu\n", LLUIFY(g_testRTFileOpen_fOpen)));
     1079    RTTEST_CHECK_MSG(hTest, Result == SHFL_FILE_CREATED,
     1080                     (hTest, "Result=%d\n", (int)Result));
     1081
     1082    /* regular symlink creation should succeed unless no symlinks allowed */
     1083    rc = createSymlink(&svcTable, Root, "file", "symlink");
     1084    if (enmSymlinkPolicy == SymlinkPolicy_Forbidden)
     1085        RTTEST_CHECK_MSG(hTest, rc == VERR_WRITE_PROTECT,
     1086                         (hTest, "enmSymlinkPolicy=SymlinkPolicy_Forbidden 'ln -s file symlink' failed: rc=%Rrc\n", rc));
     1087    else
     1088        RTTEST_CHECK_RC_OK(hTest, rc);
     1089
     1090    /* absolute path to symlink sources only allowed for the 'any' policy */
     1091    rc = createSymlink(&svcTable, Root, "/path/to/file", "abs-symlink");
     1092    if (enmSymlinkPolicy == SymlinkPolicy_AllowedToAnyTarget)
     1093        RTTEST_CHECK_RC_OK(hTest, rc);
     1094    else
     1095        RTTEST_CHECK_MSG(hTest, rc == VERR_WRITE_PROTECT,
     1096                         (hTest, "enmSymlinkPolicy=%d 'ln -s file /absolute/path/symlink' failed: rc=%Rrc\n",
     1097                         enmSymlinkPolicy, rc));
     1098
     1099    /* relative path symlink sources with '..' components allowed only with 'relative' policy */
     1100    rc = createSymlink(&svcTable, Root, "./directory/../file", "rel-symlink");
     1101    if (   enmSymlinkPolicy == SymlinkPolicy_Forbidden
     1102        || enmSymlinkPolicy == SymlinkPolicy_AllowedInShareSubtree)
     1103        RTTEST_CHECK_MSG(hTest, rc == VERR_WRITE_PROTECT,
     1104                         (hTest, "enmSymlinkPolicy=%d 'ln -s ./path/../symlink' failed: rc=%Rrc\n",
     1105                         enmSymlinkPolicy, rc));
     1106    else
     1107        RTTEST_CHECK_RC_OK(hTest, rc);
     1108
     1109    /* relative path symlink source with no '..' components always OK */
     1110    rc = createSymlink(&svcTable, Root, "./directory/file", "dotslash-symlink");
     1111    if (enmSymlinkPolicy == SymlinkPolicy_Forbidden)
     1112        RTTEST_CHECK_MSG(hTest, rc == VERR_WRITE_PROTECT,
     1113                         (hTest, "enmSymlinkPolicy=%d 'ln -s ./path/../symlink' failed: rc=%Rrc\n",
     1114                         enmSymlinkPolicy, rc));
     1115    else
     1116        RTTEST_CHECK_RC_OK(hTest, rc);
     1117
     1118    unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
     1119    rc = svcTable.pfnDisconnect(NULL, 0, svcTable.pvService);
     1120    AssertReleaseRC(rc);
     1121    rc = svcTable.pfnUnload(NULL);
     1122    AssertReleaseRC(rc);
     1123    RTTestGuardedFree(hTest, svcTable.pvService);
     1124    RTTEST_CHECK_MSG(hTest, g_testRTFileClose_hFile == hFile,
     1125                     (hTest, "File=%u\n", (uintptr_t)g_testRTFileClose_hFile));
     1126
     1127    return rc;
     1128}
     1129
     1130void testSymlinkCreation(RTTEST hTest)
     1131{
     1132    SymlinkPolicy_T aEnmSymlinkPolicy[4] = {
     1133        SymlinkPolicy_AllowedToAnyTarget,
     1134        SymlinkPolicy_AllowedInShareSubtree,
     1135        SymlinkPolicy_AllowedToRelativeTargets,
     1136        SymlinkPolicy_Forbidden
     1137    };
     1138
     1139    RTTestSub(hTest, "Create variety of symlinks with different symlink policies");
     1140    for (size_t i = 0; i < RT_ELEMENTS(aEnmSymlinkPolicy); i++)
     1141        testSymlinkCreationForSpecificPolicy(hTest, aEnmSymlinkPolicy[i]);
     1142}
     1143
    10081144void testReadFileSimple(RTTEST hTest)
    10091145{
  • trunk/src/VBox/HostServices/SharedFolders/testcase/tstSharedFolderService.h

    r98103 r105016  
    123123/* Sub-tests for testSymlink(). */
    124124void testSymlinkBadParameters(RTTEST hTest);
     125void testSymlinkCreation(RTTEST hTest);
    125126
    126127void testMappingsAdd(RTTEST hTest);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette