https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8cef980ab96b7027120f759ccd467bbaa278302b

commit 8cef980ab96b7027120f759ccd467bbaa278302b
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Thu Oct 26 10:09:31 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Oct 26 10:09:31 2023 +0900

    [REGEDIT] Use <strsafe.h> functions strictly (#5825)
    
    Use safer functions for buffer manipulation to avoid buffer 
overflow/overrun.
    CORE-18876
---
 base/applications/regedit/childwnd.c |  9 +++++----
 base/applications/regedit/edit.c     | 26 ++++++++++++++------------
 base/applications/regedit/find.c     | 21 ++++++++++-----------
 base/applications/regedit/framewnd.c |  8 +++++---
 base/applications/regedit/security.c |  3 +--
 base/applications/regedit/txtproc.c  |  5 +++--
 6 files changed, 38 insertions(+), 34 deletions(-)

diff --git a/base/applications/regedit/childwnd.c 
b/base/applications/regedit/childwnd.c
index 67a88bc90a5..d77ed1899b3 100644
--- a/base/applications/regedit/childwnd.c
+++ b/base/applications/regedit/childwnd.c
@@ -177,7 +177,7 @@ static void SuggestKeys(HKEY hRootKey, LPCWSTR pszKeyPath, 
LPWSTR pszSuggestions
                         RegCloseKey(hOtherKey);
 
                         bFound = TRUE;
-                        wcscpy(szLastFound, szBuffer);
+                        StringCbCopyW(szLastFound, sizeof(szLastFound), 
szBuffer);
                         pszKeyPath = szLastFound;
                     }
                 }
@@ -258,10 +258,11 @@ UpdateAddress(HTREEITEM hItem, HKEY hRootKey, LPCWSTR 
pszPath, BOOL bSelectNone)
         if (fullPath)
         {
             /* set (correct) the address bar text */
-            if (keyPath[0] != L'\0')
-                swprintf(fullPath, L"%s%s%s", rootName, 
keyPath[0]==L'\\'?L"":L"\\", keyPath);
+            if (keyPath[0] != UNICODE_NULL)
+                StringCbPrintfW(fullPath, cbFullPath, L"%s%s%s", rootName,
+                                ((keyPath[0] == L'\\') ? L"" : L"\\"), 
keyPath);
             else
-                fullPath = wcscpy(fullPath, rootName);
+                StringCbCopyW(fullPath, cbFullPath, rootName);
 
             SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath);
             SendMessageW(g_pChildWnd->hAddressBarWnd, WM_SETTEXT, 0, 
(LPARAM)fullPath);
diff --git a/base/applications/regedit/edit.c b/base/applications/regedit/edit.c
index d84361c7a0a..8805ccb35e7 100644
--- a/base/applications/regedit/edit.c
+++ b/base/applications/regedit/edit.c
@@ -50,10 +50,10 @@ void error(HWND hwnd, INT resId, ...)
     hInstance = GetModuleHandle(0);
 
     if (!LoadStringW(hInstance, IDS_ERROR, title, ARRAY_SIZE(title)))
-        wcscpy(title, L"Error");
+        StringCbCopyW(title, sizeof(title), L"Error");
 
     if (!LoadStringW(hInstance, resId, errfmt, ARRAY_SIZE(errfmt)))
-        wcscpy(errfmt, L"Unknown error string!");
+        StringCbCopyW(errfmt, sizeof(errfmt), L"Unknown error string!");
 
     va_start(ap, resId);
     _vsnwprintf(errstr, ARRAY_SIZE(errstr), errfmt, ap);
@@ -66,7 +66,7 @@ static void error_code_messagebox(HWND hwnd, DWORD error_code)
 {
     WCHAR title[256];
     if (!LoadStringW(hInst, IDS_ERROR, title, ARRAY_SIZE(title)))
-        wcscpy(title, L"Error");
+        StringCbCopyW(title, sizeof(title), L"Error");
     ErrorMessageBox(hwnd, title, error_code);
 }
 
@@ -81,13 +81,13 @@ void warning(HWND hwnd, INT resId, ...)
     hInstance = GetModuleHandle(0);
 
     if (!LoadStringW(hInstance, IDS_WARNING, title, ARRAY_SIZE(title)))
-        wcscpy(title, L"Warning");
+        StringCbCopyW(title, sizeof(title), L"Warning");
 
     if (!LoadStringW(hInstance, resId, errfmt, ARRAY_SIZE(errfmt)))
-        wcscpy(errfmt, L"Unknown error string!");
+        StringCbCopyW(errfmt, sizeof(errfmt), L"Unknown error string!");
 
     va_start(ap, resId);
