mirror of
https://github.com/albertodemichelis/squirrel.git
synced 2026-01-12 06:28:43 +01:00
fixed security vulnerabilty in regexp object
This commit is contained in:
@ -12,6 +12,8 @@
|
||||
#define MAX_WFORMAT_LEN 3
|
||||
#define ADDITIONAL_FORMAT_SPACE (100*sizeof(SQChar))
|
||||
|
||||
static SQUserPointer rex_typetag = NULL;
|
||||
|
||||
static SQBool isfmtchr(SQChar ch)
|
||||
{
|
||||
switch(ch) {
|
||||
@ -384,7 +386,9 @@ static SQInteger _string_endswith(HSQUIRRELVM v)
|
||||
|
||||
#define SETUP_REX(v) \
|
||||
SQRex *self = NULL; \
|
||||
sq_getinstanceup(v,1,(SQUserPointer *)&self,0);
|
||||
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer *)&self,rex_typetag))) { \
|
||||
return sq_throwerror(v,_SC("invalid type tag")); \
|
||||
}
|
||||
|
||||
static SQInteger _rexobj_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size))
|
||||
{
|
||||
@ -465,6 +469,13 @@ static SQInteger _regexp_subexpcount(HSQUIRRELVM v)
|
||||
|
||||
static SQInteger _regexp_constructor(HSQUIRRELVM v)
|
||||
{
|
||||
SQRex *self = NULL;
|
||||
if (SQ_FAILED(sq_getinstanceup(v, 1, (SQUserPointer *)&self, rex_typetag))) {
|
||||
return sq_throwerror(v, _SC("invalid type tag"));
|
||||
}
|
||||
if (self != NULL) {
|
||||
return sq_throwerror(v, _SC("invalid regexp object"));
|
||||
}
|
||||
const SQChar *error,*pattern;
|
||||
sq_getstring(v,2,&pattern);
|
||||
SQRex *rex = sqstd_rex_compile(pattern,&error);
|
||||
@ -512,6 +523,8 @@ SQInteger sqstd_register_stringlib(HSQUIRRELVM v)
|
||||
{
|
||||
sq_pushstring(v,_SC("regexp"),-1);
|
||||
sq_newclass(v,SQFalse);
|
||||
rex_typetag = (SQUserPointer)rexobj_funcs;
|
||||
sq_settypetag(v, -1, rex_typetag);
|
||||
SQInteger i = 0;
|
||||
while(rexobj_funcs[i].name != 0) {
|
||||
const SQRegFunction &f = rexobj_funcs[i];
|
||||
|
||||
Reference in New Issue
Block a user