mirror of
https://github.com/reactos/reactos.git
synced 2025-05-22 02:25:18 +00:00
[NOTEPAD] Avoid half-initialized status of settings (#5078)
- Avoid buffer overrun in QueryString helper function. - Improve NOTEPAD_LoadSettingsFromRegistry function. CORE-18837
This commit is contained in:
parent
4c1e83d514
commit
ead9366ef7
2 changed files with 67 additions and 68 deletions
|
@ -560,6 +560,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE prev, LPTSTR cmdline, int sh
|
||||||
HMONITOR monitor;
|
HMONITOR monitor;
|
||||||
MONITORINFO info;
|
MONITORINFO info;
|
||||||
INT x, y;
|
INT x, y;
|
||||||
|
RECT rcIntersect;
|
||||||
|
|
||||||
static const TCHAR className[] = _T("Notepad");
|
static const TCHAR className[] = _T("Notepad");
|
||||||
static const TCHAR winName[] = _T("Notepad");
|
static const TCHAR winName[] = _T("Notepad");
|
||||||
|
@ -609,10 +610,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE prev, LPTSTR cmdline, int sh
|
||||||
|
|
||||||
x = Globals.main_rect.left;
|
x = Globals.main_rect.left;
|
||||||
y = Globals.main_rect.top;
|
y = Globals.main_rect.top;
|
||||||
if (Globals.main_rect.left >= info.rcWork.right ||
|
if (!IntersectRect(&rcIntersect, &Globals.main_rect, &info.rcWork))
|
||||||
Globals.main_rect.top >= info.rcWork.bottom ||
|
|
||||||
Globals.main_rect.right < info.rcWork.left ||
|
|
||||||
Globals.main_rect.bottom < info.rcWork.top)
|
|
||||||
x = y = CW_USEDEFAULT;
|
x = y = CW_USEDEFAULT;
|
||||||
|
|
||||||
Globals.hMainWnd = CreateWindow(className,
|
Globals.hMainWnd = CreateWindow(className,
|
||||||
|
|
|
@ -100,9 +100,14 @@ static BOOL QueryBool(HKEY hKey, LPCTSTR pszValueName, BOOL *pbResult)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultSize)
|
static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultLength)
|
||||||
{
|
{
|
||||||
return QueryGeneric(hKey, pszValueName, REG_SZ, pszResult, dwResultSize * sizeof(TCHAR));
|
if (dwResultLength == 0)
|
||||||
|
return FALSE;
|
||||||
|
if (!QueryGeneric(hKey, pszValueName, REG_SZ, pszResult, dwResultLength * sizeof(TCHAR)))
|
||||||
|
return FALSE;
|
||||||
|
pszResult[dwResultLength - 1] = 0; /* Avoid buffer overrun */
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -113,24 +118,38 @@ static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD
|
||||||
*/
|
*/
|
||||||
void NOTEPAD_LoadSettingsFromRegistry(void)
|
void NOTEPAD_LoadSettingsFromRegistry(void)
|
||||||
{
|
{
|
||||||
HKEY hKey = NULL;
|
HKEY hKey;
|
||||||
HFONT hFont;
|
HFONT hFont;
|
||||||
DWORD dwPointSize = 0;
|
DWORD dwPointSize, cx, cy;
|
||||||
INT base_length, dx, dy;
|
DWORD cxScreen = GetSystemMetrics(SM_CXSCREEN), cyScreen = GetSystemMetrics(SM_CYSCREEN);
|
||||||
|
|
||||||
base_length = (GetSystemMetrics(SM_CXSCREEN) > GetSystemMetrics(SM_CYSCREEN)) ?
|
/* Set the default values */
|
||||||
GetSystemMetrics(SM_CYSCREEN) : GetSystemMetrics(SM_CXSCREEN);
|
Globals.bShowStatusBar = TRUE;
|
||||||
|
Globals.bWrapLongLines = FALSE;
|
||||||
|
SetRect(&Globals.lMargins, 750, 1000, 750, 1000);
|
||||||
|
ZeroMemory(&Globals.lfFont, sizeof(Globals.lfFont));
|
||||||
|
Globals.lfFont.lfCharSet = DEFAULT_CHARSET;
|
||||||
|
dwPointSize = 100;
|
||||||
|
Globals.lfFont.lfWeight = FW_NORMAL;
|
||||||
|
Globals.lfFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
|
||||||
|
Globals.main_rect.left = CW_USEDEFAULT;
|
||||||
|
Globals.main_rect.top = CW_USEDEFAULT;
|
||||||
|
cx = min((cxScreen * 3) / 4, 640);
|
||||||
|
cy = min((cyScreen * 3) / 4, 480);
|
||||||
|
|
||||||
dx = (INT)(base_length * .95);
|
/* FIXME: Globals.fSaveWindowPositions = FALSE; */
|
||||||
dy = dx * 3 / 4;
|
/* FIXME: Globals.fMLE_is_broken = FALSE; */
|
||||||
SetRect(&Globals.main_rect, 0, 0, dx, dy);
|
|
||||||
|
|
||||||
if (RegOpenKey(HKEY_CURRENT_USER, s_szRegistryKey, &hKey) == ERROR_SUCCESS)
|
/* Open the target registry key */
|
||||||
|
if (RegOpenKey(HKEY_CURRENT_USER, s_szRegistryKey, &hKey) != ERROR_SUCCESS)
|
||||||
|
hKey = NULL;
|
||||||
|
|
||||||
|
/* Load the values from registry */
|
||||||
|
if (hKey)
|
||||||
{
|
{
|
||||||
QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet);
|
QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet);
|
||||||
QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision);
|
QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision);
|
||||||
QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement);
|
QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement);
|
||||||
QueryString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName, ARRAY_SIZE(Globals.lfFont.lfFaceName));
|
|
||||||
QueryByte(hKey, _T("lfItalic"), &Globals.lfFont.lfItalic);
|
QueryByte(hKey, _T("lfItalic"), &Globals.lfFont.lfItalic);
|
||||||
QueryDword(hKey, _T("lfOrientation"), (DWORD*)&Globals.lfFont.lfOrientation);
|
QueryDword(hKey, _T("lfOrientation"), (DWORD*)&Globals.lfFont.lfOrientation);
|
||||||
QueryByte(hKey, _T("lfOutPrecision"), &Globals.lfFont.lfOutPrecision);
|
QueryByte(hKey, _T("lfOutPrecision"), &Globals.lfFont.lfOutPrecision);
|
||||||
|
@ -140,10 +159,10 @@ void NOTEPAD_LoadSettingsFromRegistry(void)
|
||||||
QueryByte(hKey, _T("lfUnderline"), &Globals.lfFont.lfUnderline);
|
QueryByte(hKey, _T("lfUnderline"), &Globals.lfFont.lfUnderline);
|
||||||
QueryDword(hKey, _T("lfWeight"), (DWORD*)&Globals.lfFont.lfWeight);
|
QueryDword(hKey, _T("lfWeight"), (DWORD*)&Globals.lfFont.lfWeight);
|
||||||
QueryDword(hKey, _T("iPointSize"), &dwPointSize);
|
QueryDword(hKey, _T("iPointSize"), &dwPointSize);
|
||||||
|
|
||||||
QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines);
|
QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines);
|
||||||
QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar);
|
QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar);
|
||||||
QueryString(hKey, _T("szHeader"), Globals.szHeader, ARRAY_SIZE(Globals.szHeader));
|
|
||||||
QueryString(hKey, _T("szTrailer"), Globals.szFooter, ARRAY_SIZE(Globals.szFooter));
|
|
||||||
QueryDword(hKey, _T("iMarginLeft"), (DWORD*)&Globals.lMargins.left);
|
QueryDword(hKey, _T("iMarginLeft"), (DWORD*)&Globals.lMargins.left);
|
||||||
QueryDword(hKey, _T("iMarginTop"), (DWORD*)&Globals.lMargins.top);
|
QueryDword(hKey, _T("iMarginTop"), (DWORD*)&Globals.lMargins.top);
|
||||||
QueryDword(hKey, _T("iMarginRight"), (DWORD*)&Globals.lMargins.right);
|
QueryDword(hKey, _T("iMarginRight"), (DWORD*)&Globals.lMargins.right);
|
||||||
|
@ -151,43 +170,35 @@ void NOTEPAD_LoadSettingsFromRegistry(void)
|
||||||
|
|
||||||
QueryDword(hKey, _T("iWindowPosX"), (DWORD*)&Globals.main_rect.left);
|
QueryDword(hKey, _T("iWindowPosX"), (DWORD*)&Globals.main_rect.left);
|
||||||
QueryDword(hKey, _T("iWindowPosY"), (DWORD*)&Globals.main_rect.top);
|
QueryDword(hKey, _T("iWindowPosY"), (DWORD*)&Globals.main_rect.top);
|
||||||
QueryDword(hKey, _T("iWindowPosDX"), (DWORD*)&dx);
|
QueryDword(hKey, _T("iWindowPosDX"), &cx);
|
||||||
QueryDword(hKey, _T("iWindowPosDY"), (DWORD*)&dy);
|
QueryDword(hKey, _T("iWindowPosDY"), &cy);
|
||||||
|
|
||||||
Globals.main_rect.right = Globals.main_rect.left + dx;
|
|
||||||
Globals.main_rect.bottom = Globals.main_rect.top + dy;
|
|
||||||
|
|
||||||
if (dwPointSize != 0)
|
|
||||||
Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize);
|
|
||||||
else
|
|
||||||
Globals.lfFont.lfHeight = HeightFromPointSize(100);
|
|
||||||
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize);
|
||||||
|
Globals.main_rect.right = Globals.main_rect.left + cx;
|
||||||
|
Globals.main_rect.bottom = Globals.main_rect.top + cy;
|
||||||
|
|
||||||
|
if (!hKey || !QueryString(hKey, _T("lfFaceName"),
|
||||||
|
Globals.lfFont.lfFaceName, ARRAY_SIZE(Globals.lfFont.lfFaceName)))
|
||||||
{
|
{
|
||||||
/* If no settings are found in the registry, then use default values */
|
|
||||||
Globals.bShowStatusBar = TRUE;
|
|
||||||
Globals.bWrapLongLines = FALSE;
|
|
||||||
SetRect(&Globals.lMargins, 750, 1000, 750, 1000);
|
|
||||||
|
|
||||||
/* FIXME: Globals.fSaveWindowPositions = FALSE; */
|
|
||||||
/* FIXME: Globals.fMLE_is_broken = FALSE; */
|
|
||||||
|
|
||||||
LoadString(Globals.hInstance, STRING_PAGESETUP_HEADERVALUE, Globals.szHeader,
|
|
||||||
ARRAY_SIZE(Globals.szHeader));
|
|
||||||
LoadString(Globals.hInstance, STRING_PAGESETUP_FOOTERVALUE, Globals.szFooter,
|
|
||||||
ARRAY_SIZE(Globals.szFooter));
|
|
||||||
|
|
||||||
ZeroMemory(&Globals.lfFont, sizeof(Globals.lfFont));
|
|
||||||
Globals.lfFont.lfCharSet = DEFAULT_CHARSET;
|
|
||||||
Globals.lfFont.lfClipPrecision = CLIP_STROKE_PRECIS;
|
|
||||||
Globals.lfFont.lfEscapement = 0;
|
|
||||||
LoadString(Globals.hInstance, STRING_DEFAULTFONT, Globals.lfFont.lfFaceName,
|
LoadString(Globals.hInstance, STRING_DEFAULTFONT, Globals.lfFont.lfFaceName,
|
||||||
ARRAY_SIZE(Globals.lfFont.lfFaceName));
|
ARRAY_SIZE(Globals.lfFont.lfFaceName));
|
||||||
Globals.lfFont.lfItalic = FALSE;
|
}
|
||||||
Globals.lfFont.lfOrientation = 0;
|
|
||||||
Globals.lfFont.lfOutPrecision = OUT_STRING_PRECIS;
|
if (!hKey || !QueryString(hKey, _T("szHeader"), Globals.szHeader, ARRAY_SIZE(Globals.szHeader)))
|
||||||
|
{
|
||||||
|
LoadString(Globals.hInstance, STRING_PAGESETUP_HEADERVALUE, Globals.szHeader,
|
||||||
|
ARRAY_SIZE(Globals.szHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hKey || !QueryString(hKey, _T("szTrailer"), Globals.szFooter, ARRAY_SIZE(Globals.szFooter)))
|
||||||
|
{
|
||||||
|
LoadString(Globals.hInstance, STRING_PAGESETUP_FOOTERVALUE, Globals.szFooter,
|
||||||
|
ARRAY_SIZE(Globals.szFooter));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hKey)
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
/* WORKAROUND: Far East Asian users may not have suitable fixed-pitch fonts. */
|
/* WORKAROUND: Far East Asian users may not have suitable fixed-pitch fonts. */
|
||||||
switch (PRIMARYLANGID(GetUserDefaultLangID()))
|
switch (PRIMARYLANGID(GetUserDefaultLangID()))
|
||||||
|
@ -197,16 +208,6 @@ void NOTEPAD_LoadSettingsFromRegistry(void)
|
||||||
case LANG_KOREAN:
|
case LANG_KOREAN:
|
||||||
Globals.lfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
|
Globals.lfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
Globals.lfFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Globals.lfFont.lfQuality = PROOF_QUALITY;
|
|
||||||
Globals.lfFont.lfStrikeOut = FALSE;
|
|
||||||
Globals.lfFont.lfUnderline = FALSE;
|
|
||||||
Globals.lfFont.lfWeight = FW_NORMAL;
|
|
||||||
Globals.lfFont.lfHeight = HeightFromPointSize(100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hFont = CreateFontIndirect(&Globals.lfFont);
|
hFont = CreateFontIndirect(&Globals.lfFont);
|
||||||
|
|
Loading…
Reference in a new issue