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

commit ede60035f4f03729c1ad1f9a04b6a6a9e9675350
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Sun Nov 19 21:46:00 2023 +0900
Commit:     GitHub <[email protected]>
CommitDate: Sun Nov 19 21:46:00 2023 +0900

    [CALC] Adapt to <strsafe.h> (#5894)
    
    Use safer string functions of  <strsafe.h>.
    Use StringCbPrintf instead of _stprintf.
    Use StringCbCopy insteaad of _tcscpy.
    Use StringCbCat instead of _tcscat.
    CORE-19306
---
 base/applications/calc/calc.h     |  1 +
 base/applications/calc/utl_ieee.c |  8 +++----
 base/applications/calc/utl_mpfr.c |  2 +-
 base/applications/calc/winmain.c  | 50 +++++++++++++++++++++++----------------
 4 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/base/applications/calc/calc.h b/base/applications/calc/calc.h
index 3af74cc3701..05f9d6104c6 100644
--- a/base/applications/calc/calc.h
+++ b/base/applications/calc/calc.h
@@ -15,6 +15,7 @@
 #include <htmlhelp.h>
 #endif
 #include <limits.h>
+#include <strsafe.h>
 
 /* RESOURCES */
 #include "resource.h"
diff --git a/base/applications/calc/utl_ieee.c 
b/base/applications/calc/utl_ieee.c
index 69be266f617..8bc8181f9c9 100644
--- a/base/applications/calc/utl_ieee.c
+++ b/base/applications/calc/utl_ieee.c
@@ -27,7 +27,7 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, 
int size, int base)
 
     switch (base) {
     case IDC_RADIO_HEX:
-        _stprintf(buffer, _T("%I64X"), rpn->i);
+        StringCchPrintf(buffer, size, _T("%I64X"), rpn->i);
         break;
     case IDC_RADIO_DEC:
 /*
@@ -40,11 +40,11 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR 
*buffer, int size, int base)
         /* calculate the width of integer number */
         width = (rpn->f==0) ? 1 : (int)log10(fabs(rpn->f))+1;
         if (calc.sci_out == TRUE || width > MAX_LD_WIDTH || width < 
-MAX_LD_WIDTH)
-            _stprintf(buffer, _T("%#.*e"), MAX_LD_WIDTH-1, rpn->f);
+            StringCchPrintf(buffer, size, _T("%#.*e"), MAX_LD_WIDTH-1, rpn->f);
         else {
             TCHAR *ptr, *dst;
 
-            ptr = buffer + _stprintf(buffer, _T("%#*.*f"), width, 
((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
+            StringCchPrintfEx(buffer, size, &ptr, NULL, 0, _T("%#*.*f"), 
width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
             /* format string ensures there is a '.': */
             dst = _tcschr(buffer, _T('.'));
             while (--ptr > dst)
@@ -61,7 +61,7 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, 
int size, int base)
 #undef MAX_LD_WIDTH
         break;
     case IDC_RADIO_OCT:
-        _stprintf(buffer, _T("%I64o"), rpn->i);
+        StringCchPrintf(buffer, size, _T("%I64o"), rpn->i);
         break;
     case IDC_RADIO_BIN:
         if (rpn->i == 0) {
diff --git a/base/applications/calc/utl_mpfr.c 
b/base/applications/calc/utl_mpfr.c
index 5c2d797e806..40686430407 100644
--- a/base/applications/calc/utl_mpfr.c
+++ b/base/applications/calc/utl_mpfr.c
@@ -107,7 +107,7 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR 
*buffer, int size, int base)
     }
     mpz_clear(zz);
     mpf_clear(ff);
-    _sntprintf(buffer, SIZEOF(calc.buffer), _T("%hs"), temp);
+    StringCchPrintf(buffer, size, _T("%hs"), temp);
 }
 
 void convert_text2number_2(calc_number_t *a)
diff --git a/base/applications/calc/winmain.c b/base/applications/calc/winmain.c
index cc26983cc52..974216b6f14 100644
--- a/base/applications/calc/winmain.c
+++ b/base/applications/calc/winmain.c
@@ -254,10 +254,10 @@ static void UpdateNumberIntl(void)
 {
     /* Get current user defaults */
     if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, calc.sDecimal, 
SIZEOF(calc.sDecimal)))
-        _tcscpy(calc.sDecimal, _T("."));
+        StringCbCopy(calc.sDecimal, sizeof(calc.sDecimal), _T("."));
 
     if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, calc.sThousand, 
SIZEOF(calc.sThousand)))
-        _tcscpy(calc.sThousand, _T(","));
+        StringCbCopy(calc.sThousand, sizeof(calc.sThousand), _T(","));
 
     /* get the string lengths */
     calc.sDecimal_len = _tcslen(calc.sDecimal);
