From 657899f0219a714cb85189f1267c02dca0d8386e Mon Sep 17 00:00:00 2001 From: Ashton Meuser Date: Sun, 15 Mar 2026 08:31:12 -0700 Subject: [PATCH 1/2] Reject unknown collectgarbage options --- src/Lua/Standard/BasicLibrary.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Lua/Standard/BasicLibrary.cs b/src/Lua/Standard/BasicLibrary.cs index f1bbab98..e6a49b9f 100644 --- a/src/Lua/Standard/BasicLibrary.cs +++ b/src/Lua/Standard/BasicLibrary.cs @@ -9,6 +9,20 @@ namespace Lua.Standard; public sealed class BasicLibrary { public static readonly BasicLibrary Instance = new(); + static readonly HashSet KnownCollectGarbageOptions = new(StringComparer.Ordinal) + { + "collect", + "stop", + "restart", + "count", + "step", + "setpause", + "setstepmul", + "setmajorinc", + "isrunning", + "incremental", + "generational" + }; public BasicLibrary() { @@ -83,7 +97,11 @@ public ValueTask CollectGarbage(LuaFunctionExecutionContext context, Cancel { if (context.HasArgument(0)) { - context.GetArgument(0); + var option = context.GetArgument(0); + if (!KnownCollectGarbageOptions.Contains(option)) + { + throw new LuaRuntimeException(context.State, $"bad argument #1 to 'collectgarbage' (invalid option '{option}')"); + } } GC.Collect(); From 09d125dff3bf661cc0b554158dbcfc8143ffb053 Mon Sep 17 00:00:00 2001 From: Ashton Meuser Date: Sun, 15 Mar 2026 09:33:48 -0700 Subject: [PATCH 2/2] Stdin __gc override --- src/Lua/Standard/OpenLibsExtensions.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Lua/Standard/OpenLibsExtensions.cs b/src/Lua/Standard/OpenLibsExtensions.cs index 4d91f9f0..a17b5969 100644 --- a/src/Lua/Standard/OpenLibsExtensions.cs +++ b/src/Lua/Standard/OpenLibsExtensions.cs @@ -52,7 +52,9 @@ public static void OpenIOLibrary(this LuaState state) var registry = globalState.Registry; var standardIO = globalState.Platform.StandardIO; - LuaValue stdin = new(new FileHandle(standardIO.Input)); + var stdinHandle = new FileHandle(standardIO.Input); + ((ILuaUserData)stdinHandle).Metatable!["__gc"] = new LuaFunction("stdin.__gc", (context, cancellationToken) => throw new LuaRuntimeException(context.State, "bad argument #1 to '__gc' (no value)")); + LuaValue stdin = new(stdinHandle); LuaValue stdout = new(new FileHandle(standardIO.Output)); LuaValue stderr = new(new FileHandle(standardIO.Error)); registry["_IO_input"] = stdin;