mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-11-17 02:01:15 +00:00
Some fixes to prevent bad table key types causing Lua panic errors for joining players in netgames:
* ArchiveTables: print an error if invalid key, to alert script author potentially * UnArchiveTables: if the key is found to be nil after reading key and value, print an error and don't set them in the table
This commit is contained in:
parent
1ab5273400
commit
fa3998e942
1 changed files with 19 additions and 5 deletions
|
@ -767,11 +767,19 @@ static void ArchiveTables(void)
|
||||||
lua_pushnil(gL);
|
lua_pushnil(gL);
|
||||||
while (lua_next(gL, -2))
|
while (lua_next(gL, -2))
|
||||||
{
|
{
|
||||||
ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this.
|
// Write key
|
||||||
|
e = ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this.
|
||||||
|
if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||||
|
{
|
||||||
|
lua_pushvalue(gL, -2);
|
||||||
|
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i);
|
||||||
|
lua_pop(gL, 1);
|
||||||
|
}
|
||||||
|
// Write value
|
||||||
e = ArchiveValue(TABLESINDEX, -1);
|
e = ArchiveValue(TABLESINDEX, -1);
|
||||||
if (e == 1)
|
if (e == 1)
|
||||||
n++; // the table contained a new table we'll have to archive. :(
|
n++; // the table contained a new table we'll have to archive. :(
|
||||||
else if (e == 2)
|
else if (e == 2) // invalid value type
|
||||||
{
|
{
|
||||||
lua_pushvalue(gL, -2);
|
lua_pushvalue(gL, -2);
|
||||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -1));
|
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -1));
|
||||||
|
@ -912,11 +920,17 @@ static void UnArchiveTables(void)
|
||||||
lua_rawgeti(gL, TABLESINDEX, i);
|
lua_rawgeti(gL, TABLESINDEX, i);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (UnArchiveValue(TABLESINDEX) == 1)
|
if (UnArchiveValue(TABLESINDEX) == 1) // read key
|
||||||
break;
|
break;
|
||||||
if (UnArchiveValue(TABLESINDEX) == 2)
|
if (UnArchiveValue(TABLESINDEX) == 2) // read value
|
||||||
n++;
|
n++;
|
||||||
lua_rawset(gL, -3);
|
if (lua_isnil(gL, -2)) // if key is nil (if a function etc was accidentally saved)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "A nil key in table %d was found! (Invalid key type or corrupted save?)\n", i);
|
||||||
|
lua_pop(gL, 2); // pop key and value instead of setting them in the table, to prevent Lua panic errors
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lua_rawset(gL, -3);
|
||||||
}
|
}
|
||||||
lua_pop(gL, 1);
|
lua_pop(gL, 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue