mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-01-18 22:51:39 +00:00
- extended state caller check to work on CustomInventory items as well
Since CallStateChain is a public member in CustomInventory we cannot really be sure that the given state is valid so it needs checking as well. # Conflicts: # .gitignore
This commit is contained in:
parent
67bde8090a
commit
645c7fb192
3 changed files with 35 additions and 27 deletions
58
src/info.cpp
58
src/info.cpp
|
@ -126,6 +126,36 @@ void FState::SetAction(const char *name)
|
|||
}
|
||||
|
||||
|
||||
void FState::CheckCallerType(AActor *self, AActor *stateowner)
|
||||
{
|
||||
auto CheckType = [=](AActor *check, PType *requiredType)
|
||||
{
|
||||
// This should really never happen. Any valid action function must have actor pointers here.
|
||||
if (!requiredType->isObjectPointer())
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Bad function prototype in function call to %s", ActionFunc->PrintableName.GetChars());
|
||||
}
|
||||
auto cls = static_cast<PObjectPointer*>(requiredType)->PointedClass();
|
||||
if (!check->IsKindOf(cls))
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Invalid class %s in function call to %s. %s expected", check->GetClass()->TypeName.GetChars(), ActionFunc->PrintableName.GetChars(), cls->TypeName.GetChars());
|
||||
}
|
||||
};
|
||||
|
||||
if (ActionFunc->ImplicitArgs >= 1)
|
||||
{
|
||||
auto argtypes = ActionFunc->Proto->ArgumentTypes;
|
||||
|
||||
CheckType(self, argtypes[0]);
|
||||
|
||||
if (ActionFunc->ImplicitArgs >= 2)
|
||||
{
|
||||
CheckType(stateowner, argtypes[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FState::CallAction(AActor *self, AActor *stateowner, FStateParamInfo *info, FState **stateret)
|
||||
{
|
||||
if (ActionFunc != nullptr)
|
||||
|
@ -148,33 +178,7 @@ bool FState::CallAction(AActor *self, AActor *stateowner, FStateParamInfo *info,
|
|||
}
|
||||
try
|
||||
{
|
||||
auto CheckType = [=](AActor *check, PType *requiredType)
|
||||
{
|
||||
// This should really never happen. Any valid action function must have actor pointers here.
|
||||
if (!requiredType->isObjectPointer())
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Bad function prototype in function call to %s", ActionFunc->PrintableName.GetChars());
|
||||
}
|
||||
auto cls = static_cast<PObjectPointer*>(requiredType)->PointedClass();
|
||||
if (!check->IsKindOf(cls))
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Invalid class %s in function call to %s. %s expected", check->GetClass()->TypeName.GetChars(), ActionFunc->PrintableName.GetChars(), cls->TypeName.GetChars());
|
||||
}
|
||||
};
|
||||
|
||||
if (ActionFunc->ImplicitArgs >= 1)
|
||||
{
|
||||
auto argtypes = ActionFunc->Proto->ArgumentTypes;
|
||||
|
||||
CheckType(self, argtypes[0]);
|
||||
|
||||
if (ActionFunc->ImplicitArgs >= 2)
|
||||
{
|
||||
CheckType(stateowner, argtypes[1]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CheckCallerType(self, stateowner);
|
||||
|
||||
if (stateret == nullptr)
|
||||
{
|
||||
|
|
|
@ -175,10 +175,13 @@ public:
|
|||
void ClearAction() { ActionFunc = NULL; }
|
||||
void SetAction(const char *name);
|
||||
bool CallAction(AActor *self, AActor *stateowner, FStateParamInfo *stateinfo, FState **stateret);
|
||||
void CheckCallerType(AActor *self, AActor *stateowner);
|
||||
|
||||
static PClassActor *StaticFindStateOwner (const FState *state);
|
||||
static PClassActor *StaticFindStateOwner (const FState *state, PClassActor *info);
|
||||
static FString StaticGetStateName(const FState *state);
|
||||
static FRandom pr_statetics;
|
||||
|
||||
};
|
||||
|
||||
struct FStateLabels;
|
||||
|
|
|
@ -184,6 +184,7 @@ bool AStateProvider::CallStateChain (AActor *actor, FState *state)
|
|||
}
|
||||
try
|
||||
{
|
||||
state->CheckCallerType(actor, this);
|
||||
VMCall(state->ActionFunc, params, state->ActionFunc->ImplicitArgs, wantret, numret);
|
||||
}
|
||||
catch (CVMAbortException &err)
|
||||
|
|
Loading…
Reference in a new issue