-    _vsnwprintf(errstr, ARRAY_SIZE(errstr), errfmt, ap);
+    StringCbVPrintfW(errstr, sizeof(errstr), errfmt, ap);
     va_end(ap);
 
     MessageBoxW(hwnd, errstr, title, MB_OK | MB_ICONSTOP);
@@ -304,7 +304,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT 
uMsg, WPARAM wParam, LP
             SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, buffer);
         }
         CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, 
IDC_FORMAT_HEX);
-        swprintf(ValueString, L"%lx", dwordValueData);
+        StringCbPrintfW(ValueString, sizeof(ValueString), L"%lx", 
dwordValueData);
         SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
         SendMessage(GetDlgItem(hwndDlg, IDC_VALUE_DATA), EM_SETSEL, 0, -1);
         SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
@@ -327,7 +327,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT 
uMsg, WPARAM wParam, LP
                         }
                     }
                 }
-                swprintf(ValueString, L"%lx", Value);
+                StringCbPrintfW(ValueString, sizeof(ValueString), L"%lx", 
Value);
                 SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
                 return TRUE;
             }
@@ -347,7 +347,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT 
uMsg, WPARAM wParam, LP
                         }
                     }
                 }
-                swprintf(ValueString, L"%lu", Value);
+                StringCbPrintfW(ValueString, sizeof(ValueString), L"%lu", 
Value);
                 SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
                 return TRUE;
             }
@@ -1491,6 +1491,7 @@ LONG RenameKey(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR 
lpNewName)
     LPCWSTR s;
     LPWSTR lpNewSubKey = NULL;
     LONG Ret = 0;
+    SIZE_T cbNewSubKey;
 
     if (!lpSubKey)
         return Ret;
@@ -1499,11 +1500,12 @@ LONG RenameKey(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR 
lpNewName)
     if (s)
     {
         s++;
-        lpNewSubKey = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (s - lpSubKey + 
wcslen(lpNewName) + 1) * sizeof(WCHAR));
+        cbNewSubKey = (s - lpSubKey + wcslen(lpNewName) + 1) * sizeof(WCHAR);
+        lpNewSubKey = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, cbNewSubKey);
         if (lpNewSubKey != NULL)
         {
-            memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(WCHAR));
-            wcscpy(lpNewSubKey + (s - lpSubKey), lpNewName);
+            StringCbCopyNW(lpNewSubKey, cbNewSubKey, lpSubKey, (s - lpSubKey) 
* sizeof(WCHAR));
+            StringCbCatW(lpNewSubKey, cbNewSubKey, lpNewName);
             lpNewName = lpNewSubKey;
         }
         else
diff --git a/base/applications/regedit/find.c b/base/applications/regedit/find.c
index 444f4a25952..9405271a916 100644
--- a/base/applications/regedit/find.c
+++ b/base/applications/regedit/find.c
@@ -144,7 +144,7 @@ BOOL RegFindRecurse(
     if(wcslen(pszSubKey) >= _countof(szSubKey))
         return FALSE;
 
-    wcscpy(szSubKey, pszSubKey);
+    StringCbCopyW(szSubKey, sizeof(szSubKey), pszSubKey);
     hSubKey = NULL;
 
     lResult = RegOpenKeyExW(hKey, szSubKey, 0, KEY_ALL_ACCESS, &hSubKey);
@@ -304,14 +304,14 @@ BOOL RegFindRecurse(
                            ppszFoundValueName))
         {
             LPWSTR psz = *ppszFoundSubKey;
-            *ppszFoundSubKey = malloc(
-                                   (wcslen(szSubKey) + wcslen(psz) + 2) * 
sizeof(WCHAR));
+            SIZE_T cbFoundSubKey = (wcslen(szSubKey) + wcslen(psz) + 2) * 
sizeof(WCHAR);
+            *ppszFoundSubKey = malloc(cbFoundSubKey);
             if (*ppszFoundSubKey == NULL)
                 goto err;
             if (szSubKey[0])
             {
-                wcscpy(*ppszFoundSubKey, szSubKey);
-                wcscat(*ppszFoundSubKey, s_backslash);
+                StringCbCopyW(*ppszFoundSubKey, cbFoundSubKey, szSubKey);
+                StringCbCatW(*ppszFoundSubKey, cbFoundSubKey, s_backslash);
             }
             else
                 **ppszFoundSubKey = 0;
@@ -368,7 +368,7 @@ BOOL RegFindWalk(
                        ppszFoundValueName))
         return TRUE;
 
