mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	bpo-38353: getpath.c: allocates strings on the heap (GH-16585)
* _Py_FindEnvConfigValue() now returns a string allocated by PyMem_RawMalloc(). * calculate_init() now decodes VPATH macro. * Add calculate_open_pyenv() function. * Add substring() and joinpath2() functions. * Fix add_exe_suffix() And a few cleanup changes.
This commit is contained in:
		
							parent
							
								
									abd7cd856b
								
							
						
					
					
						commit
						c02b41b1fb
					
				
					 4 changed files with 427 additions and 319 deletions
				
			
		|  | @ -777,12 +777,17 @@ _PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p) | |||
| #endif | ||||
| 
 | ||||
| /* Search for a prefix value in an environment file (pyvenv.cfg).
 | ||||
|    If found, copy it into the provided buffer. */ | ||||
| int | ||||
| 
 | ||||
|    - If found, copy it into *value_p: string which must be freed by | ||||
|      PyMem_RawFree(). | ||||
|    - If not found, *value_p is set to NULL. | ||||
| */ | ||||
| PyStatus | ||||
| _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, | ||||
|                        wchar_t *value, size_t value_size) | ||||
|                        wchar_t **value_p) | ||||
| { | ||||
|     int result = 0; /* meaning not found */ | ||||
|     *value_p = NULL; | ||||
| 
 | ||||
|     char buffer[MAXPATHLEN * 2 + 1];  /* allow extra for key, '=', etc. */ | ||||
|     buffer[Py_ARRAY_LENGTH(buffer)-1] = '\0'; | ||||
| 
 | ||||
|  | @ -812,18 +817,24 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, | |||
|                 if ((tok != NULL) && !wcscmp(tok, L"=")) { | ||||
|                     tok = WCSTOK(NULL, L"\r\n", &state); | ||||
|                     if (tok != NULL) { | ||||
|                         wcsncpy(value, tok, value_size - 1); | ||||
|                         value[value_size - 1] = L'\0'; | ||||
|                         result = 1; | ||||
|                         *value_p = _PyMem_RawWcsdup(tok); | ||||
|                         PyMem_RawFree(tmpbuffer); | ||||
|                         break; | ||||
| 
 | ||||
|                         if (*value_p == NULL) { | ||||
|                             return _PyStatus_NO_MEMORY(); | ||||
|                         } | ||||
| 
 | ||||
|                         /* found */ | ||||
|                         return _PyStatus_OK(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             PyMem_RawFree(tmpbuffer); | ||||
|         } | ||||
|     } | ||||
|     return result; | ||||
| 
 | ||||
|     /* not found */ | ||||
|     return _PyStatus_OK(); | ||||
| } | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner