mirror of
https://github.com/rehlds/rehlds.git
synced 2025-03-29 13:49:05 +03:00
Added safety checks for hookchains impl
This commit is contained in:
parent
b172d20227
commit
212e9638d6
@ -128,7 +128,7 @@ if (file('repo_creds.properties').exists()) {
|
|||||||
publishing {
|
publishing {
|
||||||
repositories {
|
repositories {
|
||||||
maven {
|
maven {
|
||||||
if (project.version.contains('SNAPSHOT')) {
|
if (project.version.contains('dev')) {
|
||||||
url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-snapshots/"
|
url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-snapshots/"
|
||||||
} else {
|
} else {
|
||||||
url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-releases/"
|
url "http://nexus.rehlds.org/nexus/content/repositories/rehlds-releases/"
|
||||||
|
@ -27,12 +27,28 @@ AbstractHookChainRegistry::AbstractHookChainRegistry()
|
|||||||
m_NumHooks = 0;
|
m_NumHooks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractHookChainRegistry::addHook(void* hookFunc, int priority) {
|
bool AbstractHookChainRegistry::findHook(void* hookFunc) const
|
||||||
for (int i = 0; i < MAX_HOOKS_IN_CHAIN; i++)
|
{
|
||||||
{
|
for (auto i = 0; i < m_NumHooks; i++) {
|
||||||
if (m_Hooks[i] == hookFunc)
|
if (m_Hooks[i] == hookFunc)
|
||||||
return;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AbstractHookChainRegistry::addHook(void* hookFunc, int priority)
|
||||||
|
{
|
||||||
|
if (!hookFunc) {
|
||||||
|
Sys_Error(__FUNCTION__ " Parameter hookFunc can't be a nullptr");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (findHook(hookFunc)) {
|
||||||
|
Sys_Error(__FUNCTION__ " The same handler can't be used twice on the hookchain.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i = 0; i < MAX_HOOKS_IN_CHAIN; i++)
|
||||||
|
{
|
||||||
if (m_Hooks[i] && priority <= m_Priorities[i])
|
if (m_Hooks[i] && priority <= m_Priorities[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -47,7 +63,7 @@ void AbstractHookChainRegistry::addHook(void* hookFunc, int priority) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_NumHooks >= MAX_HOOKS_IN_CHAIN) {
|
if (m_NumHooks >= MAX_HOOKS_IN_CHAIN) {
|
||||||
rehlds_syserror("MAX_HOOKS_IN_CHAIN limit hit");
|
Sys_Error(__FUNCTION__ " MAX_HOOKS_IN_CHAIN limit hit");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_NumHooks++;
|
m_NumHooks++;
|
||||||
@ -56,7 +72,7 @@ void AbstractHookChainRegistry::addHook(void* hookFunc, int priority) {
|
|||||||
void AbstractHookChainRegistry::removeHook(void* hookFunc) {
|
void AbstractHookChainRegistry::removeHook(void* hookFunc) {
|
||||||
|
|
||||||
// erase hook
|
// erase hook
|
||||||
for (int i = 0; i < m_NumHooks; i++)
|
for (auto i = 0; i < m_NumHooks; i++)
|
||||||
{
|
{
|
||||||
if (hookFunc == m_Hooks[i])
|
if (hookFunc == m_Hooks[i])
|
||||||
{
|
{
|
||||||
|
@ -92,7 +92,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void callOriginal(t_args... args) {
|
virtual void callOriginal(t_args... args) {
|
||||||
m_OriginalFunc(args...);
|
if (m_OriginalFunc)
|
||||||
|
m_OriginalFunc(args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -108,6 +109,7 @@ protected:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void addHook(void* hookFunc, int priority);
|
void addHook(void* hookFunc, int priority);
|
||||||
|
bool findHook(void* hookFunc) const;
|
||||||
void removeHook(void* hookFunc);
|
void removeHook(void* hookFunc);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user