mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	[WebParser] Fixed the issue that Rainmeter crashes if RegExp is invalid.
This commit is contained in:
		@@ -83,31 +83,10 @@ static bool g_Debug = false;
 | 
				
			|||||||
static HINTERNET hRootHandle = NULL;
 | 
					static HINTERNET hRootHandle = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OVECCOUNT 300    // should be a multiple of 3
 | 
					#define OVECCOUNT 300    // should be a multiple of 3
 | 
				
			||||||
#define MUTEX_ERROR "Unable to obtain the mutex."
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string ConvertToUTF8(LPCWSTR str)
 | 
					std::wstring ConvertToWide(LPCSTR str, int codepage)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	std::string szAscii;
 | 
						std::wstring szWide;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (str && *str)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		int strLen = (int)wcslen(str) + 1;
 | 
					 | 
				
			||||||
		int bufLen = WideCharToMultiByte(CP_UTF8, 0, str, strLen, NULL, 0, NULL, NULL);
 | 
					 | 
				
			||||||
		if (bufLen > 0)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			char* tmpSz = new char[bufLen];
 | 
					 | 
				
			||||||
			tmpSz[0] = 0;
 | 
					 | 
				
			||||||
			WideCharToMultiByte(CP_UTF8, 0, str, strLen, tmpSz, bufLen, NULL, NULL);
 | 
					 | 
				
			||||||
			szAscii = tmpSz;
 | 
					 | 
				
			||||||
			delete [] tmpSz;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return szAscii;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
std::string ConvertToUTF8(LPCSTR str, int codepage)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	std::string szUTF8;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (str && *str)
 | 
						if (str && *str)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -118,26 +97,6 @@ std::string ConvertToUTF8(LPCSTR str, int codepage)
 | 
				
			|||||||
			WCHAR* wideSz = new WCHAR[bufLen];
 | 
								WCHAR* wideSz = new WCHAR[bufLen];
 | 
				
			||||||
			wideSz[0] = 0;
 | 
								wideSz[0] = 0;
 | 
				
			||||||
			MultiByteToWideChar(codepage, 0, str, strLen, wideSz, bufLen);
 | 
								MultiByteToWideChar(codepage, 0, str, strLen, wideSz, bufLen);
 | 
				
			||||||
			szUTF8 = ConvertToUTF8(wideSz);
 | 
					 | 
				
			||||||
			delete [] wideSz;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return szUTF8;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
