Index: src/ch/UpdateChecker.cpp
===================================================================
diff -u -N -rd0cfddc68b5ec4dc4e9b73b6f87aa97995c7cc54 -r4572f6cddf7dab06b1de99504a6bbd3680d11e6d
--- src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision d0cfddc68b5ec4dc4e9b73b6f87aa97995c7cc54)
+++ src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision 4572f6cddf7dab06b1de99504a6bbd3680d11e6d)
@@ -53,7 +53,13 @@
 // ============================================================================
 CUpdateChecker::~CUpdateChecker()
 {
-	Cleanup();
+	try
+	{
+		Cleanup();
+	}
+	catch (const std::exception&)
+	{
+	}
 
 	if(m_hKillEvent)
 		::CloseHandle(m_hKillEvent);
@@ -82,12 +88,16 @@
 	if(bOnlyIfConnected && !InternetGetConnectedState(&dwConnectionFlags, 0))
 		return false;
 
+	::EnterCriticalSection(&m_cs);
+
 	m_strSite = pszSite;
 	m_eResult = eResult_Undefined;
 	m_eUpdateChannel = eUpdateChannel;
 	m_strLanguage = pszLanguage;
 	m_bSendHeaders = bSendHeaders;
 
+	::LeaveCriticalSection(&m_cs);
+
 	::ResetEvent(m_hKillEvent);
 
 	m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CUpdateChecker::UpdateCheckThread, (void*)this, 0, NULL);
@@ -112,7 +122,10 @@
 	{
 		if(m_hKillEvent)
 			::SetEvent(m_hKillEvent);
-		WaitForSingleObject(m_hThread, 5000);
+		DWORD dwResult = WaitForSingleObject(m_hThread, 5000);
+		if (dwResult == WAIT_TIMEOUT || dwResult == WAIT_FAILED)
+			throw std::exception("Failed to stop update checker thread.");
+
 		m_hThread = NULL;
 	}