VirtualBox

Changeset 83269 in vbox


Ignore:
Timestamp:
Mar 12, 2020 8:15:01 AM (5 years ago)
Author:
vboxsync
Message:

VBoxService/ Guest Control: Resolved a @todo: Simplified building a guest process' environment.

File:
1 edited

Legend:

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

    r82968 r83269  
    14741474
    14751475    /*
    1476      * Prepare environment variables list.
    1477      */
    1478 /** @todo r=bird: you don't need to prepare this, do you? Why don't you replace
    1479  * the brilliant RTStrAPrintf call with RTEnvPutEx and drop the papszEnv related code? */
    1480     char **papszEnv = NULL;
    1481     uint32_t uNumEnvVars = 0; /* Initialize in case of failing ... */
    1482     if (RT_SUCCESS(rc))
    1483     {
    1484         /* Prepare environment list. */
    1485         if (pProcess->StartupInfo.uNumEnvVars)
    1486         {
    1487             papszEnv = (char **)RTMemAlloc(pProcess->StartupInfo.uNumEnvVars * sizeof(char*));
    1488             AssertPtr(papszEnv);
    1489             uNumEnvVars = pProcess->StartupInfo.uNumEnvVars;
    1490 
    1491             const char *pszCur = pProcess->StartupInfo.szEnv;
    1492             uint32_t i = 0;
    1493             uint32_t cbLen = 0;
    1494             while (cbLen < pProcess->StartupInfo.cbEnv)
    1495             {
    1496                 /* sanity check */
    1497                 if (i >= pProcess->StartupInfo.uNumEnvVars)
    1498                 {
    1499                     rc = VERR_INVALID_PARAMETER;
    1500                     break;
    1501                 }
    1502                 int cbStr = RTStrAPrintf(&papszEnv[i++], "%s", pszCur);
    1503                 if (cbStr < 0)
    1504                 {
    1505                     rc = VERR_NO_STR_MEMORY;
    1506                     break;
    1507                 }
    1508                 pszCur += cbStr + 1; /* Skip terminating '\0' */
    1509                 cbLen  += cbStr + 1; /* Skip terminating '\0' */
    1510             }
    1511             Assert(i == pProcess->StartupInfo.uNumEnvVars);
    1512         }
    1513     }
    1514 
    1515     /*
    15161476     * Create the environment.
    15171477     */
     
    15221482        if (RT_SUCCESS(rc))
    15231483        {
    1524             size_t i;
    1525             for (i = 0; i < uNumEnvVars && papszEnv; i++)
    1526             {
    1527                 rc = RTEnvPutEx(hEnv, papszEnv[i]);
    1528                 if (RT_FAILURE(rc))
    1529                     break;
    1530             }
     1484            VGSvcVerbose(3, "Additional environment variables: %RU32 (%RU32 bytes)\n",
     1485                         pProcess->StartupInfo.uNumEnvVars, pProcess->StartupInfo.cbEnv);
     1486
     1487            if (   pProcess->StartupInfo.uNumEnvVars
     1488                && pProcess->StartupInfo.cbEnv)
     1489            {
     1490                      uint32_t cbCur  = 0;
     1491                const char    *pszCur = pProcess->StartupInfo.szEnv;
     1492                while (cbCur < pProcess->StartupInfo.cbEnv)
     1493                {
     1494                    VGSvcVerbose(3, "Setting environment variable: '%s'\n", pszCur);
     1495                    rc = RTEnvPutEx(hEnv, pszCur);
     1496                    if (RT_FAILURE(rc))
     1497                    {
     1498                        VGSvcError("Setting environment variable '%s' failed: %Rrc\n", pszCur, rc);
     1499                        break;
     1500                    }
     1501                    cbCur  += (uint32_t)strlen(pszCur) + 1;
     1502                    AssertBreakStmt(cbCur <= GUESTPROCESS_MAX_ENV_LEN   , rc = VERR_INVALID_PARAMETER);
     1503                    AssertBreakStmt(cbCur <= pProcess->StartupInfo.cbEnv, rc = VERR_INVALID_PARAMETER);
     1504                    pszCur += cbCur;
     1505                }
     1506            }
     1507
    15311508            if (RT_SUCCESS(rc))
    15321509            {
     
    16921669    }
    16931670
    1694     /* Free argument + environment variable lists. */
    1695     if (uNumEnvVars)
    1696     {
    1697         for (uint32_t i = 0; i < uNumEnvVars; i++)
    1698             RTStrFree(papszEnv[i]);
    1699         RTMemFree(papszEnv);
    1700     }
    17011671    if (cArgs)
    17021672        RTGetOptArgvFree(papszArgs);
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