From ec5f9ec5ca9c9593e277d2317dc33eb2c52ca64e Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Wed, 1 Sep 2004 17:02:24 +0000 Subject: [PATCH] Added buffer overflow (stack corruption) checking. To be tested! --- amxmodx/CLang.cpp | 88 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 26 deletions(-) diff --git a/amxmodx/CLang.cpp b/amxmodx/CLang.cpp index a2d8f2d4..c38bbbd9 100755 --- a/amxmodx/CLang.cpp +++ b/amxmodx/CLang.cpp @@ -52,7 +52,7 @@ { \ strcpy(outbuf, ""); \ len = 0; \ - AMXXLOG_Log("[AMXX] Plugin did not format a string correctly (parameter %d (total %d), line %d, \"%s\")", parm, paramCount, amx->curline, g_plugins.findPluginFast(amx)); \ + AMXXLOG_Log("[AMXX] Plugin did not format a string correctly (parameter %d (total %d), line %d, \"%s\")", parm, paramCount, amx->curline, g_plugins.findPluginFast(amx)->getName()); \ return outbuf; \ } @@ -506,6 +506,7 @@ int CLangMngr::GetKeyEntry(String &key) return -1; } +/* const char *CLangMngr::Format(const char *src, ...) { va_list argptr; @@ -541,7 +542,7 @@ const char *CLangMngr::Format(const char *src, ...) format[0] = '%'; char *ptr = format+1; while (!isalpha(*ptr++ = *src++)) - /*nothing*/; + ; --src; *ptr = 0; sprintf(outptr, format, va_arg(argptr, double)); @@ -613,7 +614,7 @@ const char *CLangMngr::Format(const char *src, ...) format[0] = '%'; char *ptr = format+1; while (!isalpha(*ptr++ = *src++)) - /*nothing*/; + ; --src; *ptr = 0; sprintf(outptr, format, va_arg(argptr, int)); @@ -633,13 +634,24 @@ const char *CLangMngr::Format(const char *src, ...) *outptr++ = 0; return outbuf; } + PM: Commented out so anyone using it will get a linker error*/ +#define CHECK_PTR(ptr, start, bufsize) if ((ptr) - (start) >= (bufsize)) { \ + AMXXLOG_Log("[AMXX] Buffer overflow in formatting (line %d, \"%s\")", amx->curline, g_plugins.findPluginFast(amx)->getName()); \ + outbuf[0] = 0; \ + len = 0; \ + return outbuf; } +#define CHECK_OUTPTR(offset) CHECK_PTR(outptr+offset, outbuf, sizeof(outbuf)) +#define ZEROTERM(buf) buf[(sizeof(buf)/sizeof(buf[0]))-1]=0; char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len) { + // number of parameters ( for NEXT_PARAM macro ) int paramCount = *params / sizeof(cell); + // the output buffer static char outbuf[4096]; - cell *src = get_amxaddr(amx, params[parm++]); char *outptr = outbuf; + cell *src = get_amxaddr(amx, params[parm++]); + enum State { S_Normal, @@ -678,14 +690,14 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len) cpLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(*pAmxLangName)->pEdict, "lang"); } } else { // Language Name - int len = 0; - cpLangName = get_amxstring(amx, langName, 2, len); + int tmplen = 0; + cpLangName = get_amxstring(amx, langName, 2, tmplen); } if (!cpLangName || strlen(cpLangName) < 1) cpLangName = "en"; - int len = 0; + int tmplen = 0; NEXT_PARAM(); - char *key = get_amxstring(amx, params[parm++], 1, len); + char *key = get_amxstring(amx, params[parm++], 1, tmplen); const char *def = GetDef(cpLangName, key); if (def == NULL) { @@ -699,7 +711,8 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len) } if (!def) { - static char buf[255]; + static char buf[512]; + CHECK_PTR((char*)buf+17+strlen(key), buf, sizeof(buf)); sprintf(buf, "ML_LNOTFOUND: %s", key); def = buf; } @@ -709,44 +722,52 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len) if (*def == '%') { ++def; - char format[16]; + char format[32]; format[0] = '%'; char *ptr = format+1; - while (!isalpha(*ptr++ = *def++)) + while (ptr-format