Host function callbacks can deadlock when calling back into the sandbox
I maintainer di solito rispondono entro 6 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 42/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Tranquilla
- Stack tecnologico
- javascript, rust
- Ambito
- backend
Direzione di ricerca
Inizia tracciando il lock della sandbox attraverso call_handler e il dispatch delle host-function in handle_event, quindi confronta l’approccio con lock separato in src/hyperlight_host/src/sandbox/outb.rs. Riproduci il callback usando registerHostFunction e callHandler, e analizza l’executing_flag di PR #55. Il lavoro è completato quando i callback possono chiamare operazioni della sandbox senza causare deadlock, con una copertura per la riproduzione segnalata.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
When a host function callback (registered via registerHostFunction or setHostPrintFn) tries to call back into the same sandbox (e.g. callHandler, snapshot, restore, unload), it deadlocks.
This happens because call_handler holds the LoadedJSSandbox mutex for the entire duration of guest execution. Host functions are dispatched via TSFN to the Node.js main thread while that lock is held. If the callback then calls any method that needs the same lock, it waits forever.
Why this doesn't happen in core hyperlight
In hyperlight-dev/hyperlight, the host function registry (Arc<Mutex<FunctionRegistry>>) uses a separate lock from the sandbox. Host functions are dispatched synchronously while the VM is paused — they don't need the sandbox lock at all. See src/hyperlight_host/src/sandbox/outb.rs.
In hyperlight-js, the QuickJS runtime invokes host function closures inside handle_event, which requires &mut self on the sandbox. The NAPI layer wraps this in a single tokio::sync::Mutex, so host function dispatch and sandbox lifecycle share the same lock.
Current workaround
PR #55 adds an executing_flag (AtomicBool) that detects reentrancy at runtime. If a callback tries to acquire the lock while guest code is executing, it returns ERR_REENTRANT instead of deadlocking. This prevents hangs but doesn't allow the operation to succeed.
Suggested fix
Separate host function dispatch from the sandbox lock, similar to how core hyperlight does it. Options:
- Move host function state out of the
&mut selfborrow so callbacks don't need the sandbox lock - Temporarily release the sandbox lock before dispatching to host functions, reacquire after
- Provide a shared FFI/binding helper crate that handles this pattern correctly for any language binding
Reproduction
const loaded = await sandbox.getLoadedSandbox();
proto.registerHostModule('mymod', (mod) => {
mod.registerHostFunction('callback', async () => {
// This deadlocks (or returns ERR_REENTRANT with the fix)
await loaded.callHandler('other_handler', {});
return 'result';
});
});
- Lingua principale
- Rust
- Stelle
- 13
- Fork
- 5
- Merge medio
- 6g 6h
- PR unite (30g)
- 17
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di hyperlight-dev/hyperlight-js
-
lifecycle/needs-review
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
hyperlight-dev/hyperlight-js#81 ·
I maintainer di solito rispondono entro 6 giorni
-
lifecycle/needs-review
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
hyperlight-dev/hyperlight-js#340 ·
I maintainer di solito rispondono entro 6 giorni
-
lifecycle/needs-review
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
hyperlight-dev/hyperlight-js#339 ·
I maintainer di solito rispondono entro 6 giorni
-
lifecycle/needs-review
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
hyperlight-dev/hyperlight-js#338 ·
I maintainer di solito rispondono entro 6 giorni
-
lifecycle/needs-review
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
hyperlight-dev/hyperlight-js#337 ·
I maintainer di solito rispondono entro 6 giorni
Tutte le issue di hyperlight-dev/hyperlight-js
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
component:sight
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
agentic-os-org/ANOLISA#4622 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
HigherOrderCO/Bend#1294 ·
-
chore P0
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
[New Rule] InkReaderLinkAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
LibChecker/LibChecker-Rules#1406 ·
I maintainer di solito rispondono entro 1 giorno