Changeset 83269 in vbox
- Timestamp:
- Mar 12, 2020 8:15:01 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
r82968 r83269 1474 1474 1475 1475 /* 1476 * Prepare environment variables list.1477 */1478 /** @todo r=bird: you don't need to prepare this, do you? Why don't you replace1479 * 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 /*1516 1476 * Create the environment. 1517 1477 */ … … 1522 1482 if (RT_SUCCESS(rc)) 1523 1483 { 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 1531 1508 if (RT_SUCCESS(rc)) 1532 1509 { … … 1692 1669 } 1693 1670 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 }1701 1671 if (cArgs) 1702 1672 RTGetOptArgvFree(papszArgs);
Note:
See TracChangeset
for help on using the changeset viewer.