2
0
mirror of https://github.com/rehlds/reapi.git synced 2024-12-28 15:45:31 +03:00

Fix crash: Use AMXX_Error instead LogError.

This commit is contained in:
s1lentq 2017-01-14 18:55:17 +07:00
parent becdfd768b
commit 8a03dc1cc3
6 changed files with 39 additions and 8 deletions

View File

@ -45,9 +45,9 @@ static struct funcreq_t
//DECLARE_REQ(GetAmxVectorNull),
//DECLARE_REQ(PrintSrvConsole),
//DECLARE_REQ(GetModname),
//DECLARE_REQ(GetAmxScriptName),
DECLARE_REQ(GetAmxScriptName),
//DECLARE_REQ(GetAmxScript),
//DECLARE_REQ(FindAmxScriptByAmx),
DECLARE_REQ(FindAmxScriptByAmx),
//DECLARE_REQ(FindAmxScriptByName),
DECLARE_REQ(SetAmxString),
//DECLARE_REQ(SetAmxStringUTF8Char),
@ -219,6 +219,24 @@ NOINLINE void MF_LogError(AMX *amx, int err, const char *fmt, ...)
g_amxxapi.LogError(amx, err, "[%s] %s", g_ModuleInfo.logtag, msg);
}
NOINLINE void AMXX_Error(AMX *amx, const char *fmt, ...)
{
char msg[2048];
va_list arglst;
va_start(arglst, fmt);
vsnprintf(msg, sizeof msg, fmt, arglst);
va_end(arglst);
auto scriptName = g_amxxapi.GetAmxScriptName(g_amxxapi.FindAmxScriptByAmx(amx));
if (scriptName)
{
if ((scriptName = strrchr(scriptName, '\\')))
scriptName++;
}
g_amxxapi.Log("[%s] %s", scriptName, msg);
}
char* getAmxStringTemp(cell* src, char* dest, size_t max, size_t* len)
{
char* start = dest;

View File

@ -493,6 +493,7 @@ extern amxxapi_t g_amxxapi;
void MF_Log(const char *fmt, ...);
void MF_LogError(AMX *amx, int err, const char *fmt, ...);
void AMXX_Error(AMX *amx, const char *fmt, ...);
char* getAmxStringTemp(cell* src, char* dest, size_t max, size_t* len = nullptr);
void setAmxString(cell* dest, const char* string, size_t max);

View File

@ -217,7 +217,7 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
}
if (unlikely(!hookCtx->retVal.set)) {
g_amxxapi.LogError(fwd->GetAmx(), AMX_ERR_CALLBACK, "can't suppress original function call without new return value set");
AMXX_Error(fwd->GetAmx(), "%s : Can't suppress original function call without new return value set", fwd->GetCallbackName());
continue;
}

View File

@ -2,7 +2,7 @@
CHookManager g_hookManager;
int CHookManager::addHandler(AMX* amx, int func, int forward, bool post) const
int CHookManager::addHandler(AMX* amx, int func, const char *funcname, int forward, bool post) const
{
auto hook = m_hooklist.getHookSafe(func);
@ -13,7 +13,7 @@ int CHookManager::addHandler(AMX* amx, int func, int forward, bool post) const
}
auto& dest = post ? hook->post : hook->pre;
dest.push_back(new CAmxxHook(amx, forward));
dest.push_back(new CAmxxHook(amx, funcname, forward));
int id = func * MAX_HOOK_FORWARDS + dest.size();
return post ? -id : id; // use unsigned ids for post hooks
}
@ -23,6 +23,11 @@ AMX* CAmxxHook::GetAmx() const
return m_amx;
}
const char *CAmxxHook::GetCallbackName() const
{
return m_CallbackName;
}
int CAmxxHook::GetIndex() const
{
return m_index;

View File

@ -12,15 +12,22 @@ enum fwdstate
class CAmxxHook
{
public:
CAmxxHook(AMX* amx, int index) : m_index(index), m_state(FSTATE_ENABLED), m_amx(amx) {};
CAmxxHook(AMX* amx, const char *funcname, int index) : m_index(index), m_state(FSTATE_ENABLED), m_amx(amx)
{
strncpy(m_CallbackName, funcname, sizeof(m_CallbackName) - 1);
m_CallbackName[sizeof(m_CallbackName) - 1] = '\0';
};
int GetIndex() const;
fwdstate GetState() const;
AMX* GetAmx() const;
const char *GetCallbackName() const;
void SetState(fwdstate st);
private:
int m_index;
char m_CallbackName[64];
fwdstate m_state;
AMX* m_amx;
};
@ -29,7 +36,7 @@ class CHookManager
{
public:
void clearHandlers() const;
cell addHandler(AMX* amx, int func, int forward, bool post) const;
cell addHandler(AMX* amx, int func, const char *funcname, int forward, bool post) const;
hook_t* getHook(size_t func) const;
CAmxxHook* getAmxxHook(cell hook) const;

View File

@ -46,7 +46,7 @@ cell AMX_NATIVE_CALL RegisterHookChain(AMX *amx, cell *params)
return INVALID_HOOKCHAIN;
}
return g_hookManager.addHandler(amx, func, fwid, post != 0);
return g_hookManager.addHandler(amx, func, funcname, fwid, post != 0);
}
/*