diff -Naru redis-5.0.14/deps/lua/src/ldebug.c redis-5.0.14-new/deps/lua/src/ldebug.c --- redis-5.0.14/deps/lua/src/ldebug.c 2021-10-04 18:58:43.000000000 +0800 +++ redis-5.0.14-new/deps/lua/src/ldebug.c 2022-05-16 11:01:09.877613000 +0800 @@ -80,7 +80,6 @@ return L->basehookcount; } - LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { int status; CallInfo *ci; diff -Naru redis-5.0.14/deps/lua/src/lobject.h redis-5.0.14-new/deps/lua/src/lobject.h --- redis-5.0.14/deps/lua/src/lobject.h 2021-10-04 18:58:43.000000000 +0800 +++ redis-5.0.14-new/deps/lua/src/lobject.h 2022-05-16 11:03:06.374928000 +0800 @@ -337,7 +337,8 @@ typedef struct Table { CommonHeader; - lu_byte flags; /* 1<

array = NULL; t->sizearray = 0; t->lsizenode = 0; + t->readonly = 0; t->node = cast(Node *, dummynode); setarrayvector(L, t, narray); setnodevector(L, t, nhash); diff -Naru redis-5.0.14/deps/lua/src/lua.h redis-5.0.14-new/deps/lua/src/lua.h --- redis-5.0.14/deps/lua/src/lua.h 2021-10-04 18:58:43.000000000 +0800 +++ redis-5.0.14-new/deps/lua/src/lua.h 2022-05-16 11:06:52.052521000 +0800 @@ -358,6 +358,9 @@ int i_ci; /* active function */ }; + LUA_API void lua_enablereadonlytable (lua_State *L, int index, int enabled); + LUA_API int lua_isreadonlytable (lua_State *L, int index); + /* }====================================================================== */ diff -Naru redis-5.0.14/deps/lua/src/lvm.c redis-5.0.14-new/deps/lua/src/lvm.c --- redis-5.0.14/deps/lua/src/lvm.c 2021-10-04 18:58:43.000000000 +0800 +++ redis-5.0.14-new/deps/lua/src/lvm.c 2022-05-16 11:14:26.356619000 +0800 @@ -138,6 +138,8 @@ const TValue *tm; if (ttistable(t)) { /* `t' is a table? */ Table *h = hvalue(t); + if (h->readonly) + luaG_runerror(L, "Attempt to modify a readonly table"); TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ if (!ttisnil(oldval) || /* result is no nil? */ (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */