2022-06-28 22:45:53 +02:00
|
|
|
lib/getenv.c | 49 +++++++++++++++++++++++++++++++++----------------
|
|
|
|
1 file changed, 33 insertions(+), 16 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/lib/getenv.c b/lib/getenv.c
|
|
|
|
index 5f00fd1..3eff07a 100644
|
|
|
|
--- a/lib/getenv.c
|
|
|
|
+++ b/lib/getenv.c
|
|
|
|
@@ -26,25 +26,23 @@
|
2021-06-20 16:22:12 +02:00
|
|
|
|
|
|
|
#include <curl/curl.h>
|
|
|
|
#include "curl_memory.h"
|
|
|
|
+#include "curlx.h"
|
2021-06-20 14:44:55 +02:00
|
|
|
|
|
|
|
#include "memdebug.h"
|
|
|
|
|
|
|
|
-static char *GetEnv(const char *variable)
|
|
|
|
+#ifdef WIN32
|
2021-06-20 16:22:12 +02:00
|
|
|
+static TCHAR *GetEnv(const TCHAR *variable)
|
2021-06-20 14:44:55 +02:00
|
|
|
{
|
|
|
|
-#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
|
|
|
|
- (void)variable;
|
|
|
|
- return NULL;
|
|
|
|
-#elif defined(WIN32)
|
|
|
|
/* This uses Windows API instead of C runtime getenv() to get the environment
|
|
|
|
variable since some changes aren't always visible to the latter. #4774 */
|
|
|
|
- char *buf = NULL;
|
|
|
|
- char *tmp;
|
|
|
|
+ TCHAR *buf = NULL;
|
|
|
|
+ TCHAR *tmp;
|
|
|
|
DWORD bufsize;
|
|
|
|
DWORD rc = 1;
|
|
|
|
const DWORD max = 32768; /* max env var size from MSCRT source */
|
|
|
|
|
|
|
|
for(;;) {
|
|
|
|
- tmp = realloc(buf, rc);
|
|
|
|
+ tmp = (TCHAR*)realloc(buf, rc * sizeof(TCHAR));
|
|
|
|
if(!tmp) {
|
|
|
|
free(buf);
|
|
|
|
return NULL;
|
2022-06-28 22:45:53 +02:00
|
|
|
@@ -55,25 +53,44 @@ static char *GetEnv(const char *variable)
|
2021-06-20 14:44:55 +02:00
|
|
|
|
|
|
|
/* It's possible for rc to be 0 if the variable was found but empty.
|
|
|
|
Since getenv doesn't make that distinction we ignore it as well. */
|
|
|
|
- rc = GetEnvironmentVariableA(variable, buf, bufsize);
|
|
|
|
+ rc = GetEnvironmentVariable(variable, buf, bufsize);
|
|
|
|
if(!rc || rc == bufsize || rc > max) {
|
|
|
|
free(buf);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if rc < bufsize then rc is bytes written not including null */
|
|
|
|
- if(rc < bufsize)
|
|
|
|
+ if(rc < bufsize) {
|
|
|
|
return buf;
|
|
|
|
-
|
|
|
|
+ }
|
|
|
|
/* else rc is bytes needed, try again */
|
|
|
|
}
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
2021-06-20 16:22:12 +02:00
|
|
|
+char *curl_getenv(const char *variable)
|
2021-06-20 14:44:55 +02:00
|
|
|
+{
|
|
|
|
+#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
|
|
|
|
+ (void)variable;
|
|
|
|
+ return NULL;
|
|
|
|
+#elif defined(WIN32)
|
|
|
|
+#ifdef UNICODE
|
|
|
|
+ char *value = NULL;
|
|
|
|
+ wchar_t *variable_w = curlx_convert_UTF8_to_wchar(variable);
|
|
|
|
+ if(variable_w) {
|
2021-06-20 16:22:12 +02:00
|
|
|
+ wchar_t *value_w = GetEnv(variable_w);
|
2021-06-20 14:44:55 +02:00
|
|
|
+ if(value_w) {
|
|
|
|
+ value = curlx_convert_wchar_to_UTF8(value_w);
|
|
|
|
+ free(value_w);
|
|
|
|
+ }
|
|
|
|
+ free(variable_w);
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+#else
|
2021-06-20 16:22:12 +02:00
|
|
|
+ return GetEnv(variable);
|
2021-06-20 14:44:55 +02:00
|
|
|
+#endif
|
|
|
|
#else
|
|
|
|
char *env = getenv(variable);
|
|
|
|
return (env && env[0])?strdup(env):NULL;
|
2021-06-20 16:22:12 +02:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
-
|
|
|
|
-char *curl_getenv(const char *v)
|
|
|
|
-{
|
|
|
|
- return GetEnv(v);
|
|
|
|
-}
|