String safety (#1548)

* Array size UB fixes

* Fix ShieldD

* Remove (almost) all unsafe strcpy calls

Bunch of macros. C arrays are easy enough and just need a different call. For various cases where a char* is passed around bare, I've made a TEXT_SPAN macro that can store a length too for bounds checking.

* Move crash handling in safe string operations to separate TU

* strcat safe version

* sprintf made safe too

* Fix compile
This commit is contained in:
Pieter-Jan Briers
2026-05-24 18:43:00 +02:00
committed by GitHub
parent af162bbd0a
commit a6376368ee
100 changed files with 781 additions and 546 deletions
+4 -4
View File
@@ -1224,8 +1224,8 @@ BOOL dDlst_TimerScrnDraw_c::closeAnime() {
int dDlst_TimerScrnDraw_c::createGetIn(cXyz i_pos) {
char string[104];
dMeter2Info_getString(0x3E4, string, NULL); // "GOAT IN!"
strcpy(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in_s')))->getStringPtr(), string);
strcpy(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in')))->getStringPtr(), string);
SAFE_STRCPY(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in_s')))->getStringPtr(), string);
SAFE_STRCPY(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in')))->getStringPtr(), string);
if (mCowID < 50) {
m_getin_info[mCowID].bck_frame = 40.0f;
@@ -1313,8 +1313,8 @@ int dDlst_TimerScrnDraw_c::createGetIn(cXyz i_pos) {
s32 dDlst_TimerScrnDraw_c::createStart(u16 i_messageID) {
char string[112];
dMeter2Info_getString(i_messageID, string, NULL);
strcpy(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in_s')))->getStringPtr(), string);
strcpy(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in')))->getStringPtr(), string);
SAFE_STRCPY(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in_s')))->getStringPtr(), string);
SAFE_STRCPY(static_cast<J2DTextBox*>(mpGetInScreen->search(MULTI_CHAR('get_in')))->getStringPtr(), string);
if (mCowID == 0) {
m_getin_info[mCowID].bck_frame = 40.0f;