mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
				
	
	
		
			104 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 2018-2022 The OpenSSL Project Authors. All Rights Reserved.
 | |
|  *
 | |
|  * Licensed under the Apache License 2.0 (the "License").  You may not use
 | |
|  * this file except in compliance with the License.  You can obtain a copy
 | |
|  * in the file LICENSE in the source distribution or at
 | |
|  * https://www.openssl.org/source/license.html
 | |
|  */
 | |
| 
 | |
| #ifndef _GNU_SOURCE
 | |
| # define _GNU_SOURCE
 | |
| #endif
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include "internal/cryptlib.h"
 | |
| #include "internal/e_os.h"
 | |
| 
 | |
| char *ossl_safe_getenv(const char *name)
 | |
| {
 | |
| #if defined(_WIN32) && defined(CP_UTF8) && !defined(_WIN32_WCE)
 | |
|     if (GetEnvironmentVariableW(L"OPENSSL_WIN32_UTF8", NULL, 0) != 0) {
 | |
|         char *val = NULL;
 | |
|         int vallen = 0;
 | |
|         WCHAR *namew = NULL;
 | |
|         WCHAR *valw = NULL;
 | |
|         DWORD envlen = 0;
 | |
|         DWORD dwFlags = MB_ERR_INVALID_CHARS;
 | |
|         int rsize, fsize;
 | |
|         UINT curacp;
 | |
| 
 | |
|         curacp = GetACP();
 | |
| 
 | |
|         /*
 | |
|          * For the code pages listed below, dwFlags must be set to 0.
 | |
|          * Otherwise, the function fails with ERROR_INVALID_FLAGS.
 | |
|          */
 | |
|         if (curacp == 50220 || curacp == 50221 || curacp == 50222 ||
 | |
|             curacp == 50225 || curacp == 50227 || curacp == 50229 ||
 | |
|             (57002 <= curacp && curacp <=57011) || curacp == 65000 ||
 | |
|             curacp == 42)
 | |
|             dwFlags = 0;
 | |
| 
 | |
|         /* query for buffer len */
 | |
|         rsize = MultiByteToWideChar(curacp, dwFlags, name, -1, NULL, 0);
 | |
|         /* if name is valid string and can be converted to wide string */
 | |
|         if (rsize > 0)
 | |
|             namew = _malloca(rsize * sizeof(WCHAR));
 | |
| 
 | |
|         if (NULL != namew) {
 | |
|             /* convert name to wide string */
 | |
|             fsize = MultiByteToWideChar(curacp, dwFlags, name, -1, namew, rsize);
 | |
|             /* if conversion is ok, then determine value string size in wchars */
 | |
|             if (fsize > 0)
 | |
|                 envlen = GetEnvironmentVariableW(namew, NULL, 0);
 | |
|         }
 | |
| 
 | |
|         if (envlen > 0)
 | |
|             valw = _malloca(envlen * sizeof(WCHAR));
 | |
| 
 | |
|         if (NULL != valw) {
 | |
|             /* if can get env value as wide string */
 | |
|             if (GetEnvironmentVariableW(namew, valw, envlen) < envlen) {
 | |
|                 /* determine value string size in utf-8 */
 | |
|                 vallen = WideCharToMultiByte(CP_UTF8, 0, valw, -1, NULL, 0,
 | |
|                                              NULL, NULL);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (vallen > 0)
 | |
|             val = OPENSSL_malloc(vallen);
 | |
| 
 | |
|         if (NULL != val) {
 | |
|             /* convert value string from wide to utf-8 */
 | |
|             if (WideCharToMultiByte(CP_UTF8, 0, valw, -1, val, vallen,
 | |
|                                     NULL, NULL) == 0) {
 | |
|                 OPENSSL_free(val);
 | |
|                 val = NULL;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (NULL != namew)
 | |
|             _freea(namew);
 | |
| 
 | |
|         if (NULL != valw)
 | |
|             _freea(valw);
 | |
| 
 | |
|         return val;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
 | |
| # if __GLIBC_PREREQ(2, 17)
 | |
| #  define SECURE_GETENV
 | |
|     return secure_getenv(name);
 | |
| # endif
 | |
| #endif
 | |
| 
 | |
| #ifndef SECURE_GETENV
 | |
|     if (OPENSSL_issetugid())
 | |
|         return NULL;
 | |
|     return getenv(name);
 | |
| #endif
 | |
| }
 |