Merge branch '1168-accessing-an-invalid-variable-in-ticcmd_t-crashes-the-game' into 'next'

check if LUA field exists before accessing it

Closes #1168

See merge request STJr/SRB2!2261
This commit is contained in:
Logan Aerl Arias 2024-02-12 19:58:56 +00:00
commit ae8bfbe763
4 changed files with 41 additions and 9 deletions

View file

@ -31,6 +31,26 @@ LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
/* extra error code for `luaL_load' */ /* extra error code for `luaL_load' */
#define LUA_ERRFILE (LUA_ERRERR+1) #define LUA_ERRFILE (LUA_ERRERR+1)
/* Compiler-specific attributes and other macros */
#ifdef __GNUC__ // __attribute__ ((X))
#if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && defined (__MINGW32__) // MinGW, >= GCC 4.1
#if 0 //defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO > 0
#define FUNCREPORT __attribute__ ((format(gnu_printf, 2, 3)))
#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
#define FUNCREPORT __attribute__ ((format(ms_printf, 2, 3)))
#else
#define FUNCREPORT __attribute__ ((format(printf, 2, 3)))
#endif
#else
#define FUNCREPORT __attribute__ ((format(printf, 2, 3)))
#endif
#endif
#ifndef FUNCREPORT
#define FUNCREPORT
#endif
typedef struct luaL_Reg { typedef struct luaL_Reg {
const char *name; const char *name;
@ -65,7 +85,7 @@ LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);
LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
LUALIB_API void (luaL_where) (lua_State *L, int lvl); LUALIB_API void (luaL_where) (lua_State *L, int lvl);
LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); LUALIB_API FUNCREPORT int (luaL_error) (lua_State *L, const char *fmt, ...);
LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
const char *const lst[]); const char *const lst[]);

View file

@ -483,7 +483,7 @@ static int spriteinfo_set(lua_State *L)
} }
} }
else else
return luaL_error(L, va("Field %s does not exist in spriteinfo_t", field)); return luaL_error(L, "Field %s does not exist in spriteinfo_t", field);
return 0; return 0;
} }
@ -577,7 +577,7 @@ static int framepivot_get(lua_State *L)
lua_pushinteger(L, 0); lua_pushinteger(L, 0);
} }
else else
return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field)); return luaL_error(L, "Field %s does not exist in spriteframepivot_t", field);
return 1; return 1;
} }
@ -604,7 +604,7 @@ static int framepivot_set(lua_State *L)
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.") LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else else
return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field)); return luaL_error(L, "Field %s does not exist in spriteframepivot_t", field);
return 0; return 0;
} }
@ -1663,7 +1663,7 @@ static void setRamp(lua_State *L, skincolor_t* c) {
lua_pushnil(L); lua_pushnil(L);
for (i=0; i<COLORRAMPSIZE; i++) { for (i=0; i<COLORRAMPSIZE; i++) {
if (lua_objlen(L,-2)!=COLORRAMPSIZE) { if (lua_objlen(L,-2)!=COLORRAMPSIZE) {
luaL_error(L, LUA_QL("skincolor_t") " field 'ramp' must be %d entries long; got %d.", COLORRAMPSIZE, lua_objlen(L,-2)); luaL_error(L, LUA_QL("skincolor_t") " field 'ramp' must be %d entries long; got %d.", COLORRAMPSIZE, luaL_getn(L,-2));
break; break;
} }
if (lua_next(L, -2) != 0) { if (lua_next(L, -2) != 0) {

View file

@ -1003,6 +1003,9 @@ static int mapthing_get(lua_State *L)
return 0; return 0;
} }
if (field == (enum mapthing_e)-1)
return LUA_ErrInvalid(L, "fields");
switch (field) switch (field)
{ {
case mapthing_valid: case mapthing_valid:
@ -1061,7 +1064,7 @@ static int mapthing_get(lua_State *L)
break; break;
default: default:
if (devparm) if (devparm)
return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field); return luaL_error(L, "%s %s", LUA_QL("mapthing_t"), va("has no field named: %ui", field));
else else
return 0; return 0;
} }
@ -1078,6 +1081,9 @@ static int mapthing_set(lua_State *L)
if (!mt) if (!mt)
return luaL_error(L, "accessed mapthing_t doesn't exist anymore."); return luaL_error(L, "accessed mapthing_t doesn't exist anymore.");
if (field == (enum mapthing_e)-1)
return LUA_ErrInvalid(L, "fields");
if (hud_running) if (hud_running)
return luaL_error(L, "Do not alter mapthing_t in HUD rendering code!"); return luaL_error(L, "Do not alter mapthing_t in HUD rendering code!");
if (hook_cmd_running) if (hook_cmd_running)
@ -1135,7 +1141,7 @@ static int mapthing_set(lua_State *L)
mt->mobj = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); mt->mobj = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
break; break;
default: default:
return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field); return luaL_error(L, "%s %s", LUA_QL("mapthing_t"), va("has no field named: %ui", field));
} }
return 0; return 0;

View file

@ -1423,8 +1423,8 @@ static int power_len(lua_State *L)
return 1; return 1;
} }
#define NOFIELD luaL_error(L, LUA_QL("ticcmd_t") " has no field named " LUA_QS, field) #define NOFIELD luaL_error(L, "%s %s", LUA_QL("ticcmd_t"), va("has no field named %ui", field))
#define NOSET luaL_error(L, LUA_QL("ticcmd_t") " field " LUA_QS " should not be set directly.", ticcmd_opt[field]) #define NOSET luaL_error(L, LUA_QL("ticcmd_t") " field %s should not be set directly.", ticcmd_opt[field])
enum ticcmd_e enum ticcmd_e
{ {
@ -1455,6 +1455,9 @@ static int ticcmd_get(lua_State *L)
if (!cmd) if (!cmd)
return LUA_ErrInvalid(L, "player_t"); return LUA_ErrInvalid(L, "player_t");
if (field == (enum ticcmd_e)-1)
return LUA_ErrInvalid(L, "fields");
switch (field) switch (field)
{ {
case ticcmd_forwardmove: case ticcmd_forwardmove:
@ -1489,6 +1492,9 @@ static int ticcmd_set(lua_State *L)
if (!cmd) if (!cmd)
return LUA_ErrInvalid(L, "ticcmd_t"); return LUA_ErrInvalid(L, "ticcmd_t");
if (field == (enum ticcmd_e)-1)
return LUA_ErrInvalid(L, "fields");
if (hud_running) if (hud_running)
return luaL_error(L, "Do not alter player_t in HUD rendering code!"); return luaL_error(L, "Do not alter player_t in HUD rendering code!");