mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +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