]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
asyn-thread: avoid using GetAddrInfoExW with impersonation
authorPavel P <pavlov.pavel@gmail.com>
Tue, 21 May 2024 23:23:34 +0000 (01:23 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 23 May 2024 21:56:58 +0000 (23:56 +0200)
Multiple reports suggest that GetAddrInfoExW fails when impersonation is
used. This PR checks if thread is impersonating and avoids using
GetAddrInfoExW api.

Reported-by: Keerthi Timmaraju
Assisted-by: edmcln on github
Fixes #13612
Closes #13738

lib/asyn-thread.c
lib/system_win32.c
lib/system_win32.h

index 1760d6cb3f754cb772fca212e147f20322f9a589..7bec875497feee3086867cc3225ac0242b428386 100644 (file)
@@ -638,7 +638,8 @@ static bool init_resolve_thread(struct Curl_easy *data,
 
 #ifdef _WIN32
   if(Curl_isWindows8OrGreater && Curl_FreeAddrInfoExW &&
-     Curl_GetAddrInfoExCancel && Curl_GetAddrInfoExW) {
+     Curl_GetAddrInfoExCancel && Curl_GetAddrInfoExW &&
+     !Curl_win32_impersonating()) {
 #define MAX_NAME_LEN 256 /* max domain name is 253 chars */
 #define MAX_PORT_LEN 8
     WCHAR namebuf[MAX_NAME_LEN];
index d2862de9231031735eb509168085e47876432677..354d8a1b5789a37768eb8d92189c1ab24e32d9b4 100644 (file)
@@ -267,4 +267,14 @@ HMODULE Curl_load_library(LPCTSTR filename)
 #endif
 }
 
+bool Curl_win32_impersonating(void)
+{
+  HANDLE token = NULL;
+  if(OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &token)) {
+    CloseHandle(token);
+    return TRUE;
+  }
+  return FALSE;
+}
+
 #endif /* _WIN32 */
index bd490cabcc81cc384e43cea082dd04512fa50df4..bd2f775a7c5451fceb1f62a6a3ed7ae07902ac5e 100644 (file)
@@ -68,6 +68,8 @@ extern FREEADDRINFOEXW_FN Curl_FreeAddrInfoExW;
 extern GETADDRINFOEXCANCEL_FN Curl_GetAddrInfoExCancel;
 extern GETADDRINFOEXW_FN Curl_GetAddrInfoExW;
 
+bool Curl_win32_impersonating(void);
+
 /* This is used to dynamically load DLLs */
 HMODULE Curl_load_library(LPCTSTR filename);
 #else  /* _WIN32 */