Changeset 80827 in vbox for trunk/src/VBox/Runtime/generic
- Timestamp:
- Sep 16, 2019 2:04:02 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 133397
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/generic/env-generic.cpp
r80764 r80827 80 80 81 81 82 /** @def RTENV_ALLOW_EQUAL_FIRST_IN_VAR 83 * Allows a variable to start with an '=' sign. This is used by windows to 84 * maintain CWDs of non-current drives. 85 * @note Not supported by _wputenv AFAIK. */ 86 #if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING) 87 # define RTENV_ALLOW_EQUAL_FIRST_IN_VAR 1 88 #endif 89 90 82 91 /********************************************************************************************************************************* 83 92 * Structures and Typedefs * … … 92 101 /** Set if this is a record of environment changes, putenv style. */ 93 102 bool fPutEnvBlock; 103 /** Set if starting a variable with an equal sign is okay, clear if not okay 104 * (RTENV_CREATE_F_ALLOW_EQUAL_FIRST_IN_VAR). */ 105 bool fFirstEqual; 94 106 /** Number of variables in the array. 95 107 * This does not include the terminating NULL entry. */ … … 142 154 * block. We will keep unsets in putenv format, i.e. 143 155 * just the variable name without any equal sign. 144 */ 145 static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSensitive, bool fPutEnvBlock) 156 * @param fFirstEqual The RTENV_CREATE_F_ALLOW_EQUAL_FIRST_IN_VAR value. 157 */ 158 static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSensitive, bool fPutEnvBlock, bool fFirstEqual) 146 159 { 147 160 /* … … 156 169 pIntEnv->u32Magic = RTENV_MAGIC; 157 170 pIntEnv->fPutEnvBlock = fPutEnvBlock; 171 pIntEnv->fFirstEqual = fFirstEqual; 158 172 pIntEnv->pfnCompare = fCaseSensitive ? RTStrNCmp : RTStrNICmp; 159 173 pIntEnv->papszEnvOtherCP = NULL; … … 177 191 { 178 192 AssertPtrReturn(pEnv, VERR_INVALID_POINTER); 179 return rtEnvCreate(pEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, false /*fPutEnvBlock*/); 193 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 194 return rtEnvCreate(pEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, false /*fPutEnvBlock*/, true /*fFirstEqual*/); 195 #else 196 return rtEnvCreate(pEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, false /*fPutEnvBlock*/, false/*fFirstEqual*/); 197 #endif 180 198 } 181 199 RT_EXPORT_SYMBOL(RTEnvCreate); 200 201 202 RTDECL(int) RTEnvCreateEx(PRTENV phEnv, uint32_t fFlags) 203 { 204 AssertPtrReturn(phEnv, VERR_INVALID_POINTER); 205 AssertReturn(!(fFlags & ~RTENV_CREATE_F_VALID_MASK), VERR_INVALID_FLAGS); 206 return rtEnvCreate(phEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, false /*fPutEnvBlock*/, 207 RT_BOOL(fFlags & RTENV_CREATE_F_ALLOW_EQUAL_FIRST_IN_VAR)); 208 } 209 RT_EXPORT_SYMBOL(RTEnvCreateEx); 182 210 183 211 … … 233 261 bool fCaseSensitive = true; 234 262 bool fPutEnvBlock = false; 263 bool fFirstEqual = false; 235 264 size_t cVars; 236 265 const char * const *papszEnv; … … 267 296 fCaseSensitive = false; 268 297 #endif 298 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 299 fFirstEqual = true; 300 #endif 269 301 } 270 302 else … … 276 308 277 309 fPutEnvBlock = pIntEnvToClone->fPutEnvBlock; 310 fFirstEqual = pIntEnvToClone->fFirstEqual; 278 311 papszEnv = pIntEnvToClone->papszEnv; 279 312 cVars = pIntEnvToClone->cVars; … … 284 317 */ 285 318 PRTENVINTERNAL pIntEnv; 286 int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, fCaseSensitive, fPutEnvBlock );319 int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, fCaseSensitive, fPutEnvBlock, fFirstEqual); 287 320 if (RT_SUCCESS(rc)) 288 321 { … … 372 405 */ 373 406 PRTENVINTERNAL pIntEnv; 374 int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, false /*fCaseSensitive*/, false /*fPutEnvBlock*/); 407 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 408 int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, false /*fCaseSensitive*/, false /*fPutEnvBlock*/, true /*fFirstEqual*/); 409 #else 410 int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, false /*fCaseSensitive*/, false /*fPutEnvBlock*/, false /*fFirstEqual*/); 411 #endif 375 412 if (RT_SUCCESS(rc)) 376 413 { … … 586 623 { 587 624 AssertPtrReturn(pszVar, VERR_INVALID_POINTER); 588 AssertReturn(*pszVar, VERR_INVALID_PARAMETER);589 625 AssertPtrReturn(pszValue, VERR_INVALID_POINTER); 590 626 size_t const cchVar = strlen(pszVar); 627 AssertReturn(cchVar > 0, VERR_ENV_INVALID_VAR_NAME); 628 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 629 char const *pszEq = (char const *)memchr(pszVar, '=', cchVar); 630 if (!pszEq) 631 { /* likely */ } 632 else 633 { 634 AssertReturn(Env != RTENV_DEFAULT, VERR_ENV_INVALID_VAR_NAME); 635 PRTENVINTERNAL pIntEnv = Env; 636 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 637 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 638 AssertReturn(pIntEnv->fFirstEqual, VERR_ENV_INVALID_VAR_NAME); 639 AssertReturn(memchr(pszVar + 1, '=', cchVar - 1) == NULL, VERR_ENV_INVALID_VAR_NAME); 640 } 641 #else 591 642 AssertReturn(memchr(pszVar, '=', cchVar) == NULL, VERR_ENV_INVALID_VAR_NAME); 643 #endif 592 644 593 645 return rtEnvSetExWorker(Env, pszVar, cchVar, pszValue); … … 599 651 { 600 652 AssertPtrReturn(pszVar, VERR_INVALID_POINTER); 601 AssertReturn(*pszVar, VERR_INVALID_PARAMETER); 602 AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME); 653 AssertReturn(*pszVar, VERR_ENV_INVALID_VAR_NAME); 603 654 604 655 int rc; … … 627 678 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 628 679 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 680 const size_t cchVar = strlen(pszVar); 681 AssertReturn(cchVar > 0, VERR_ENV_INVALID_VAR_NAME); 682 AssertReturn(strchr(pIntEnv->fFirstEqual ? pszVar + 1 : pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME); 629 683 630 684 RTENV_LOCK(pIntEnv); … … 634 688 */ 635 689 rc = VINF_ENV_VAR_NOT_FOUND; 636 const size_t cchVar = strlen(pszVar);637 690 size_t iVar; 638 691 for (iVar = 0; iVar < pIntEnv->cVars; iVar++) … … 689 742 AssertPtrReturn(pszVarEqualValue, VERR_INVALID_POINTER); 690 743 const char *pszEq = strchr(pszVarEqualValue, '='); 744 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 745 if ( pszEq == pszVarEqualValue 746 && Env != RTENV_DEFAULT) 747 { 748 PRTENVINTERNAL pIntEnv = Env; 749 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 750 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 751 if (pIntEnv->fFirstEqual) 752 pszEq = strchr(pszVarEqualValue + 1, '='); 753 } 754 #endif 691 755 if (!pszEq) 692 756 rc = RTEnvUnsetEx(Env, pszVarEqualValue); 693 757 else 758 { 759 AssertReturn(pszEq != pszVarEqualValue, VERR_ENV_INVALID_VAR_NAME); 694 760 rc = rtEnvSetExWorker(Env, pszVarEqualValue, pszEq - pszVarEqualValue, pszEq + 1); 761 } 695 762 return rc; 696 763 } … … 704 771 AssertPtrNullReturn(pcchActual, VERR_INVALID_POINTER); 705 772 AssertReturn(pcchActual || (pszValue && cbValue), VERR_INVALID_PARAMETER); 706 AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);707 773 708 774 if (pcchActual) … … 755 821 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 756 822 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 823 const size_t cchVar = strlen(pszVar); 824 AssertReturn(cchVar > 0, VERR_ENV_INVALID_VAR_NAME); 825 AssertReturn(strchr(pIntEnv->fFirstEqual ? pszVar + 1 : pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME); 757 826 758 827 RTENV_LOCK(pIntEnv); … … 762 831 */ 763 832 rc = VERR_ENV_VAR_NOT_FOUND; 764 const size_t cchVar = strlen(pszVar);765 833 size_t iVar; 766 834 for (iVar = 0; iVar < pIntEnv->cVars; iVar++) … … 827 895 AssertPtrReturn(pIntEnv, false); 828 896 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, false); 897 const size_t cchVar = strlen(pszVar); 898 AssertReturn(cchVar > 0, false); 899 AssertReturn(strchr(pIntEnv->fFirstEqual ? pszVar + 1 : pszVar, '=') == NULL, false); 829 900 830 901 RTENV_LOCK(pIntEnv); … … 833 904 * Simple search. 834 905 */ 835 const size_t cchVar = strlen(pszVar);836 906 for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++) 837 907 if (!pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)) … … 1213 1283 { 1214 1284 AssertPtrReturn(phEnv, VERR_INVALID_POINTER); 1215 return rtEnvCreate(phEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, true /*fPutEnvBlock*/); 1285 #ifdef RTENV_ALLOW_EQUAL_FIRST_IN_VAR 1286 return rtEnvCreate(phEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, true /*fPutEnvBlock*/, true /*fFirstEqual*/); 1287 #else 1288 return rtEnvCreate(phEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, true /*fPutEnvBlock*/, false /*fFirstEqual*/); 1289 #endif 1290 } 1291 RT_EXPORT_SYMBOL(RTEnvCreateChangeRecord); 1292 1293 1294 RTDECL(int) RTEnvCreateChangeRecordEx(PRTENV phEnv, uint32_t fFlags) 1295 { 1296 AssertPtrReturn(phEnv, VERR_INVALID_POINTER); 1297 AssertReturn(!(fFlags & ~RTENV_CREATE_F_VALID_MASK), VERR_INVALID_FLAGS); 1298 return rtEnvCreate(phEnv, RTENV_GROW_SIZE, true /*fCaseSensitive*/, true /*fPutEnvBlock*/, 1299 RT_BOOL(fFlags & RTENV_CREATE_F_ALLOW_EQUAL_FIRST_IN_VAR)); 1216 1300 } 1217 1301 RT_EXPORT_SYMBOL(RTEnvCreateChangeRecord);
Note:
See TracChangeset
for help on using the changeset viewer.