https://git.reactos.org/?p=reactos.git;a=commitdiff;h=38f6fd9df7f8d1f37d7651...
commit 38f6fd9df7f8d1f37d7651683da7cf5af85d9f42 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Fri Jan 28 23:46:41 2022 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Jan 30 01:02:10 2022 +0100
[CONSOLE.CPL] Fix problems detected by code analysis.
colors.c(129): warning C6287: Redundant code: the left and right sub-expressions are identical.
colors.c(159): warning C6001: Using uninitialized memory 'colorIndex'. colors.c(180): warning C6385: Reading invalid data from 'ConInfo->ColorTable': the readable size is '64' bytes, but '259696' bytes may be read. (I thank ThFabba for the suggestion fix.)
console.c(313): warning C6387: 'ConInfo->hWnd' could be '0': this does not adhere to the specification for the function 'SendMessageW'.
font.c(60): warning C6387: 'Preview->hFont' could be '0': this does not adhere to the specification for the function 'GetFontCellSize'. font.c(230): warning C6001: Using uninitialized memory 'szFontSize'. font.c(230): warning C6054: String 'szFontSize' might not be zero-terminated. font.c(671): warning C6387: 'hFont' could be '0': this does not adhere to the specification for the function 'GetFontCellSize'.
layout.c(502): warning C6387: 'FontPreview.hFont' could be '0': this does not adhere to the specification for the function 'SelectObject'. --- dll/cpl/console/colors.c | 28 ++++++++++++++++------------ dll/cpl/console/console.c | 18 ++++++++++++------ dll/cpl/console/font.c | 30 ++++++++++++++++++++++++------ dll/cpl/console/layout.c | 3 +++ 4 files changed, 55 insertions(+), 24 deletions(-)
diff --git a/dll/cpl/console/colors.c b/dll/cpl/console/colors.c index f6a8c40e947..fee811d89bc 100644 --- a/dll/cpl/console/colors.c +++ b/dll/cpl/console/colors.c @@ -126,14 +126,16 @@ ColorsProc(HWND hDlg, case WM_COMMAND: { /* NOTE: both BN_CLICKED and STN_CLICKED == 0 */ - if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == STN_CLICKED) + if (HIWORD(wParam) == BN_CLICKED /* || HIWORD(wParam) == STN_CLICKED */) { - if (LOWORD(wParam) == IDC_RADIO_SCREEN_TEXT || - LOWORD(wParam) == IDC_RADIO_SCREEN_BACKGROUND || - LOWORD(wParam) == IDC_RADIO_POPUP_TEXT || - LOWORD(wParam) == IDC_RADIO_POPUP_BACKGROUND) + WORD ctrlIndex = LOWORD(wParam); + + if (ctrlIndex == IDC_RADIO_SCREEN_TEXT || + ctrlIndex == IDC_RADIO_SCREEN_BACKGROUND || + ctrlIndex == IDC_RADIO_POPUP_TEXT || + ctrlIndex == IDC_RADIO_POPUP_BACKGROUND) { - switch (LOWORD(wParam)) + switch (ctrlIndex) { case IDC_RADIO_SCREEN_TEXT: /* Get the colour of the screen foreground */ @@ -169,9 +171,9 @@ ColorsProc(HWND hDlg, break; } else - if (IDC_STATIC_COLOR1 <= LOWORD(wParam) && LOWORD(wParam) <= IDC_STATIC_COLOR16) + if (IDC_STATIC_COLOR1 <= ctrlIndex && ctrlIndex <= IDC_STATIC_COLOR16) { - colorIndex = LOWORD(wParam) - IDC_STATIC_COLOR1; + colorIndex = ctrlIndex - IDC_STATIC_COLOR1;
/* If the same static control was re-clicked, don't take it into account */ if (colorIndex == ActiveStaticControl) @@ -213,9 +215,11 @@ ColorsProc(HWND hDlg, } else if (HIWORD(wParam) == EN_KILLFOCUS) { - if (LOWORD(wParam) == IDC_EDIT_COLOR_RED || - LOWORD(wParam) == IDC_EDIT_COLOR_GREEN || - LOWORD(wParam) == IDC_EDIT_COLOR_BLUE) + WORD ctrlIndex = LOWORD(wParam); + + if (ctrlIndex == IDC_EDIT_COLOR_RED || + ctrlIndex == IDC_EDIT_COLOR_GREEN || + ctrlIndex == IDC_EDIT_COLOR_BLUE) { DWORD value;
@@ -224,7 +228,7 @@ ColorsProc(HWND hDlg, color = ConInfo->ColorTable[colorIndex];
/* Modify the colour component */ - switch (LOWORD(wParam)) + switch (ctrlIndex) { case IDC_EDIT_COLOR_RED: value = GetDlgItemInt(hDlg, IDC_EDIT_COLOR_RED, NULL, FALSE); diff --git a/dll/cpl/console/console.c b/dll/cpl/console/console.c index 09c204c630c..65640bc9282 100644 --- a/dll/cpl/console/console.c +++ b/dll/cpl/console/console.c @@ -112,7 +112,7 @@ ApplyConsoleInfo(HWND hwndDlg) SetConsoleInfo = (res != IDCANCEL); SaveConsoleInfo = (res == IDC_RADIO_APPLY_ALL);
- if (SetConsoleInfo == FALSE) + if (!SetConsoleInfo) { /* Don't destroy when the user presses cancel */ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); @@ -275,7 +275,7 @@ InitApplet(HANDLE hSectionOrWnd) ResetFontPreview(&FontPreview); ClearTTFontCache();
- /* Save the console settings */ + /* Apply the console settings if necessary */ if (SetConsoleInfo) { HANDLE hSection; @@ -303,19 +303,25 @@ InitApplet(HANDLE hSectionOrWnd) goto Quit; }
- /* Copy the console information into the section */ + /* Copy the console information into the section and unmap it */ RtlCopyMemory(pSharedInfo, ConInfo, ConInfo->cbSize); - - /* Unmap it */ UnmapViewOfFile(pSharedInfo);
- /* Signal to CONSRV that it can apply the new configuration */ + /* + * Signal to CONSRV that it can apply the new settings. + * + * NOTE: SetConsoleInfo set to TRUE by ApplyConsoleInfo() + * *only* when ConInfo->hWnd != NULL and the user did not + * press IDCANCEL in the confirmation dialog. + */ + ASSERT(ConInfo->hWnd); SendMessageW(ConInfo->hWnd, WM_SETCONSOLEINFO, (WPARAM)hSection, 0);
/* Close the section and return */ CloseHandle(hSection); }
+ /* Save the console settings */ if (SaveConsoleInfo) { /* Default settings saved when ConInfo->hWnd == NULL */ diff --git a/dll/cpl/console/font.c b/dll/cpl/console/font.c index 0909417dfee..4cb5f4c61d3 100644 --- a/dll/cpl/console/font.c +++ b/dll/cpl/console/font.c @@ -53,11 +53,16 @@ RefreshFontPreview( IN FONT_PREVIEW* Preview, IN PCONSOLE_STATE_INFO pConInfo) { - if (Preview->hFont) DeleteObject(Preview->hFont); - Preview->hFont = CreateConsoleFont(pConInfo); - if (Preview->hFont == NULL) + HFONT hFont = CreateConsoleFont(pConInfo); + if (!hFont) + { DPRINT1("RefreshFontPreview: CreateConsoleFont() failed\n"); - GetFontCellSize(NULL, Preview->hFont, &Preview->CharHeight, &Preview->CharWidth); + return; + } + + if (Preview->hFont) DeleteObject(Preview->hFont); + Preview->hFont = hFont; + GetFontCellSize(NULL, hFont, &Preview->CharHeight, &Preview->CharWidth); }
VOID @@ -223,8 +228,17 @@ FontSizeList_GetSelectedFontSize( * See: https://support.microsoft.com/en-us/help/66365/how-to-process-a-cbn-selchang... * for more details. */ + INT Length; + nSel = (INT)SendMessageW(SizeList->hWndTTSizeList, CB_GETCURSEL, 0, 0); - SendMessageW(SizeList->hWndTTSizeList, CB_GETLBTEXT, nSel, (LPARAM)szFontSize); + if (nSel == CB_ERR) return 0; + + Length = (INT)SendMessageW(SizeList->hWndTTSizeList, CB_GETLBTEXTLEN, nSel, 0); + ASSERT((Length != LB_ERR) && (Length < ARRAYSIZE(szFontSize))); + + Length = (INT)SendMessageW(SizeList->hWndTTSizeList, CB_GETLBTEXT, nSel, (LPARAM)szFontSize); + ASSERT((Length != LB_ERR) && (Length < ARRAYSIZE(szFontSize))); + szFontSize[Length] = L'\0';
/* Validate the font size */ FontSize = wcstoul(szFontSize, &pszNext, 10); @@ -558,6 +572,7 @@ FontTypeChange( if (FaceName == NULL) return FALSE;
Length = (INT)SendMessageW(hFontList, LB_GETTEXT, nSel, (LPARAM)FaceName); + ASSERT(Length != LB_ERR); FaceName[Length] = L'\0';
StringCchCopyW(pConInfo->FaceName, ARRAYSIZE(pConInfo->FaceName), FaceName); @@ -664,8 +679,11 @@ FontSizeChange( CharWidth = (UINT)(SizeList->UseRasterOrTTList ? LOWORD(FontSize) : 0);
hFont = CreateConsoleFont2((LONG)CharHeight, (LONG)CharWidth, pConInfo); - if (hFont == NULL) + if (!hFont) + { DPRINT1("FontSizeChange: CreateConsoleFont2() failed\n"); + return FALSE; + }
/* Retrieve the real character size in pixels */ GetFontCellSize(NULL, hFont, &CharHeight, &CharWidth); diff --git a/dll/cpl/console/layout.c b/dll/cpl/console/layout.c index 8430b3de218..e275b518b9f 100644 --- a/dll/cpl/console/layout.c +++ b/dll/cpl/console/layout.c @@ -497,6 +497,9 @@ PaintText( /* Refresh the font preview, getting a new font if necessary */ if (FontPreview.hFont == NULL) RefreshFontPreview(&FontPreview, pConInfo); + /* Recheck hFont since RefreshFontPreview() may not have updated it */ + if (FontPreview.hFont == NULL) + return;
/* Draw the preview text using the current font */ hOldFont = SelectObject(drawItem->hDC, FontPreview.hFont);