Changeset 105016 in vbox for trunk/src/VBox/HostServices/SharedFolders/testcase
- Timestamp:
- Jun 25, 2024 10:28:21 AM (8 months ago)
- Location:
- trunk/src/VBox/HostServices/SharedFolders/testcase
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedFolders/testcase/Makefile.kmk
r98415 r105016 69 69 tstSharedFolderService_DEFS = VBOX_WITH_HGCM UNITTEST 70 70 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 71 76 tstSharedFolderService_SOURCES = \ 72 77 tstSharedFolderService.cpp \ -
trunk/src/VBox/HostServices/SharedFolders/testcase/tstSharedFolderService.cpp
r104560 r105016 587 587 } 588 588 589 extern 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 589 597 590 598 /********************************************************************************************************************************* … … 678 686 } 679 687 688 static 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 680 699 static SHFLROOT initWithWritableMapping(RTTEST hTest, 681 700 VBOXHGCMSVCFNTABLE *psvcTable, … … 683 702 const char *pcszFolderName, 684 703 const char *pcszMapping, 685 bool fCaseSensitive = true) 704 bool fCaseSensitive = true, 705 SymlinkPolicy_T enmSymlinkPolicy = SymlinkPolicy_AllowedToAnyTarget) 686 706 { 687 707 VBOXHGCMSVCPARM aParms[RT_MAX(SHFL_CPARMS_ADD_MAPPING, … … 706 726 HGCMSvcSetPv(&aParms[1], &Mapping, RT_UOFFSETOF(SHFLSTRING, String) 707 727 + Mapping.string.u16Size); 708 HGCMSvcSetU32(&aParms[2], 1);728 HGCMSvcSetU32(&aParms[2], SHFL_ADD_MAPPING_F_WRITABLE | SHFL_ADD_MAPPING_F_CREATE_SYMLINKS); 709 729 HGCMSvcSetPv(&aParms[3], &AutoMountPoint, SHFLSTRING_HEADER_SIZE + AutoMountPoint.string.u16Size); 730 HGCMSvcSetU32(&aParms[4], enmSymlinkPolicy); 710 731 rc = psvcTable->pfnHostCall(psvcTable->pvService, SHFL_FN_ADD_MAPPING, 711 732 SHFL_CPARMS_ADD_MAPPING, aParms); … … 774 795 *pResult = CreateParms.Result; 775 796 return VINF_SUCCESS; 797 } 798 799 static 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; 776 826 } 777 827 … … 1006 1056 } 1007 1057 1058 static 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 1130 void 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 1008 1144 void testReadFileSimple(RTTEST hTest) 1009 1145 { -
trunk/src/VBox/HostServices/SharedFolders/testcase/tstSharedFolderService.h
r98103 r105016 123 123 /* Sub-tests for testSymlink(). */ 124 124 void testSymlinkBadParameters(RTTEST hTest); 125 void testSymlinkCreation(RTTEST hTest); 125 126 126 127 void testMappingsAdd(RTTEST hTest);
Note:
See TracChangeset
for help on using the changeset viewer.