Skywing
2006-02-23 18:09:51 UTC
The 6.6.3.5 version of symsrv.dll is broken when used in conjunction with
symproxy.dll as a symbol server proxy (using Windows Server 2003/IIS 6).
In particular, if the system is NOT configured to use a proxy, symsrv.dll
improperly attempts to use a named proxy "symsrvbogusproxy" with "<local>"
as the bypass list. This causes the symbol server proxy to be unable to
connect to ANY http-based symbol stores because it tries and fails to
connect to "symsrvbogusproxy.default-dns-search-suffix".
So, unless you actually define a WinHttp proxy (instead of configuring
WinHttp to go direct) then you are sunk.
This is basically a showstopper for me with using symproxy.dll. Is there
any known workaround for this problem other than patching symsrv.dll itself?
The code path for this bug is:
.text:01D1C02C loc_1D1C02C: ; CODE XREF:
StoreWinHttp::connect(void)+156j
.text:01D1C02C ;
StoreWinHttp::connect(void)+163j
.text:01D1C02C lea ecx, [ebp+var_18]
.text:01D1C02F push ecx
.text:01D1C030 call
?GetProxyConfig@@YGHPAUWINHTTP_CURRENT_USER_IE_PROXY_CONFIG@@@Z ;
GetProxyConfig(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *) ; try to get proxy
settings from WinHttp. This function returns zero here.
.text:01D1C035 test eax, eax
.text:01D1C037 jz short loc_1D1C053
.
.
.
.text:01D1C053
.text:01D1C053 loc_1D1C053: ; CODE XREF:
StoreWinHttp::connect(void)+187j
.text:01D1C053 ;
StoreWinHttp::connect(void)+18Dj
.text:01D1C053 mov [ebp+var_22C], offset aSymsrvboguspro
; "SymSrvBogusProxy" ; this is broken!
.text:01D1C05D mov [ebp+var_230], offset aLocal ;
"<local>"
.text:01D1C067
.text:01D1C067 loc_1D1C067: ; CODE XREF:
StoreWinHttp::connect(void)+17Aj
.text:01D1C067 ;
StoreWinHttp::connect(void)+1A1j
.text:01D1C067 mov [ebp+var_4],
WINHTTP_ACCESS_TYPE_NAMED_PROXY ; this is also broken. It ALWAYS forces
WINHTTP_ACCESS_TYPE_NAMED_PROXY. (why??). Should use
WINHTTP_ACCESS_TYPE_NO_PROXY if the user has no proxy defined here...
.text:01D1C06E push 0
.text:01D1C070 mov ecx, [ebp+var_230]
.text:01D1C076 push ecx
.text:01D1C077 mov edx, [ebp+var_22C]
.text:01D1C07D push edx
.text:01D1C07E mov eax, [ebp+var_4]
.text:01D1C081 push eax
.text:01D1C082 push offset word_1D75540
.text:01D1C087 call ***@20 ;
WinHttpOpen(x,x,x,x,x)
GetProxyConfig() returns zero because the call to
WinHttpGetDefaultProxyConfiguration() suceeds and returns a
WINHTTP_PROXY_INFO that specifies
dwAccessType==WINHTTP_ACCESS_TYPE_NO_PROXY, lpszProxy==NULL,
lpszProxyBypass==NULL, but GetProxyConfig requires lpszProxy to be non-null
to succeed. As as result "symsrvbogusproxy" is used (incorrectly!).
symproxy.dll as a symbol server proxy (using Windows Server 2003/IIS 6).
In particular, if the system is NOT configured to use a proxy, symsrv.dll
improperly attempts to use a named proxy "symsrvbogusproxy" with "<local>"
as the bypass list. This causes the symbol server proxy to be unable to
connect to ANY http-based symbol stores because it tries and fails to
connect to "symsrvbogusproxy.default-dns-search-suffix".
So, unless you actually define a WinHttp proxy (instead of configuring
WinHttp to go direct) then you are sunk.
This is basically a showstopper for me with using symproxy.dll. Is there
any known workaround for this problem other than patching symsrv.dll itself?
The code path for this bug is:
.text:01D1C02C loc_1D1C02C: ; CODE XREF:
StoreWinHttp::connect(void)+156j
.text:01D1C02C ;
StoreWinHttp::connect(void)+163j
.text:01D1C02C lea ecx, [ebp+var_18]
.text:01D1C02F push ecx
.text:01D1C030 call
?GetProxyConfig@@YGHPAUWINHTTP_CURRENT_USER_IE_PROXY_CONFIG@@@Z ;
GetProxyConfig(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *) ; try to get proxy
settings from WinHttp. This function returns zero here.
.text:01D1C035 test eax, eax
.text:01D1C037 jz short loc_1D1C053
.
.
.
.text:01D1C053
.text:01D1C053 loc_1D1C053: ; CODE XREF:
StoreWinHttp::connect(void)+187j
.text:01D1C053 ;
StoreWinHttp::connect(void)+18Dj
.text:01D1C053 mov [ebp+var_22C], offset aSymsrvboguspro
; "SymSrvBogusProxy" ; this is broken!
.text:01D1C05D mov [ebp+var_230], offset aLocal ;
"<local>"
.text:01D1C067
.text:01D1C067 loc_1D1C067: ; CODE XREF:
StoreWinHttp::connect(void)+17Aj
.text:01D1C067 ;
StoreWinHttp::connect(void)+1A1j
.text:01D1C067 mov [ebp+var_4],
WINHTTP_ACCESS_TYPE_NAMED_PROXY ; this is also broken. It ALWAYS forces
WINHTTP_ACCESS_TYPE_NAMED_PROXY. (why??). Should use
WINHTTP_ACCESS_TYPE_NO_PROXY if the user has no proxy defined here...
.text:01D1C06E push 0
.text:01D1C070 mov ecx, [ebp+var_230]
.text:01D1C076 push ecx
.text:01D1C077 mov edx, [ebp+var_22C]
.text:01D1C07D push edx
.text:01D1C07E mov eax, [ebp+var_4]
.text:01D1C081 push eax
.text:01D1C082 push offset word_1D75540
.text:01D1C087 call ***@20 ;
WinHttpOpen(x,x,x,x,x)
GetProxyConfig() returns zero because the call to
WinHttpGetDefaultProxyConfiguration() suceeds and returns a
WINHTTP_PROXY_INFO that specifies
dwAccessType==WINHTTP_ACCESS_TYPE_NO_PROXY, lpszProxy==NULL,
lpszProxyBypass==NULL, but GetProxyConfig requires lpszProxy to be non-null
to succeed. As as result "symsrvbogusproxy" is used (incorrectly!).