https://git.reactos.org/?p=reactos.git;a=commitdiff;h=38f6fd9df7f8d1f37d7651683da7cf5af85d9f42

commit 38f6fd9df7f8d1f37d7651683da7cf5af85d9f42
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Fri Jan 28 23:46:41 2022 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
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-selchange-notification-message
              * 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);

Reply via email to