VirtualBox

Ignore:
Timestamp:
May 4, 2020 7:23:13 PM (5 years ago)
Author:
vboxsync
Message:

VBoxService/vgsvcGstCtrlProcessProcessWorker: Walk environment using an offset and only validate the cbEnv once. Also, must validate the string lengths before passing them to RTEnvPutEx.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp

    r83609 r84140  
    15561556     * Create the environment.
    15571557     */
     1558    uint32_t const cbEnv = pProcess->StartupInfo.cbEnv;
     1559    if (RT_SUCCESS(rc))
     1560        AssertStmt(   cbEnv <= sizeof(pProcess->StartupInfo.szEnv)
     1561                   || pProcess->StartupInfo.uNumEnvVars == 0,
     1562                   rc = VERR_INVALID_PARAMETER);
    15581563    if (RT_SUCCESS(rc))
    15591564    {
     
    15631568        {
    15641569            VGSvcVerbose(3, "Additional environment variables: %RU32 (%RU32 bytes)\n",
    1565                          pProcess->StartupInfo.uNumEnvVars, pProcess->StartupInfo.cbEnv);
    1566 
    1567             if (   pProcess->StartupInfo.uNumEnvVars
    1568                 && pProcess->StartupInfo.cbEnv)
     1570                         pProcess->StartupInfo.uNumEnvVars, cbEnv);
     1571
     1572            if (   pProcess->StartupInfo.uNumEnvVars /** @todo r=bird: s/uNumEnvVars/cEnvVars/g */
     1573                && cbEnv > 0)
    15691574            {
    1570                       uint32_t cbCur  = 0;
    1571                 const char    *pszCur = pProcess->StartupInfo.szEnv;
    1572                 while (cbCur < pProcess->StartupInfo.cbEnv)
     1575                size_t offCur = 0;
     1576                while (offCur < cbEnv)
    15731577                {
     1578                    const char * const pszCur = &pProcess->StartupInfo.szEnv[offCur];
     1579                    size_t const       cchCur = RTStrNLen(pszCur, cbEnv - offCur);
     1580                    AssertBreakStmt(cchCur < cbEnv - offCur, rc = VERR_INVALID_PARAMETER);
    15741581                    VGSvcVerbose(3, "Setting environment variable: '%s'\n", pszCur);
    15751582                    rc = RTEnvPutEx(hEnv, pszCur);
    1576                     if (RT_FAILURE(rc))
     1583                    if (RT_SUCCESS(rc))
     1584                        offCur += cchCur + 1;
     1585                    else
    15771586                    {
    15781587                        VGSvcError("Setting environment variable '%s' failed: %Rrc\n", pszCur, rc);
    15791588                        break;
    15801589                    }
    1581                     cbCur  += (uint32_t)strlen(pszCur) + 1;
    1582                     AssertBreakStmt(cbCur <= GUESTPROCESS_MAX_ENV_LEN   , rc = VERR_INVALID_PARAMETER);
    1583                     AssertBreakStmt(cbCur <= pProcess->StartupInfo.cbEnv, rc = VERR_INVALID_PARAMETER);
    1584                     pszCur += cbCur;
    15851590                }
    15861591            }
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