@@ -342,7 +342,7 @@ static void save_config(void)
     switch (osvi.dwPlatformId) {
     case VER_PLATFORM_WIN32s:
     case VER_PLATFORM_WIN32_WINDOWS:
-        _stprintf(buf, _T("%lu"), calc.layout);
+        StringCbPrintf(buf, sizeof(buf), _T("%lu"), calc.layout);
         WriteProfileString(_T("SciCalc"), _T("layout"), buf);
         WriteProfileString(_T("SciCalc"), _T("UseSep"), (calc.usesep==TRUE) ? 
_T("1") : _T("0"));
         break;
@@ -496,16 +496,16 @@ static void update_lcd_display(HWND hwnd)
     TCHAR tmp[MAX_CALC_SIZE * 2 + 2];
 
     if (calc.buffer[0] == _T('\0'))
-        _tcscpy(tmp, _T("0"));
+        StringCbCopy(tmp, sizeof(tmp), _T("0"));
     else
-        _tcscpy(tmp, calc.buffer);
+        StringCbCopy(tmp, sizeof(tmp), calc.buffer);
 
     /* Add final '.' in decimal mode (if it's missing), but
      * only if it's a result: no append if it prints "ERROR".
      */
     if (calc.base == IDC_RADIO_DEC && !calc.is_nan) {
         if (_tcschr(tmp, _T('.')) == NULL)
-            _tcscat(tmp, _T("."));
+            StringCbCat(tmp, sizeof(tmp), _T("."));
     }
     /* if separator mode is on, let's add an additional space */
     if (calc.usesep && !calc.sci_in && !calc.sci_out && !calc.is_nan) {
@@ -573,13 +573,14 @@ static void update_parent_display(HWND hWnd)
     if (!n)
         str[0] = _T('\0');
     else
-        _stprintf(str,_T("(=%d"), n);
+        StringCbPrintf(str, sizeof(str), _T("(=%d"), n);
     SetDlgItemText(hWnd, IDC_TEXT_PARENT, str);
 }
 
 static void build_operand(HWND hwnd, DWORD idc)
 {
     unsigned int i = 0, n;
+    size_t cbPtr;
 
     if (idc == IDC_BUTTON_DOT) {
         /* if dot is the first char, it's added automatically */
@@ -617,12 +618,14 @@ static void build_operand(HWND hwnd, DWORD idc)
             if (idc != IDC_STATIC)
                 calc.esp = (calc.esp * 10 + (key2code[i].key-'0')) % 
LOCAL_EXP_SIZE;
             if (calc.ptr == calc.buffer)
-                _stprintf(calc.ptr, _T("0.e%+d"), calc.esp);
+                StringCbPrintf(calc.ptr, sizeof(calc.buffer), _T("0.e%+d"), 
calc.esp);
             else {
                 /* adds the dot at the end if the number has no decimal part */
                 if (!_tcschr(calc.buffer, _T('.')))
                     *calc.ptr++ = _T('.');
-                _stprintf(calc.ptr, _T("e%+d"), calc.esp);
+
+                cbPtr = sizeof(calc.buffer) - ((BYTE*)calc.ptr - 
(BYTE*)calc.buffer);
+                StringCbPrintf(calc.ptr, cbPtr, _T("e%+d"), calc.esp);
             }
             update_lcd_display(hwnd);
             return;
@@ -637,7 +640,11 @@ static void build_operand(HWND hwnd, DWORD idc)
             return;
         break;
     }
-    calc.ptr += _stprintf(calc.ptr, _T("%C"), key2code[i].key);
+
+    cbPtr = sizeof(calc.buffer) - ((BYTE*)calc.ptr - (BYTE*)calc.buffer);
+    StringCbPrintfEx(calc.ptr, cbPtr, &calc.ptr, NULL, STRSAFE_FILL_ON_FAILURE,
+                     _T("%C"), key2code[i].key);
+
     update_lcd_display(hwnd);
 }
 
@@ -850,11 +857,11 @@ static void update_memory_flag(HWND hWnd, BOOL mem_flag)
     SetDlgItemText(hWnd, IDC_TEXT_MEMORY, mem_flag ? _T("M") : _T(""));
 }
 