-    wcscpy(szSubKey, pszSubKey);
+    StringCbCopyW(szSubKey, sizeof(szSubKey), pszSubKey);
     while(szSubKey[0] != 0)
     {
         if (DoEvents())
@@ -460,15 +460,14 @@ BOOL RegFindWalk(
                                ppszFoundSubKey, ppszFoundValueName))
             {
                 LPWSTR psz = *ppszFoundSubKey;
-                *ppszFoundSubKey = malloc(
-                                       (wcslen(szSubKey) + wcslen(psz) + 2) *
-                                       sizeof(WCHAR));
+                SIZE_T cbFoundSubKey = (wcslen(szSubKey) + wcslen(psz) + 2) * 
sizeof(WCHAR);
+                *ppszFoundSubKey = malloc(cbFoundSubKey);
                 if (*ppszFoundSubKey == NULL)
                     goto err;
                 if (szSubKey[0])
                 {
-                    wcscpy(*ppszFoundSubKey, szSubKey);
-                    wcscat(*ppszFoundSubKey, s_backslash);
+                    StringCbCopyW(*ppszFoundSubKey, cbFoundSubKey, szSubKey);
+                    StringCbCatW(*ppszFoundSubKey, cbFoundSubKey, s_backslash);
                 }
                 else
                     **ppszFoundSubKey = 0;
diff --git a/base/applications/regedit/framewnd.c 
b/base/applications/regedit/framewnd.c
index 6b5b1c28cfb..6f382a072cd 100644
--- a/base/applications/regedit/framewnd.c
+++ b/base/applications/regedit/framewnd.c
@@ -138,7 +138,7 @@ static void OnMenuSelect(HWND hWnd, UINT nItemID, UINT 
nFlags, HMENU hSysMenu)
 {
     WCHAR str[100];
 
-    wcscpy(str, L"");
+    str[0] = UNICODE_NULL;
     if (nFlags & MF_POPUP)
     {
         if (hSysMenu != GetMenu(hWnd))
@@ -814,6 +814,7 @@ BOOL CopyKeyName(HWND hWnd, HKEY hRootKey, LPCWSTR keyName)
     WCHAR szBuffer[512];
     HGLOBAL hGlobal;
     LPWSTR s;
+    SIZE_T cbGlobal;
 
     if (!OpenClipboard(hWnd))
         goto done;
@@ -825,12 +826,13 @@ BOOL CopyKeyName(HWND hWnd, HKEY hRootKey, LPCWSTR 
keyName)
     if (!GetKeyName(szBuffer, ARRAY_SIZE(szBuffer), hRootKey, keyName))
         goto done;
 
-    hGlobal = GlobalAlloc(GMEM_MOVEABLE, (wcslen(szBuffer) + 1) * 
sizeof(WCHAR));
+    cbGlobal = (wcslen(szBuffer) + 1) * sizeof(WCHAR);
+    hGlobal = GlobalAlloc(GMEM_MOVEABLE, cbGlobal);
     if (!hGlobal)
         goto done;
 
     s = GlobalLock(hGlobal);
-    wcscpy(s, szBuffer);
+    StringCbCopyW(s, cbGlobal, szBuffer);
     GlobalUnlock(hGlobal);
 
     SetClipboardData(CF_UNICODETEXT, hGlobal);
diff --git a/base/applications/regedit/security.c 
b/base/applications/regedit/security.c
index 71251583e9c..0ea90092d91 100644
--- a/base/applications/regedit/security.c
+++ b/base/applications/regedit/security.c
@@ -782,8 +782,7 @@ CRegKeySecurity_fnConstructor(LPWSTR lpRegKey,
         obj->ObjectInfo = *ObjectInfo;
         obj->Btn = Btn;
         obj->hRootKey = hRootKey;
-        wcscpy(obj->szRegKey,
-                lpRegKey);
+        StringCbCopyW(obj->szRegKey, sizeof(obj->szRegKey), lpRegKey);
     }
     else
         SetLastError(ERROR_NOT_ENOUGH_MEMORY);
diff --git a/base/applications/regedit/txtproc.c 
b/base/applications/regedit/txtproc.c
index f5e3ea041c2..092930e6f7a 100644
--- a/base/applications/regedit/txtproc.c
+++ b/base/applications/regedit/txtproc.c
@@ -194,8 +194,9 @@ static WCHAR *
 txt_build_subkey_path(LPCWSTR path, DWORD path_len, LPCWSTR subkey_name, DWORD 
subkey_len)
 {
     WCHAR *subkey_path;
-    subkey_path = malloc((path_len + subkey_len + 2) * sizeof(WCHAR));
-    swprintf(subkey_path, L"%s\\%s", path, subkey_name);
+    SIZE_T cb_subkey_path = (path_len + subkey_len + 2) * sizeof(WCHAR);
+    subkey_path = malloc(cb_subkey_path);
+    StringCbPrintfW(subkey_path, cb_subkey_path, L"%s\\%s", path, subkey_name);
     return subkey_path;
 }
 

Reply via email to