From 960ecc7c54d8084c30d34b134f187e55552eaec1 Mon Sep 17 00:00:00 2001 From: speedy-lex <78314533+speedy-lex@users.noreply.github.com> Date: Tue, 1 Jul 2025 18:16:13 +0200 Subject: [PATCH] safe lua_pushstring --- src/testLuaArch.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/testLuaArch.c b/src/testLuaArch.c index 0bfd0a7..c515add 100644 --- a/src/testLuaArch.c +++ b/src/testLuaArch.c @@ -13,6 +13,30 @@ typedef struct testLuaArch { size_t memoryUsed; } testLuaArch; +testLuaArch *testLuaArch_get(lua_State *L) { + lua_getfield(L, LUA_REGISTRYINDEX, "archPtr"); + testLuaArch *arch = lua_touserdata(L, -1); + lua_pop(L, 1); + return arch; +} + +const char *testLuaArch_pushlstring(lua_State *L, const char *s, size_t len) { + if (lua_checkstack(L, 1) == 0) { + return NULL; + } + testLuaArch* arch = testLuaArch_get(L); + size_t freeSpace = nn_getComputerMemoryTotal(arch->computer) - arch->memoryUsed; + if ((len * 2 + 64) > freeSpace) { // dk how much space this really needs and its unstable so :/ + return NULL; + } + return lua_pushlstring(L, s, len); +} +const char *testLuaArch_pushstring(lua_State *L, const char *s) { + size_t len = strlen(s); + return testLuaArch_pushlstring(L, s, len); +} + + void *testLuaArch_alloc(testLuaArch *arch, void *ptr, size_t osize, size_t nsize) { if(nsize == 0) { arch->memoryUsed -= osize; @@ -30,13 +54,6 @@ void *testLuaArch_alloc(testLuaArch *arch, void *ptr, size_t osize, size_t nsize } } -testLuaArch *testLuaArch_get(lua_State *L) { - lua_getfield(L, LUA_REGISTRYINDEX, "archPtr"); - testLuaArch *arch = lua_touserdata(L, -1); - lua_pop(L, 1); - return arch; -} - nn_computer *testLuaArch_getComputer(lua_State *L) { return testLuaArch_get(L)->computer; } @@ -469,9 +486,12 @@ int testLuaArch_unicode_sub(lua_State *L) { } char *sub = nn_unicode_char(points + start - 1, stop - start + 1); - lua_pushstring(L, sub); // TODO: fix OOM here + char *res = testLuaArch_pushstring(L, sub); nn_free(sub); nn_free(points); + if (!res) { + luaL_error(L, "out of memory"); + } return 1; } @@ -492,9 +512,12 @@ int testLuaArch_unicode_char(lua_State *L) { codepoints[i] = lua_tointeger(L, idx); } char *s = nn_unicode_char(codepoints, argc); - lua_pushstring(L, s); + char *res = testLuaArch_pushstring(L, s); nn_free(s); nn_free(codepoints); + if (!res) { + luaL_error(L, "out of memory"); + } return 1; }