[5.5.1_build12p1] - 2026-09-02
v5.5.1_build12p1 · Lua 5.5.1 · bytecode format 0x46
A patch release on build12: the instruction budget was switched off
by its own first firing.
A guest that tripped the budget inside its own pcall ran unbounded
from then on, for the life of the instance, and dv_usage reported it
sitting exactly at its limit the whole time. Two lines of Lua were
enough. One line of C fixes it. Read the "what this does not fix"
note below before treating the whole class as closed.
Changed
dv_usagekeeps counting past a budget the guest tried to ignore.
insn_usedadvanced only in the hook, so it froze the moment the hook
cleared itself: an escaped instance reported exactly its limit —
the healthiest possible reading — while running on. A supervisor
measuring saturation fromdv_usagewas reading a number the defect
controlled.usage_keeps_counting_past_the_budgetholds it, asserting
strictly greater than the limit, because the frozen value was the
limit exactly.
Fixed
-
A guest
pcallpermanently disabled the instruction budget. The
count hook cleared itself before raising:inst->exceeded = 1; lua_sethook(L, NULL, 0, 0); /* once is enough; the error is on its way */ luaL_error(L, "instruction budget of %I exceeded", ...);
luaL_errorraises an ordinary catchable Lua error, so a guest's own
pcallcaught it — and with the hook already cleared nothing re-armed
it, becausedv_runanddv_restoreare the only other sites that arm
it and neither is reachable again on a running instance. So:pcall(function() while true do end end) -- trips the budget once while true do end -- then runs unbounded
Measured against a 1,000,000-instruction budget, a program doing
30,000,000 instructions of work returnedDV_DONE. The hook now stays
armed, so it fires again withinDV_HOOK_STEPand the budget bounds
the work again.a_budget_survives_a_guest_pcallholds it.
Known issues
-
What this does not fix: a guest that catches in a loop still spins.
Stated plainly so the class is not filed as closed. The fix bounds the
work a guest can do past its budget; it does not make the error
uncatchable and it does not return control to the host.while true do pcall(function() while true do end end) end
still never leaves
dv_run— each catch buysDV_HOOK_STEP
instructions and the loop repeats. Lua has no uncatchable error.
Closing it needs one of: apcall/xpcallthat refuses to catch once
exceededis set, which is a core-file patch and so a
CORE_PATCH_ALLOWLISTdecision rather than a change; or a
process-level watchdog, since a host insidedv_runhas no way in --
dv.hexposes no interrupt. The practical bound today is operational:
run the host under a supervisor that restarts it, and alert on the
restart count rather than absorbing it.
Upgrading
Nothing to do, and no format movement. One behaviour change worth
knowing: a guest that catches the budget error in a pcall no longer
continues past it — the error is re-raised roughly every 1,000
instructions until the program unwinds. A program that relied on
catching the budget error and carrying on was relying on the defect.
Built from commit 515160f64587.
Download guide
| Platform | File | Notes |
|---|---|---|
| Linux (standard) | diluvium_linux_static_x86_64 |
Static; works on Ubuntu, Fedora, CentOS, Arch |
| Raspberry Pi 3/4/5 | diluvium_linux_static_aarch64 |
64-bit OS only |
| Raspberry Pi Zero | diluvium_linux_static_armv7l |
32-bit ARM |
| macOS (Apple silicon) | diluvium_darwin_arm64 |
M1/M2/M3/M4 |
| macOS (Intel) | diluvium_darwin_x86_64 |
|
| Windows | diluvium_windows_x86_64.exe |
64-bit |
| WASI | diluvium_wasi.wasm |
Needs a runtime with wasm exception-handling (wasmtime 28+ with -W exceptions=y) |
| Browser | libdiluvium_wasm_unknown.a |
wasm32-unknown-unknown static library |
Each platform also ships a diluvium_compiler_* binary (luac
with the -r analysis report flag) and a libdiluvium_*.a static
library for embedding.
Verifying a download
sha256sum -c SHA256SUMS.txt --ignore-missing
BUILDINFO.txt records the exact commit, build time and workflow run.