https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ede60035f4f03729c1ad1…
commit ede60035f4f03729c1ad1f9a04b6a6a9e9675350
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sun Nov 19 21:46:00 2023 +0900
Commit: GitHub <noreply(a)github.com>
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) ||