VirtualBox

Ignore:
Timestamp:
Nov 8, 2011 1:05:10 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74762
Message:

GuestProperties: Fixed buffer problem.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/GuestProperties/testcase/tstGuestPropSvc.cpp

    r39233 r39236  
    335335        aParms[0].setPointer((void *)g_aEnumStrings[i].pszPatterns, g_aEnumStrings[i].cchPatterns);
    336336        aParms[1].setPointer((void *)abBuffer, g_aEnumStrings[i].cbBuffer - 1);
     337        memset(abBuffer, 0x55, sizeof(abBuffer));
    337338        int rc2 = ptable->pfnHostCall(ptable->pvService, ENUM_PROPS_HOST, 3, aParms);
    338339        if (rc2 == VERR_BUFFER_OVERFLOW)
     
    350351        aParms[0].setPointer((void *)g_aEnumStrings[i].pszPatterns, g_aEnumStrings[i].cchPatterns);
    351352        aParms[1].setPointer((void *)abBuffer, g_aEnumStrings[i].cbBuffer);
     353        memset(abBuffer, 0x55, sizeof(abBuffer));
    352354        rc2 = ptable->pfnHostCall(ptable->pvService, ENUM_PROPS_HOST, 3, aParms);
    353355        if (rc2 == VINF_SUCCESS)
     
    410412    RTStrPrintf(szValue, sizeof(szValue), "%s", pcszValue);
    411413    RTStrPrintf(szFlags, sizeof(szFlags), "%s", pcszFlags);
    412     aParms[0].setPointer (szName, (uint32_t)strlen(szName) + 1);
    413     aParms[1].setPointer (szValue, (uint32_t)strlen(szValue) + 1);
    414     aParms[2].setPointer (szFlags, (uint32_t)strlen(szFlags) + 1);
     414    aParms[0].setString(szName);
     415    aParms[1].setString(szValue);
     416    aParms[2].setString(szFlags);
    415417    if (isHost)
    416418        callHandle.rc = pTable->pfnHostCall(pTable->pvService, command,
     
    494496        command = DEL_PROP_HOST;
    495497    VBOXHGCMSVCPARM aParms[1];
    496     /* Work around silly constant issues - we ought to allow passing
    497      * constant strings in the hgcm parameters. */
    498     char szName[MAX_NAME_LEN];
    499     RTStrPrintf(szName, sizeof(szName), "%s", pcszName);
    500     aParms[0].setPointer (szName, (uint32_t)strlen(szName) + 1);
     498    aParms[0].setString(pcszName);
    501499    if (isHost)
    502500        callHandle.rc = pTable->pfnHostCall(pTable->pvService, command, 1, aParms);
     
    596594        /* Work around silly constant issues - we ought to allow passing
    597595         * constant strings in the hgcm parameters. */
    598         char szName[MAX_NAME_LEN] = "";
    599596        char szBuffer[MAX_VALUE_LEN + MAX_FLAGS_LEN];
    600597        RTTESTI_CHECK_RETV(s_aGetProperties[i].cchValue < sizeof(szBuffer));
    601         RTTESTI_CHECK_RETV(strlen(s_aGetProperties[i].pcszName) < sizeof(szName));
    602 
    603         strcpy(szName, s_aGetProperties[i].pcszName);
    604         aParms[0].setPointer(szName, (uint32_t)(strlen(szName) + 1));
     598
     599        aParms[0].setString(s_aGetProperties[i].pcszName);
     600        memset(szBuffer, 0x55, sizeof(szBuffer));
    605601        aParms[1].setPointer(szBuffer, sizeof(szBuffer));
    606602        int rc2 = pTable->pfnHostCall(pTable->pvService, GET_PROP_HOST, 4, aParms);
     
    967963}
    968964
    969 
    970965static void test4(void)
    971966{
     
    984979
    985980    /* Get the value with buffer sizes up to 1K.  */
    986     for (uint32_t cbBuf = 0; cbBuf < _1K; cbBuf++)
    987     {
    988         void *pvBuf = RTTestGuardedAllocTail(g_hTest, cbBuf);
    989 
    990         VBOXHGCMSVCPARM aParms[4];
    991         aParms[0].setString(s_szProp);
    992         aParms[1].setPointer(pvBuf, cbBuf);
    993         int rc = svcTable.pfnHostCall(svcTable.pvService, GET_PROP_HOST, 4, aParms);
    994 
    995         RTTestGuardedFree(g_hTest, pvBuf);
     981    for (unsigned iVariation = 0; iVariation < 2; iVariation++)
     982    {
     983        for (uint32_t cbBuf = 0; cbBuf < _1K; cbBuf++)
     984        {
     985            void *pvBuf;
     986            RTTESTI_CHECK_RC_BREAK(RTTestGuardedAlloc(g_hTest, cbBuf, 1, iVariation == 0, &pvBuf), VINF_SUCCESS);
     987
     988            VBOXHGCMSVCPARM aParms[4];
     989            aParms[0].setString(s_szProp);
     990            aParms[1].setPointer(pvBuf, cbBuf);
     991            int rc = svcTable.pfnHostCall(svcTable.pvService, GET_PROP_HOST, RT_ELEMENTS(aParms), aParms);
     992
     993            RTTestGuardedFree(g_hTest, pvBuf);
     994        }
    996995    }
    997996
     
    1000999}
    10011000
    1002 
    1003 
    10041001static void test5(void)
     1002{
     1003    RTTestISub("ENUM_PROPS_HOST buffer handling");
     1004
     1005    VBOXHGCMSVCFNTABLE  svcTable;
     1006    VBOXHGCMSVCHELPERS  svcHelpers;
     1007    initTable(&svcTable, &svcHelpers);
     1008    RTTESTI_CHECK_RC_OK_RETV(VBoxHGCMSvcLoad(&svcTable));
     1009
     1010    /* Insert a few property that we can mess around with. */
     1011    RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/Sub/Sub/Sub/Sub/Sub/Sub/Sub/Property", "Property Value", "", true, true));
     1012    RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/12357",  "83848569", "", true, true));
     1013    RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/56678",  "abcdefghijklm", "", true, true));
     1014    RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/932769", "n", "", true, true));
     1015
     1016    /* Get the value with buffer sizes up to 1K.  */
     1017    for (unsigned iVariation = 0; iVariation < 2; iVariation++)
     1018    {
     1019        for (uint32_t cbBuf = 0; cbBuf < _1K; cbBuf++)
     1020        {
     1021            void *pvBuf;
     1022            RTTESTI_CHECK_RC_BREAK(RTTestGuardedAlloc(g_hTest, cbBuf, 1, iVariation == 0, &pvBuf), VINF_SUCCESS);
     1023
     1024            VBOXHGCMSVCPARM aParms[3];
     1025            aParms[0].setString("*");
     1026            aParms[1].setPointer(pvBuf, cbBuf);
     1027            int rc2 = svcTable.pfnHostCall(svcTable.pvService, ENUM_PROPS_HOST, RT_ELEMENTS(aParms), aParms);
     1028
     1029            RTTestGuardedFree(g_hTest, pvBuf);
     1030        }
     1031    }
     1032
     1033    /* Done. */
     1034    RTTESTI_CHECK_RC_OK(svcTable.pfnUnload(svcTable.pvService));
     1035}
     1036
     1037static void test6(void)
    10051038{
    10061039    RTTestISub("Max properties");
     
    10991132    test4();
    11001133    test5();
     1134    test6();
    11011135
    11021136    return RTTestSummaryAndDestroy(g_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