Handle INVALID_FUNCTION
mismatches at plugin boundaries, redux (#2136)
This commit is contained in:
parent
d426d1f04f
commit
af93d819c6
@ -244,7 +244,19 @@ static cell_t smn_WritePackFunction(IPluginContext *pContext, const cell_t *para
|
|||||||
pDataPack->RemoveItem();
|
pDataPack->RemoveItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
pDataPack->PackFunction(params[2]);
|
cell_t funcid = params[2];
|
||||||
|
if (pContext->IsNullFunctionId(funcid))
|
||||||
|
{
|
||||||
|
pDataPack->PackFunction(0);
|
||||||
|
}
|
||||||
|
else if (funcid <= 0)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pDataPack->PackFunction(funcid);
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -365,7 +377,12 @@ static cell_t smn_ReadPackFunction(IPluginContext *pContext, const cell_t *param
|
|||||||
return pContext->ThrowNativeError("Invalid data pack type (got %d / expected %d).", pDataPack->GetCurrentType(), CDataPackType::Function);
|
return pContext->ThrowNativeError("Invalid data pack type (got %d / expected %d).", pDataPack->GetCurrentType(), CDataPackType::Function);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pDataPack->ReadFunction();
|
cell_t funcid = pDataPack->ReadFunction();
|
||||||
|
if (!funcid)
|
||||||
|
{
|
||||||
|
return pContext->GetNullFunctionValue();
|
||||||
|
}
|
||||||
|
return funcid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell_t smn_ReadPackCellArray(IPluginContext *pContext, const cell_t *params)
|
static cell_t smn_ReadPackCellArray(IPluginContext *pContext, const cell_t *params)
|
||||||
|
@ -366,6 +366,33 @@ static cell_t SetNativeArray(IPluginContext *pContext, const cell_t *params)
|
|||||||
return SP_ERROR_NONE;
|
return SP_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t GetNativeFunction(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
if (!s_curnative || (s_curnative->ctx != pContext))
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Not called from inside a native function");
|
||||||
|
}
|
||||||
|
|
||||||
|
cell_t param = params[1];
|
||||||
|
if (param < 1 || param > s_curparams[0])
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell_t funcid = s_curparams[param];
|
||||||
|
if (s_curcaller->IsNullFunctionId(funcid))
|
||||||
|
{
|
||||||
|
// see alliedmodders/sourcepawn#912, alliedmodders/sourcemod#2068
|
||||||
|
// convert null function to receiver's expected value so equality checks against INVALID_FUNCTION pass
|
||||||
|
return pContext->GetNullFunctionValue();
|
||||||
|
}
|
||||||
|
else if (funcid <= 0)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
|
}
|
||||||
|
return funcid;
|
||||||
|
}
|
||||||
|
|
||||||
static cell_t FormatNativeString(IPluginContext *pContext, const cell_t *params)
|
static cell_t FormatNativeString(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
if (!s_curnative || (s_curnative->ctx != pContext))
|
if (!s_curnative || (s_curnative->ctx != pContext))
|
||||||
@ -483,7 +510,7 @@ REGISTER_NATIVES(nativeNatives)
|
|||||||
{"GetNativeArray", GetNativeArray},
|
{"GetNativeArray", GetNativeArray},
|
||||||
{"GetNativeCell", GetNativeCell},
|
{"GetNativeCell", GetNativeCell},
|
||||||
{"GetNativeCellRef", GetNativeCellRef},
|
{"GetNativeCellRef", GetNativeCellRef},
|
||||||
{"GetNativeFunction", GetNativeCell},
|
{"GetNativeFunction", GetNativeFunction},
|
||||||
{"GetNativeString", GetNativeString},
|
{"GetNativeString", GetNativeString},
|
||||||
{"GetNativeStringLength", GetNativeStringLength},
|
{"GetNativeStringLength", GetNativeStringLength},
|
||||||
{"FormatNativeString", FormatNativeString},
|
{"FormatNativeString", FormatNativeString},
|
||||||
|
@ -228,11 +228,15 @@ static cell_t sm_AddToForward(IPluginContext *pContext, const cell_t *params)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IPluginFunction *pFunction = pPlugin->GetBaseContext()->GetFunctionById(params[3]);
|
cell_t funcid = params[3];
|
||||||
|
if (funcid <= 0)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
|
}
|
||||||
|
IPluginFunction *pFunction = pPlugin->GetBaseContext()->GetFunctionById(funcid);
|
||||||
if (!pFunction)
|
if (!pFunction)
|
||||||
{
|
{
|
||||||
return pContext->ThrowNativeError("Invalid function id (%X)", params[3]);
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pForward->AddFunction(pFunction);
|
return pForward->AddFunction(pFunction);
|
||||||
@ -265,11 +269,15 @@ static cell_t sm_RemoveFromForward(IPluginContext *pContext, const cell_t *param
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IPluginFunction *pFunction = pPlugin->GetBaseContext()->GetFunctionById(params[3]);
|
cell_t funcid = params[3];
|
||||||
|
if (funcid <= 0)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
|
}
|
||||||
|
IPluginFunction *pFunction = pPlugin->GetBaseContext()->GetFunctionById(funcid);
|
||||||
if (!pFunction)
|
if (!pFunction)
|
||||||
{
|
{
|
||||||
return pContext->ThrowNativeError("Invalid function id (%X)", params[3]);
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pForward->RemoveFunction(pFunction);
|
return pForward->RemoveFunction(pFunction);
|
||||||
@ -327,11 +335,15 @@ static cell_t sm_CallStartFunction(IPluginContext *pContext, const cell_t *param
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s_pFunction = pPlugin->GetBaseContext()->GetFunctionById(params[2]);
|
cell_t funcid = params[2];
|
||||||
|
if (funcid <= 0)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
|
}
|
||||||
|
s_pFunction = pPlugin->GetBaseContext()->GetFunctionById(funcid);
|
||||||
if (!s_pFunction)
|
if (!s_pFunction)
|
||||||
{
|
{
|
||||||
return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
|
return pContext->ThrowNativeError("Invalid function id (%X)", funcid);
|
||||||
}
|
}
|
||||||
|
|
||||||
s_pCallable = static_cast<ICallable *>(s_pFunction);
|
s_pCallable = static_cast<ICallable *>(s_pFunction);
|
||||||
|
Loading…
Reference in New Issue
Block a user