[Quest API] Perl Packet Validation Macro

Add validation macro to all packet methods.
This commit is contained in:
Kinglykrab 2021-02-01 22:32:43 -05:00
parent 9b8845949e
commit 381b029ffc

View File

@ -41,6 +41,19 @@
#undef THIS #undef THIS
#endif #endif
#define VALIDATE_THIS_IS_PACKET \
do { \
if (sv_derived_from(ST(0), "PerlPacket")) { \
IV tmp = SvIV((SV*)SvRV(ST(0))); \
THIS = INT2PTR(PerlPacket*, tmp); \
} else { \
Perl_croak(aTHX_ "THIS is not of type PerlPacket"); \
} \
if (THIS == nullptr) { \
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \
} \
} while (0);
XS(XS_PerlPacket_new); /* prototype to pass -Wmissing-prototypes */ XS(XS_PerlPacket_new); /* prototype to pass -Wmissing-prototypes */
XS(XS_PerlPacket_new) XS(XS_PerlPacket_new)
{ {
@ -80,16 +93,7 @@ XS(XS_PerlPacket_DESTROY)
Perl_croak(aTHX_ "Usage: PerlPacket::DESTROY(THIS)"); Perl_croak(aTHX_ "Usage: PerlPacket::DESTROY(THIS)");
{ {
PerlPacket * THIS; PerlPacket * THIS;
VALIDATE_THIS_IS_PACKET;
if (SvROK(ST(0))) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not a reference");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
delete THIS; delete THIS;
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -105,16 +109,7 @@ XS(XS_PerlPacket_SetOpcode)
PerlPacket * THIS; PerlPacket * THIS;
bool RETVAL; bool RETVAL;
char * opcode = (char *)SvPV_nolen(ST(1)); char * opcode = (char *)SvPV_nolen(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->SetOpcode(opcode); RETVAL = THIS->SetOpcode(opcode);
ST(0) = boolSV(RETVAL); ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0)); sv_2mortal(ST(0));
@ -131,16 +126,7 @@ XS(XS_PerlPacket_Resize)
{ {
PerlPacket * THIS; PerlPacket * THIS;
uint32 len = (uint32)SvUV(ST(1)); uint32 len = (uint32)SvUV(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->Resize(len); THIS->Resize(len);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -155,16 +141,7 @@ XS(XS_PerlPacket_SendTo)
{ {
PerlPacket * THIS; PerlPacket * THIS;
Client * who; Client * who;
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Client")) { if (sv_derived_from(ST(1), "Client")) {
IV tmp = SvIV((SV*)SvRV(ST(1))); IV tmp = SvIV((SV*)SvRV(ST(1)));
who = INT2PTR(Client *,tmp); who = INT2PTR(Client *,tmp);
@ -187,16 +164,7 @@ XS(XS_PerlPacket_SendToAll)
Perl_croak(aTHX_ "Usage: PerlPacket::SendToAll(THIS)"); Perl_croak(aTHX_ "Usage: PerlPacket::SendToAll(THIS)");
{ {
PerlPacket * THIS; PerlPacket * THIS;
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SendToAll(); THIS->SendToAll();
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -210,16 +178,7 @@ XS(XS_PerlPacket_Zero)
Perl_croak(aTHX_ "Usage: PerlPacket::Zero(THIS)"); Perl_croak(aTHX_ "Usage: PerlPacket::Zero(THIS)");
{ {
PerlPacket * THIS; PerlPacket * THIS;
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->Zero(); THIS->Zero();
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -235,16 +194,7 @@ XS(XS_PerlPacket_FromArray)
PerlPacket * THIS; PerlPacket * THIS;
int * numbers; int * numbers;
uint32 length = (uint32)SvUV(ST(2)); uint32 length = (uint32)SvUV(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
AV *av_numbers; AV *av_numbers;
if (SvROK(ST(1)) && SvTYPE(SvRV(ST(1)))==SVt_PVAV) if (SvROK(ST(1)) && SvTYPE(SvRV(ST(1)))==SVt_PVAV)
av_numbers = (AV*)SvRV(ST(1)); av_numbers = (AV*)SvRV(ST(1));
@ -277,16 +227,7 @@ XS(XS_PerlPacket_SetByte)
PerlPacket * THIS; PerlPacket * THIS;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
uint8 val = (uint8)SvUV(ST(2)); uint8 val = (uint8)SvUV(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetByte(pos, val); THIS->SetByte(pos, val);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -302,16 +243,7 @@ XS(XS_PerlPacket_SetShort)
PerlPacket * THIS; PerlPacket * THIS;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
uint16 val = (uint16)SvUV(ST(2)); uint16 val = (uint16)SvUV(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetShort(pos, val); THIS->SetShort(pos, val);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -327,16 +259,7 @@ XS(XS_PerlPacket_SetLong)
PerlPacket * THIS; PerlPacket * THIS;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
uint32 val = (uint32)SvUV(ST(2)); uint32 val = (uint32)SvUV(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetLong(pos, val); THIS->SetLong(pos, val);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -352,16 +275,7 @@ XS(XS_PerlPacket_SetFloat)
PerlPacket * THIS; PerlPacket * THIS;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
float val = (float)SvNV(ST(2)); float val = (float)SvNV(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetFloat(pos, val); THIS->SetFloat(pos, val);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -377,16 +291,7 @@ XS(XS_PerlPacket_SetString)
PerlPacket * THIS; PerlPacket * THIS;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
char * str = (char *)SvPV_nolen(ST(2)); char * str = (char *)SvPV_nolen(ST(2));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetString(pos, str); THIS->SetString(pos, str);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -403,16 +308,7 @@ XS(XS_PerlPacket_SetEQ1319)
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
float part13 = (float)SvNV(ST(2)); float part13 = (float)SvNV(ST(2));
float part19 = (float)SvNV(ST(3)); float part19 = (float)SvNV(ST(3));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetEQ1319(pos, part13, part19); THIS->SetEQ1319(pos, part13, part19);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -429,16 +325,7 @@ XS(XS_PerlPacket_SetEQ1913)
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
float part19 = (float)SvNV(ST(2)); float part19 = (float)SvNV(ST(2));
float part13 = (float)SvNV(ST(3)); float part13 = (float)SvNV(ST(3));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SetEQ1913(pos, part19, part13); THIS->SetEQ1913(pos, part19, part13);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -455,16 +342,7 @@ XS(XS_PerlPacket_GetByte)
uint8 RETVAL; uint8 RETVAL;
dXSTARG; dXSTARG;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetByte(pos); RETVAL = THIS->GetByte(pos);
XSprePUSH; PUSHu((UV)RETVAL); XSprePUSH; PUSHu((UV)RETVAL);
} }
@ -482,16 +360,7 @@ XS(XS_PerlPacket_GetShort)
uint16 RETVAL; uint16 RETVAL;
dXSTARG; dXSTARG;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetShort(pos); RETVAL = THIS->GetShort(pos);
XSprePUSH; PUSHu((UV)RETVAL); XSprePUSH; PUSHu((UV)RETVAL);
} }
@ -509,16 +378,7 @@ XS(XS_PerlPacket_GetLong)
uint32 RETVAL; uint32 RETVAL;
dXSTARG; dXSTARG;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetLong(pos); RETVAL = THIS->GetLong(pos);
XSprePUSH; PUSHu((UV)RETVAL); XSprePUSH; PUSHu((UV)RETVAL);
} }
@ -536,16 +396,7 @@ XS(XS_PerlPacket_GetFloat)
float RETVAL; float RETVAL;
dXSTARG; dXSTARG;
uint32 pos = (uint32)SvUV(ST(1)); uint32 pos = (uint32)SvUV(ST(1));
VALIDATE_THIS_IS_PACKET;
if (sv_derived_from(ST(0), "PerlPacket")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(PerlPacket *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type PerlPacket");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetFloat(pos); RETVAL = THIS->GetFloat(pos);
XSprePUSH; PUSHn((double)RETVAL); XSprePUSH; PUSHn((double)RETVAL);
} }