| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | /* * 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}
 |