From c0e12a2f58fbc935ba043aaca76364a0b56eab0c Mon Sep 17 00:00:00 2001 From: Alexander 'z33ky' Hirsch <1zeeky@gmail.com> Date: Mon, 18 Nov 2024 15:03:09 +0100 Subject: [PATCH] Add type check for script helper assignments from ScriptVariant_t --- .../game/shared/mapbase/vscript_funcs_shared.cpp | 14 ++++++++------ sp/src/vscript/vscript_bindings_base.cpp | 6 ++---- sp/src/vscript/vscript_bindings_math.cpp | 12 ++++-------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp b/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp index 4c6d4817..8a36c7a0 100644 --- a/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp +++ b/sp/src/game/shared/mapbase/vscript_funcs_shared.cpp @@ -560,16 +560,18 @@ bool CAnimEventTInstanceHelper::Set( void *p, const char *pszKey, ScriptVariant_ animevent_t *ani = ((animevent_t *)p); if (FStrEq( pszKey, "event" )) - ani->event = variant; + return variant.AssignTo( &ani->event ); else if (FStrEq( pszKey, "options" )) - ani->options = variant; + // broken: return variant.AssignTo( &ani->options ); + // variant memory is freed afterwards + return false; else if (FStrEq( pszKey, "cycle" )) - ani->cycle = variant; + return variant.AssignTo( &ani->cycle ); else if (FStrEq( pszKey, "eventtime" )) - ani->eventtime = variant; + return variant.AssignTo( &ani->eventtime ); else if (FStrEq( pszKey, "type" )) - ani->type = variant; - else if (FStrEq( pszKey, "source" )) + return variant.AssignTo( &ani->type ); + else if (FStrEq( pszKey, "source" ) && variant.m_type == FIELD_HSCRIPT) { CBaseEntity *pEnt = ToEnt( variant.m_hScript ); if (pEnt) diff --git a/sp/src/vscript/vscript_bindings_base.cpp b/sp/src/vscript/vscript_bindings_base.cpp index 99b6194a..e6ea396b 100644 --- a/sp/src/vscript/vscript_bindings_base.cpp +++ b/sp/src/vscript/vscript_bindings_base.cpp @@ -440,13 +440,11 @@ bool CScriptColorInstanceHelper::Get( void *p, const char *pszKey, ScriptVariant bool CScriptColorInstanceHelper::Set( void *p, const char *pszKey, ScriptVariant_t &variant ) { Color *pClr = ((Color *)p); - if ( strlen(pszKey) == 1 ) + int iVal; + if ( strlen(pszKey) == 1 && variant.AssignTo( &iVal ) ) { - int iVal; - variant.AssignTo( &iVal ); switch (pszKey[0]) { - // variant.AssignTo( &(*pClr)[0] ); case 'r': (*pClr)[0] = iVal; return true; diff --git a/sp/src/vscript/vscript_bindings_math.cpp b/sp/src/vscript/vscript_bindings_math.cpp index fb9c8334..3c83aeec 100644 --- a/sp/src/vscript/vscript_bindings_math.cpp +++ b/sp/src/vscript/vscript_bindings_math.cpp @@ -259,17 +259,13 @@ bool CScriptQuaternionInstanceHelper::Set( void *p, const char *pszKey, ScriptVa switch (pszKey[0]) { case 'x': - variant.AssignTo( &pQuat->x ); - return true; + return variant.AssignTo( &pQuat->x ); case 'y': - variant.AssignTo( &pQuat->y ); - return true; + return variant.AssignTo( &pQuat->y ); case 'z': - variant.AssignTo( &pQuat->z ); - return true; + return variant.AssignTo( &pQuat->z ); case 'w': - variant.AssignTo( &pQuat->w ); - return true; + return variant.AssignTo( &pQuat->w ); } } return false;