VirtualBox

儲存庫 vbox 的更動 103437


忽略:
時間撮記:
2024-2-19 下午01:30:09 (13 月 以前)
作者:
vboxsync
svn:sync-xref-src-repo-rev:
161767
訊息:

tstShflCase: Return non-zero error if the testcase failed. Eliminated remaining three strcpy calls. bugref:3409

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/HostServices/SharedFolders/testcase/tstShflCase.cpp

    r103434 r103437  
    147147{
    148148    RT_NOREF4(hDir, pcbDirEntry, enmAdditionalAttribs, fFlags);
     149    const char *pszSrcName;
    149150    switch (iDirList)
    150151    {
     
    152153            if (iDirFile == RT_ELEMENTS(g_apszDirsC))
    153154                return VERR_NO_MORE_FILES;
    154             pDirEntry->cbName = (uint16_t)strlen(g_apszDirsC[iDirFile]);
    155             strcpy(pDirEntry->szName, g_apszDirsC[iDirFile++]);
     155            pszSrcName = g_apszDirsC[iDirFile];
    156156            break;
    157157        case 2:
    158158            if (iDirFile == RT_ELEMENTS(g_apszTestdirEntries))
    159159                return VERR_NO_MORE_FILES;
    160             pDirEntry->cbName = (uint16_t)strlen(g_apszTestdirEntries[iDirFile]);
    161             strcpy(pDirEntry->szName, g_apszTestdirEntries[iDirFile++]);
     160            pszSrcName = g_apszTestdirEntries[iDirFile];
    162161            break;
    163162        case 3:
    164163            if (iDirFile == RT_ELEMENTS(g_apszSUBDIREntries))
    165164                return VERR_NO_MORE_FILES;
    166             pDirEntry->cbName = (uint16_t)strlen(g_apszSUBDIREntries[iDirFile]);
    167             strcpy(pDirEntry->szName, g_apszSUBDIREntries[iDirFile++]);
    168             break;
    169     }
     165            pszSrcName = g_apszSUBDIREntries[iDirFile];
     166            break;
     167        default:
     168            AssertFailed();
     169            return VERR_NO_MORE_FILES;
     170    }
     171
     172    size_t const cbDirEntry  = *pcbDirEntry;
     173    size_t const cbNameAvail = cbDirEntry - RT_UOFFSETOF(RTDIRENTRYEX, szName);
     174    size_t const cchSrcName  = strlen(pszSrcName);
     175    *pcbDirEntry = RT_UOFFSETOF(RTDIRENTRYEX, szName) + cchSrcName + 1;
     176    pDirEntry->cbName = (uint16_t)cchSrcName;
     177    AssertReturn(cchSrcName < cbNameAvail, VERR_BUFFER_OVERFLOW);
     178
     179    memcpy(pDirEntry->szName, pszSrcName, cchSrcName + 1);
     180    iDirFile++;
    170181    return VINF_SUCCESS;
    171182}
     
    255266                }
    256267
    257                 Log2(("vbsfCorrectCasing: found %s\n", &pDirEntry->szName[0]));
     268                Log2(("vbsfCorrectCasing: found '%s'\n", &pDirEntry->szName[0]));
    258269                if (   pDirEntry->cbName == cchComponent
    259270                    && !RTStrICmp(pszStartComponent, &pDirEntry->szName[0]))
     
    417428int main()
    418429{
    419     RTR3InitExeNoArguments(0);
     430    RTTEST hTest;
     431    RTEXITCODE rcExit = RTTestInitAndCreate("tstShflCase", &hTest);
     432    if (rcExit != RTEXITCODE_SUCCESS)
     433        return rcExit;
     434    RTTestBanner(hTest);
     435
    420436    RTLogFlush(NULL);
    421437    RTLogDestinations(NULL, "stdout");
     
    423439    RTLogFlags(NULL, "unbuffered");
    424440
    425     char szTest[128];
    426 #define SET_SZ_TEST(a_szStr) do { \
    427         AssertCompile(sizeof(a_szStr) < sizeof(szTest)); \
    428         memcpy(szTest, a_szStr, sizeof(a_szStr)); \
    429     } while (0)
    430 
    431     SET_SZ_TEST("c:\\test Dir\\z.bAt");
    432     testCase(szTest);
    433     SET_SZ_TEST("c:\\test dir\\z.bAt");
    434     testCase(szTest);
    435     SET_SZ_TEST("c:\\test dir\\SUBDIR\\z.bAt");
    436     testCase(szTest);
    437     SET_SZ_TEST("c:\\test dir\\SUBDiR\\atestje.bat");
    438     testCase(szTest);
    439     SET_SZ_TEST("c:\\TEST dir\\subDiR\\aTestje.baT");
    440     testCase(szTest);
    441     SET_SZ_TEST("c:\\TEST dir\\subDiR\\*");
    442     testCase(szTest, true);
    443     SET_SZ_TEST("c:\\TEST dir\\subDiR\\");
    444     testCase(szTest, true);
    445     SET_SZ_TEST("c:\\test dir\\SUBDIR\\");
    446     testCase(szTest);
    447     SET_SZ_TEST("c:\\test dir\\invalid\\SUBDIR\\test.bat");
    448     testCase(szTest);
    449     return 0;
    450 }
    451 
     441    static const struct
     442    {
     443        int         rcExpect;
     444        bool        fWildcard;
     445        const char *pszPath;
     446        size_t      cchPath;
     447    } s_aTests[] =
     448    {
     449        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\test Dir\\z.bAt") },
     450        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\test dir\\z.bAt") },
     451        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\test dir\\SUBDIR\\z.bAt") },
     452        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\test dir\\SUBDiR\\atestje.bat") },
     453        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\TEST dir\\subDiR\\aTestje.baT") },
     454        { VINF_SUCCESS,          true, RT_STR_TUPLE("c:\\TEST dir\\subDiR\\*") },
     455        { VINF_SUCCESS,          true, RT_STR_TUPLE("c:\\TEST dir\\subDiR\\") },
     456        { VINF_SUCCESS,         false, RT_STR_TUPLE("c:\\test dir\\SUBDIR\\") },
     457        { VERR_NO_MORE_FILES,   false, RT_STR_TUPLE("c:\\test dir\\invalid\\SUBDIR\\test.bat") },
     458    };
     459    for (size_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
     460    {
     461        char szTest[128];
     462        AssertContinueStmt(s_aTests[i].cchPath < sizeof(szTest), RTTestFailed(hTest, "too long: #%zu", i));
     463        memcpy(szTest, s_aTests[i].pszPath, s_aTests[i].cchPath + 1);
     464        int rc = testCase(szTest, s_aTests[i].fWildcard);
     465        if (rc != s_aTests[i].rcExpect)
     466            RTTestFailed(hTest, "testCase returned %Rrc, expected %Rrc (path: %s)",
     467                         rc, s_aTests[i].rcExpect, s_aTests[i].pszPath);
     468    }
     469    return RTTestSummaryAndDestroy(hTest);
     470}
     471
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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