-static void update_n_stats_items(HWND hWnd, TCHAR *buffer)
+static void update_n_stats_items(HWND hWnd, TCHAR *buffer, size_t cbBuffer)
 {
     unsigned int n = SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_GETCOUNT, 0, 
0);
 
-    _stprintf(buffer, _T("n=%u"), n);
+    StringCbPrintf(buffer, cbBuffer, _T("n=%u"), n);
     SetDlgItemText(hWnd, IDC_TEXT_NITEMS, buffer);
 }
 
@@ -905,7 +912,7 @@ static char *ReadConversion(const char *formula)
     str[len+1] = ')';
     str[len+2] = '\0';
 
-    _tcscpy(calc.source, (*calc.buffer == _T('\0')) ? _T("0") : calc.buffer);
+    StringCbCopy(calc.source, sizeof(calc.source), (*calc.buffer == _T('\0')) 
? _T("0") : calc.buffer);
 
     /* clear display content before proceeding */
     calc.ptr = calc.buffer;
@@ -942,13 +949,13 @@ static INT_PTR CALLBACK DlgStatProc(HWND hWnd, UINT msg, 
WPARAM wp, LPARAM lp)
             if (n == LB_ERR)
                 return TRUE;
             SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_DELETESTRING, 
(WPARAM)n, 0);
-            update_n_stats_items(hWnd, buffer);
+            update_n_stats_items(hWnd, buffer, sizeof(buffer));
             delete_stat_item(n);
             return TRUE;
         case IDC_BUTTON_CAD:
             SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_RESETCONTENT, 0, 0);
             clean_stat_list();
-            update_n_stats_items(hWnd, buffer);
+            update_n_stats_items(hWnd, buffer, sizeof(buffer));
             return TRUE;
         }
         break;
@@ -964,7 +971,7 @@ static INT_PTR CALLBACK DlgStatProc(HWND hWnd, UINT msg, 
WPARAM wp, LPARAM lp)
                            buffer, SIZEOF(buffer),
                            ((statistic_t *)lp)->base);
         SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_ADDSTRING, 0, 
(LPARAM)buffer);
-        update_n_stats_items(hWnd, buffer);
+        update_n_stats_items(hWnd, buffer, sizeof(buffer));
         return TRUE;
     }
     return FALSE;
@@ -986,11 +993,13 @@ static void CopyMemToClipboard(void *ptr)
     if(OpenClipboard(NULL)) {
         HGLOBAL  clipbuffer;
         TCHAR   *buffer;
+        size_t cbBuffer;
 
         EmptyClipboard();
-        clipbuffer = GlobalAlloc(GMEM_DDESHARE, 
(_tcslen(ptr)+1)*sizeof(TCHAR));
+        cbBuffer = (_tcslen(ptr) + 1) * sizeof(TCHAR);
+        clipbuffer = GlobalAlloc(GMEM_DDESHARE, cbBuffer);
         buffer = (TCHAR *)GlobalLock(clipbuffer);
-        _tcscpy(buffer, ptr);
+        StringCbCopy(buffer, cbBuffer, ptr);
         GlobalUnlock(clipbuffer);
 #ifdef UNICODE
         SetClipboardData(CF_UNICODETEXT,clipbuffer);
@@ -1056,9 +1065,8 @@ static char *handle_sequence_input(HWND hwnd, sequence_t 
*seq)
         }
     } else
     if (ch == '$') {
-        calc.ptr =
-        _tcscpy(calc.buffer, calc.source) +
-        _tcslen(calc.source);
+        StringCbCopyEx(calc.buffer, sizeof(calc.buffer), calc.source, 
&calc.ptr, NULL,
+                       STRSAFE_FILL_ON_FAILURE);
     } else {
         for (x=0; x<SIZEOF(key2code); x++) {
             if (!(key2code[x].mask & BITMASK_IS_ASCII) ||

Reply via email to