std::wstring ConvertToWide(LPCSTR str)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	std::wstring szWide;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (str && *str)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		int strLen = (int)strlen(str) + 1;
 | 
					 | 
				
			||||||
		int bufLen = MultiByteToWideChar(CP_UTF8, 0, str, strLen, NULL, 0);
 | 
					 | 
				
			||||||
		if (bufLen > 0)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			WCHAR* wideSz = new WCHAR[bufLen];
 | 
					 | 
				
			||||||
			wideSz[0] = 0;
 | 
					 | 
				
			||||||
			MultiByteToWideChar(CP_UTF8, 0, str, strLen, wideSz, bufLen);
 | 
					 | 
				
			||||||
			szWide = wideSz;
 | 
								szWide = wideSz;
 | 
				
			||||||
			delete [] wideSz;
 | 
								delete [] wideSz;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -145,19 +104,19 @@ std::wstring ConvertToWide(LPCSTR str)
 | 
				
			|||||||
	return szWide;
 | 
						return szWide;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string ConvertToACP(LPCWSTR str)
 | 
					std::string ConvertToAscii(LPCWSTR str, int codepage)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	std::string szAscii;
 | 
						std::string szAscii;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (str && *str)
 | 
						if (str && *str)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int strLen = (int)wcslen(str) + 1;
 | 
							int strLen = (int)wcslen(str) + 1;
 | 
				
			||||||
		int bufLen = WideCharToMultiByte(CP_ACP, 0, str, strLen, NULL, 0, NULL, NULL);
 | 
							int bufLen = WideCharToMultiByte(codepage, 0, str, strLen, NULL, 0, NULL, NULL);
 | 
				
			||||||
		if (bufLen > 0)
 | 
							if (bufLen > 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			char* tmpSz = new char[bufLen];
 | 
								char* tmpSz = new char[bufLen];
 | 
				
			||||||
			tmpSz[0] = 0;
 | 
								tmpSz[0] = 0;
 | 
				
			||||||
			WideCharToMultiByte(CP_ACP, 0, str, strLen, tmpSz, bufLen, NULL, NULL);
 | 
								WideCharToMultiByte(codepage, 0, str, strLen, tmpSz, bufLen, NULL, NULL);
 | 
				
			||||||
			szAscii = tmpSz;
 | 
								szAscii = tmpSz;
 | 
				
			||||||
			delete [] tmpSz;
 | 
								delete [] tmpSz;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -165,6 +124,41 @@ std::string ConvertToACP(LPCWSTR str)
 | 
				
			|||||||
	return szAscii;
 | 
						return szAscii;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string ConvertWideToAscii(LPCWSTR str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ConvertToAscii(str, CP_ACP);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::wstring ConvertAsciiToWide(LPCSTR str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ConvertToWide(str, CP_ACP);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::wstring ConvertUTF8ToWide(LPCSTR str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ConvertToWide(str, CP_UTF8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string ConvertWideToUTF8(LPCWSTR str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ConvertToAscii(str, CP_UTF8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string ConvertAsciiToUTF8(LPCSTR str, int codepage)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string szUTF8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (str && *str)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::wstring wide = ConvertToWide(str, codepage);
 | 
				
			||||||
 | 
							if (!wide.empty())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								szUTF8.swap(ConvertWideToUTF8(wide.c_str()));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return szUTF8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HWND FindMeterWindow()
 | 
					HWND FindMeterWindow()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	HWND wnd = FindWindow(L"RainmeterMeterWindow", NULL);
 | 
						HWND wnd = FindWindow(L"RainmeterMeterWindow", NULL);
 | 
				
			||||||
@@ -465,7 +459,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	// Compile the regular expression in the first argument
 | 
						// Compile the regular expression in the first argument
 | 
				
			||||||
	re = pcre_compile(
 | 
						re = pcre_compile(
 | 
				
			||||||
		ConvertToUTF8(urlData->regExp.c_str()).c_str(),   // the pattern
 | 
							ConvertWideToUTF8(urlData->regExp.c_str()).c_str(),   // the pattern
 | 
				
			||||||
		flags,					  // default options
 | 
							flags,					  // default options
 | 
				
			||||||
		&error,               // for error message
 | 
							&error,               // for error message
 | 
				
			||||||
		&erroffset,           // for error offset
 | 
							&erroffset,           // for error offset
 | 
				
			||||||
@@ -479,7 +473,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
		if (urlData->codepage != CP_UTF8 && urlData->codepage != 0)		// 0 = CP_ACP
 | 
							if (urlData->codepage != CP_UTF8 && urlData->codepage != 0)		// 0 = CP_ACP
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Must convert the data to utf8
 | 
								// Must convert the data to utf8
 | 
				
			||||||
			utf8Data = ConvertToUTF8(parseData, urlData->codepage);
 | 
								utf8Data = ConvertAsciiToUTF8(parseData, urlData->codepage);
 | 
				
			||||||
			parseData = utf8Data.c_str();
 | 
								parseData = utf8Data.c_str();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -516,7 +510,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
							int substring_length = ovector[2 * i + 1] - ovector[2 * i];
 | 
												int substring_length = ovector[2 * i + 1] - ovector[2 * i];
 | 
				
			||||||
							substring_length = min(substring_length, 256);
 | 
												substring_length = min(substring_length, 256);
 | 
				
			||||||
							std::string tmpStr(substring_start, substring_length);
 | 
												std::string tmpStr(substring_start, substring_length);
 | 
				
			||||||
							wsprintf(buffer, L"WebParser: (Index %2d) %s", i, ConvertToWide(tmpStr.c_str()).c_str());
 | 
												wsprintf(buffer, L"WebParser: (Index %2d) %s", i, ConvertUTF8ToWide(tmpStr.c_str()).c_str());
 | 
				
			||||||
							Log(buffer);
 | 
												Log(buffer);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -526,7 +520,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					EnterCriticalSection(&g_CriticalSection);
 | 
										EnterCriticalSection(&g_CriticalSection);
 | 
				
			||||||
					std::string szResult(substring_start, substring_length);
 | 
										std::string szResult(substring_start, substring_length);
 | 
				
			||||||
					urlData->resultString = ConvertToWide(szResult.c_str());
 | 
										urlData->resultString = ConvertUTF8ToWide(szResult.c_str());
 | 
				
			||||||
					LeaveCriticalSection(&g_CriticalSection);
 | 
										LeaveCriticalSection(&g_CriticalSection);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
@@ -569,7 +563,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
								EnterCriticalSection(&g_CriticalSection);
 | 
													EnterCriticalSection(&g_CriticalSection);
 | 
				
			||||||
								
 | 
													
 | 
				
			||||||
								// Substitude the [measure] with szResult
 | 
													// Substitude the [measure] with szResult
 | 
				
			||||||
								std::wstring wzResult = ConvertToWide(szResult.c_str());
 | 
													std::wstring wzResult = ConvertUTF8ToWide(szResult.c_str());
 | 
				
			||||||
								std::wstring wzUrl = ((*i).second)->url;
 | 
													std::wstring wzUrl = ((*i).second)->url;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								wzUrl.replace(wzUrl.find(compareStr), compareStr.size(), wzResult);
 | 
													wzUrl.replace(wzUrl.find(compareStr), compareStr.size(), wzResult);
 | 
				
			||||||
@@ -628,7 +622,7 @@ void ParseData(UrlData* urlData, LPCSTR parseData)
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		// Compilation failed: print the error message and exit
 | 
							// Compilation failed: print the error message and exit
 | 
				
			||||||
		WCHAR buffer[1024];
 | 
							WCHAR buffer[1024];
 | 
				
			||||||
		wsprintf(buffer, L"WebParser: PCRE compilation failed at offset %d: %s\n", erroffset, error);
 | 
							wsprintf(buffer, L"WebParser: PCRE compilation failed at offset %d: %s\n", erroffset, ConvertAsciiToWide(error).c_str());
 | 
				
			||||||
		Log(buffer);
 | 
							Log(buffer);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1118,7 +1112,7 @@ BYTE* DownloadUrl(std::wstring& url, DWORD* dwDataSize, bool forceReload)
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		if (wcsnicmp(url.c_str(), L"file://", 7) == 0)  // file scheme
 | 
							if (wcsnicmp(url.c_str(), L"file://", 7) == 0)  // file scheme
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			std::string urlACP = ConvertToACP(url.c_str());
 | 
								std::string urlACP = ConvertWideToAscii(url.c_str());
 | 
				
			||||||
			hUrlDump = InternetOpenUrlA(hRootHandle, urlACP.c_str(), NULL, NULL, flags, 0);
 | 
								hUrlDump = InternetOpenUrlA(hRootHandle, urlACP.c_str(), NULL, NULL, flags, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user