From eb52e65beccd66e8ebdb1d8897b609c331b21bcc Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 6 Sep 2014 19:54:35 +0000 Subject: [PATCH] (svn r26777) -Codechange: use safe string functions in squirrel code as well, and prevent using the ones that are deemed unsafe --- src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp | 5 ++++ src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqapi.cpp | 12 +++++++-- src/3rdparty/squirrel/squirrel/sqbaselib.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqclass.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqcompiler.cpp | 9 ++++++- src/3rdparty/squirrel/squirrel/sqdebug.cpp | 26 +++++++++++++------ .../squirrel/squirrel/sqfuncstate.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqlexer.cpp | 6 ++++- src/3rdparty/squirrel/squirrel/sqmem.cpp | 13 +++++++--- src/3rdparty/squirrel/squirrel/sqobject.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqstate.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqtable.cpp | 5 ++++ src/3rdparty/squirrel/squirrel/sqvm.cpp | 18 +++++++++---- 14 files changed, 104 insertions(+), 20 deletions(-) diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp index c4002bf2ca..fcd3c33bec 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp @@ -1,9 +1,14 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include #include #include +#include "../../../safeguards.h" + void sqstd_printcallstack(HSQUIRRELVM v) { SQPRINTFUNCTION pf = sq_getprintfunc(v); diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp index 0f5d65194d..e1c9da2660 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp @@ -1,9 +1,14 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include #include #include +#include "../../../safeguards.h" + #define SINGLE_ARG_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \ SQFloat f; \ sq_decreaseops(v,num_ops); \ diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index 1f523e71cf..179df117f0 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include "sqpcheader.h" #include "sqvm.h" @@ -14,6 +17,10 @@ #include "sqfuncstate.h" #include "sqclass.h" +#include "../../../string_func.h" + +#include "../../../safeguards.h" + bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o) { *o = &stack_get(v,idx); @@ -40,8 +47,9 @@ SQInteger sq_aux_throwobject(HSQUIRRELVM v,SQObjectPtr &e) SQInteger sq_aux_invalidtype(HSQUIRRELVM v,SQObjectType type) { - sprintf(_ss(v)->GetScratchPad(100), "unexpected type %s", IdType2Name(type)); - return sq_throwerror(v, _ss(v)->GetScratchPad(-1)); + char buf[100]; + seprintf(buf, lastof(buf), "unexpected type %s", IdType2Name(type)); + return sq_throwerror(v, buf); } HSQUIRRELVM sq_open(SQInteger initialstacksize) diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index f29ed60be7..28de341948 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -3,6 +3,9 @@ */ /* Needs to be first due to a squirrel header defining type() and type() * being used in some versions of the headers included by algorithm. */ + +#include "../../../stdafx.h" + #include #include "sqpcheader.h" #include "sqvm.h" @@ -16,6 +19,8 @@ #include #include +#include "../../../safeguards.h" + bool str2num(const SQChar *s,SQObjectPtr &res) { SQChar *end; diff --git a/src/3rdparty/squirrel/squirrel/sqclass.cpp b/src/3rdparty/squirrel/squirrel/sqclass.cpp index 73c8848b5b..c62cfaf442 100644 --- a/src/3rdparty/squirrel/squirrel/sqclass.cpp +++ b/src/3rdparty/squirrel/squirrel/sqclass.cpp @@ -1,12 +1,17 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include "sqvm.h" #include "sqtable.h" #include "sqclass.h" #include "sqclosure.h" +#include "../../../safeguards.h" + SQClass::SQClass(SQSharedState *ss,SQClass *base) { _base = base; diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp index fc6ede6ac9..596bf96225 100644 --- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp +++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include "sqpcheader.h" #include @@ -13,6 +16,10 @@ #include "sqvm.h" #include "sqtable.h" +#include "../../../string_func.h" + +#include "../../../safeguards.h" + #define DEREF_NO_DEREF -1 #define DEREF_FIELD -2 @@ -66,7 +73,7 @@ public: static SQChar temp[256]; va_list vl; va_start(vl, s); - vsnprintf(temp, sizeof(temp), s, vl); + vseprintf(temp, lastof(temp), s, vl); va_end(vl); throw temp; } diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp index 54f883f4ee..109674f1e2 100644 --- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp +++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include "sqpcheader.h" #include @@ -9,6 +12,11 @@ #include "sqclosure.h" #include "sqstring.h" +#include "../../../core/alloc_func.hpp" +#include "../../../string_func.h" + +#include "../../../safeguards.h" + SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi) { SQInteger cssize = v->_callsstacksize; @@ -60,9 +68,12 @@ void SQVM::Raise_Error(const SQChar *s, ...) { va_list vl; va_start(vl, s); - vsprintf(_sp(rsl((SQInteger)strlen(s)+(NUMBER_MAX_CHAR*2))), s, vl); + size_t len = strlen(s)+(NUMBER_MAX_CHAR*2); + char *buffer = MallocT(len + 1); + vseprintf(buffer, buffer + len, s, vl); va_end(vl); - _lasterror = SQString::Create(_ss(this),_spval,-1); + _lasterror = SQString::Create(_ss(this),buffer,-1); + free(buffer); } void SQVM::Raise_Error(SQObjectPtr &desc) @@ -72,16 +83,15 @@ void SQVM::Raise_Error(SQObjectPtr &desc) SQString *SQVM::PrintObjVal(const SQObject &o) { + char buf[NUMBER_MAX_CHAR+1]; switch(type(o)) { case OT_STRING: return _string(o); case OT_INTEGER: - sprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), SQ_PRINTF64, _integer(o)); - return SQString::Create(_ss(this), _spval); - break; + seprintf(buf, lastof(buf), SQ_PRINTF64, _integer(o)); + return SQString::Create(_ss(this), buf); case OT_FLOAT: - sprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), "%.14g", _float(o)); - return SQString::Create(_ss(this), _spval); - break; + seprintf(buf, lastof(buf), "%.14g", _float(o)); + return SQString::Create(_ss(this), buf); default: return SQString::Create(_ss(this), GetTypeName(o)); } diff --git a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp index 91219adf86..0259d47d8d 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include "sqcompiler.h" #include "sqfuncproto.h" @@ -9,6 +12,8 @@ #include "sqopcodes.h" #include "sqfuncstate.h" +#include "../../../safeguards.h" + #ifdef _DEBUG_DUMP SQInstructionDesc g_InstrDesc[]={ {"_OP_LINE"}, diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.cpp b/src/3rdparty/squirrel/squirrel/sqlexer.cpp index 4653ab0a80..3d2ab05fae 100644 --- a/src/3rdparty/squirrel/squirrel/sqlexer.cpp +++ b/src/3rdparty/squirrel/squirrel/sqlexer.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include #include @@ -9,9 +12,10 @@ #include "sqcompiler.h" #include "sqlexer.h" -#include "../../../stdafx.h" #include "../../../string_func.h" +#include "../../../safeguards.h" + #define CUR_CHAR (_currdata) #define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;} #define IS_EOB() (CUR_CHAR <= SQUIRREL_EOB) diff --git a/src/3rdparty/squirrel/squirrel/sqmem.cpp b/src/3rdparty/squirrel/squirrel/sqmem.cpp index 26d07047ed..4ab8db44b7 100644 --- a/src/3rdparty/squirrel/squirrel/sqmem.cpp +++ b/src/3rdparty/squirrel/squirrel/sqmem.cpp @@ -1,9 +1,16 @@ /* see copyright notice in squirrel.h */ -#include "sqpcheader.h" -void *sq_vm_malloc(SQUnsignedInteger size){ return malloc((size_t)size); } -void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return realloc(p, (size_t)size); } +#include "../../../stdafx.h" + +#include "sqpcheader.h" + +#include "../../../core/alloc_func.hpp" +#include "../../../safeguards.h" + +void *sq_vm_malloc(SQUnsignedInteger size){ return MallocT((size_t)size); } + +void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return ReallocT(static_cast(p), (size_t)size); } void sq_vm_free(void *p, SQUnsignedInteger size){ free(p); } diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index 1983e937b8..da7f600033 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include "sqvm.h" #include "sqstring.h" @@ -11,6 +14,8 @@ #include "sqclass.h" #include "sqclosure.h" +#include "../../../safeguards.h" + const SQChar *IdType2Name(SQObjectType type) { diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index bd270d4705..c518f73b95 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include "sqopcodes.h" #include "sqvm.h" @@ -12,6 +15,8 @@ #include "squserdata.h" #include "sqclass.h" +#include "../../../safeguards.h" + SQObjectPtr _null_; SQObjectPtr _true_(true); SQObjectPtr _false_(false); diff --git a/src/3rdparty/squirrel/squirrel/sqtable.cpp b/src/3rdparty/squirrel/squirrel/sqtable.cpp index bb5feba3e7..8a54328b3f 100644 --- a/src/3rdparty/squirrel/squirrel/sqtable.cpp +++ b/src/3rdparty/squirrel/squirrel/sqtable.cpp @@ -1,12 +1,17 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include "sqpcheader.h" #include "sqvm.h" #include "sqtable.h" #include "sqfuncproto.h" #include "sqclosure.h" +#include "../../../safeguards.h" + SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize) { SQInteger pow2size=MINPOWER2; diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index e94f051185..beba018bfc 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -1,6 +1,9 @@ /* see copyright notice in squirrel.h */ + +#include "../../../stdafx.h" + #include #include "sqpcheader.h" #include @@ -15,6 +18,10 @@ #include "sqarray.h" #include "sqclass.h" +#include "../../../string_func.h" + +#include "../../../safeguards.h" + #define TOP() (_stack._vals[_top-1]) #define CLEARSTACK(_last_top) { if((_last_top) >= _top) ClearStack(_last_top); } @@ -251,18 +258,19 @@ bool SQVM::CMP_OP(CmpOP op, const SQObjectPtr &o1,const SQObjectPtr &o2,SQObject void SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) { + char buf[64]; switch(type(o)) { case OT_STRING: res = o; return; case OT_FLOAT: - sprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),"%g",_float(o)); + seprintf(buf, lastof(buf),"%g",_float(o)); break; case OT_INTEGER: - sprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),SQ_PRINTF64,_integer(o)); + seprintf(buf, lastof(buf),SQ_PRINTF64,_integer(o)); break; case OT_BOOL: - sprintf(_sp(rsl(6)),_integer(o)?"true":"false"); + seprintf(buf, lastof(buf),_integer(o)?"true":"false"); break; case OT_TABLE: case OT_USERDATA: @@ -276,9 +284,9 @@ void SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) } } default: - sprintf(_sp(rsl(sizeof(void*)+20)),"(%s : 0x%p)",GetTypeName(o),(void*)_rawval(o)); + seprintf(buf, lastof(buf),"(%s : 0x%p)",GetTypeName(o),(void*)_rawval(o)); } - res = SQString::Create(_ss(this),_spval); + res = SQString::Create(_ss(this),buf); }