Commit Graph
34 Commits
Author SHA1 Message Date
Thomas Watson b996debd67 AP_Scripting: avoid leaking script on engine error during load
If Lua raises an error we won't ever link the new_script into the list
and won't find it to remove it and free its components later. The
components do ultimately get freed by the destruction of the heap, and
there's no way to access them after, but we'd rather it be empty and
know nothing is dangling.

This should be replaced by storing the components as Lua objects and
letting Lua's GC take care of them. That way the code could be made much
less fragile.

Also removes a chance of a leak in run_next_script.
2026-01-22 21:09:09 -06:00
Thomas Watson 79e591f947 AP_Scripting: remove Lua panic handler
Nominally cannot be called as we do not call error-raising Lua functions
outside of protected mode. In the event a panic happens somehow anyway,
Lua calls `lua_abort` which we already handle safely.
2026-01-22 21:09:09 -06:00
Thomas Watson 67860f11c0 AP_Scripting: run scripting engine in protected mode
Lua calls our registered panic function if a Lua error is raised outside
of any protected mode set up by `lua_pcall` and friends. As scripts
themselves are run in protected mode, such an error will only originate
from our engine code.

The current code handles panics, but does so incorrectly by neglecting
to free the error message buffer during a panic exit. As the underlying
heap is eventually destroyed and recreated, that static buffer pointer
is to a heap that no longer exists. If the new state raises an error it
will try to free that pointer, causing heap corruption and sadness.

Fix this issue and avoid similar ones by refactoring to run the main
part of the scripting engine in Lua protected mode. This creates exactly
one exit path from the scripting engine and avoids the need for fragile
panic handling infrastructure that duplicates what is built into Lua.
Quoth the Lua manual, "The panic function, as its name implies, is a
mechanism of last resort. Programs should avoid it."

This is unlikely to be triggerable in flight as the main engine loop
does not appear to use the Lua API in a way which can trigger errors.
But the possibility can't be fully excluded. It is, however, possible to
trigger beforehand using a perfectly wrong heap size that causes a
memory error during initialization.

Note that due to the error message buffer being freed properly now, an
error message originating from the engine will not cause a pre-arm
failure. This could be improved in the future.
2026-01-22 21:09:09 -06:00
Thomas Watson 83ee6fc583 AP_Scripting: use ap_setjmp
It properly saves and restores the floating point registers.
2025-12-25 07:07:08 +11:00
Andrew Tridgell 5aa7324c2d AP_Scripting: use AP_MultiHeap 2024-11-20 07:32:03 +11:00
Andrew Tridgell 66752996e4 AP_Scripting: cleanup debug option handling 2024-11-20 07:32:03 +11:00
Thomas Watson 3a834e83c7 AP_Scripting: reference script environment directly
Referencing the original function to run is of questionable value and
the only user uses it to grab the script environent from the upvalues.

Instead, use a reference to the script environment table directly.
2024-07-30 10:33:56 +10:00
Thomas Watson 15255a36e4 AP_Scripting: reference function to run separately
Some bits of the code in the require machinery use the `lua_ref` to
access the script environment. However, this can change after the script
is rescheduled and it returns an arbitrary function to run next.

Resolve this by introducing `run_ref` which is specifically a reference
to the function to run next. `lua_ref` is preserved for the script
lifetime.
2024-07-30 10:33:56 +10:00
Iampete1 f5e7bfcc48 AP_Scripting: remove support for REPL 2024-05-28 10:10:14 +10:00
Iampete1 2a3a5b2804 AP_Scripting: add checksum of running and loaded scripts with arming check 2023-12-05 11:03:58 +11:00
Peter Barker d519ab604e AP_Scripting: allow AP_SCRIPTING_ENABLED to come from hwdef files 2023-06-09 16:10:52 +10:00
bugobliterator 306b14d8dc AP_Scripting: add require with sandbox inheritence 2023-04-28 12:36:08 +10:00
Andrew Tridgell b45be75a98 AP_Scripting: use MultiHeap class 2023-01-16 09:19:16 +11:00
Peter Barker 4fccfdd56f AP_Scripting: include cleanups 2022-11-08 09:49:19 +11:00
Iampete1 815adbbc8e AP_Scripting: log memory cost of script load 2022-11-03 09:50:59 +11:00
Iampete1 da5ec973c5 AP_Scripting: add error message buffer semaphore 2022-08-31 17:04:24 +10:00
Iampete1 e3931a6f56 AP_Scripting: add debug option to disable pre-arm 2022-08-31 17:04:24 +10:00
Iampete1 e2c29b09ab AP_Scripting: add arming check for failed scripts 2022-08-31 17:04:24 +10:00
Iampete1 66cdfb015b AP_Scripting: always free the heap and remove scripts 2022-05-18 08:20:32 +10:00
Iampete1 9da80b45e9 AP_Scripting: load manual bindings via generator 2022-05-04 17:49:14 +10:00
Iampete1 20a2e6aaf0 AP_Scripting: allow deprecation warnings 2022-05-03 07:48:39 +10:00
Iampete1 58ef0d0137 AP_Scripting: log files and runtime stats 2021-11-17 19:16:46 +11:00
Iampete1 817864ce74 AP_Scripting: convert DEBUG_LVL to DEBUG_OPTS bitmask 2021-11-17 19:16:46 +11:00
Iampete1 6aa8319b90 AP_Scripting: re-emmit error messages every 10 seconds if SCR_DEBUG_LVL > 0 2021-09-29 17:11:18 +10:00
Patrick José Pereira bffda55639 AP_Scripting: Add missing const in member functions
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2021-02-03 18:45:14 +11:00
Rishabh bd7190767e AP_Scripting: Create scripts folder automatically 2020-06-20 21:39:06 +10:00
Michael du Breuil cf06beb1e6 AP_Scripting: Add support for REPL over MAVLink 2020-02-18 17:23:22 -07:00
Randy Mackay 09d75cff3b AP_Scripting: add init failure check 2019-12-03 12:48:32 +08:00
Andrew Tridgell b577787f68 AP_Scripting: use AP_Filesystem API 2019-08-27 15:40:43 +10:00
Michael du Breuil d7e71f85b8 AP_Scripting: Add a debug level param 2019-04-11 23:03:20 -07:00
Michael du Breuil c191789651 AP_Scripting: Use dedicated heap 2018-12-31 19:25:23 -07:00
Michael du Breuil 0ede7b7d39 AP_Scripting: Catch lua panics 2018-11-26 22:32:56 +00:00
Michael du Breuil 40d5e233d4 AP_Scripting: Autostart all scripts in a given folder 2018-11-14 01:41:35 +00:00
Michael du Breuil 19a8c5a6ed AP_Scripting: Run multiple scripts at once 2018-11-14 01:41:35 +00:00