Host function callbacks can deadlock when calling back into the sandbox
Les mainteneurs répondent en général sous 5 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 42/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Calme
- Stack technique
- javascript, rust
- Domaine
- backend
Piste de recherche
Commencez par suivre le verrou du sandbox à travers call_handler et la distribution des host-functions dans handle_event, puis comparez l’approche avec verrou séparé dans src/hyperlight_host/src/sandbox/outb.rs. Reproduisez le callback à l’aide de registerHostFunction et callHandler, et examinez l’executing_flag de PR #55. Le travail est terminé lorsque les callbacks peuvent appeler des opérations du sandbox sans provoquer de deadlock, avec une couverture pour la reproduction signalée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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';
});
});
- Langage dominant
- Rust
- Étoiles
- 13
- Forks
- 5
- Merge moyen
- 5 j 12 h
- PR mergées (30 j)
- 16
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de hyperlight-dev/hyperlight-js
-
lifecycle/needs-review
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
hyperlight-dev/hyperlight-js#81 ·
Les mainteneurs répondent en général sous 5 jours
-
lifecycle/needs-review
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
hyperlight-dev/hyperlight-js#339 ·
Les mainteneurs répondent en général sous 5 jours
-
lifecycle/needs-review
Difficulté 4/5 3-5 jours Accessibilité débutants 52/100
hyperlight-dev/hyperlight-js#338 ·
Les mainteneurs répondent en général sous 5 jours
-
lifecycle/needs-review
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
hyperlight-dev/hyperlight-js#337 ·
Les mainteneurs répondent en général sous 5 jours
-
lifecycle/needs-review
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
hyperlight-dev/hyperlight-js#312 ·
Les mainteneurs répondent en général sous 5 jours
Toutes les issues de hyperlight-dev/hyperlight-js
Issues similaires
-
bug CLI exec tool-calls
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
maintainer-needed p2 triaged ui windows
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
Les mainteneurs répondent en général sous 1 jour
-
ai_p2
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
ClickHouse/ClickHouse#123351 ·
Les mainteneurs répondent en général sous 1 jour
-
documentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
github/copilot-sdk#2804 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour