Android: data race on ArgConverter's process-wide long-conversion cache when workers start or stop concurrently
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 48/100
Piste de recherche
Read NativeScript/ffi/jni/napi/conversion/ArgConverter.{h,cpp} and NativeScript/ffi/jni/jsi/conversion/ArgConverter.{h,cpp}, focusing on GetTypeLongCache() and the disposal paths onDisposeEnv() and onDisposeRuntime(). Reproduce the reported race with the worker stress test on an API 36 arm64 emulator using HWASan; the issue describes enabling it in platforms/android/test-app/runtime/CMakeLists.txt. Done means concurrent runtime creation and disposal no longer corrupts either cache.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
ArgConverter::s_type_long_operations_cache is a single, process-wide robin_hood::unordered_map. Each runtime finds, inserts and erases its own entry from its own thread, and nothing synchronizes those accesses:
- find / insert:
GetTypeLongCache(), on the firstlongconversion in that runtime. - erase:
onDisposeEnv()/onDisposeRuntime(), when the runtime is disposed.
When several workers start or stop at once, one thread can rehash the table while another is reading or writing it. That is a data race on the map, and in practice a heap use-after-free.
Affects both binding layers:
NativeScript/ffi/jni/napi/conversion/ArgConverter.{h,cpp}: the map is keyed bynapi_env.NativeScript/ffi/jni/jsi/conversion/ArgConverter.{h,cpp}: the map is keyed byrt.identity().
How it was found
A worker stress test, run while testing #91 and #92 on an API 36 arm64 emulator. HWASan was enabled locally by uncommenting the -fsanitize=hwaddress lines in platforms/android/test-app/runtime/CMakeLists.txt; it is off by default. The test:
- 12 workers at a time are created and terminated after 20–300 ms;
- each worker churns Java objects and forces JS and Java GC;
- the main runtime forces GC every 25 ms.
HWASan reported a memory error inside ArgConverter::GetTypeLongCache, in both the napi and jsi trees. On the old code (without #91), the crash happened in 1 of 3 napi runs and 1 of 2 jsi runs. It is independent of the GC-delivery race that #91 fixes.
Expected
Each runtime's cache is reachable only by that runtime, and creating or disposing one runtime can't corrupt another's entry. Possible fixes:
- make the cache per-runtime state, reached the way
MetadataNode's per-runtime cache is; - or guard the map with a mutex. This is cheap: a lookup happens once per
longconversion, and the pointer could be cached after that.
Environment
- Branch:
android-react-nativeat 64c7fed0 - Emulator: Android API 36, arm64, debug build of
platforms/android/test-appwith HWASan enabled locally - Engine: V8
- Langage dominant
- C++
- Étoiles
- 27
- Forks
- 4
- Merge moyen
- 16 h 48 min
- PR mergées (30 j)
- 4
Préparer son environnement
- 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 NativeScript/runtimes
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
NativeScript/runtimes#100 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
NativeScript/runtimes#99 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 1-2 jours Accessibilité débutants 55/100
NativeScript/runtimes#98 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 53/100
NativeScript/runtimes#97 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
NativeScript/runtimes#94 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de NativeScript/runtimes
Issues similaires
-
.NET ep:WebGPU platform:web
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
microsoft/onnxruntime#33755 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
grumpycoders/pcsx-redux#2530 ·
-
A-tools P-medium S-ready-to-start studio task
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
Status: Needs confirmation Status: Needs triage Type: Code Quality
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
Image.resolveAssetSource's TypeScript declaration drops the null it returns for an unknown assetOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
react/react-native#59648 ·
Les mainteneurs répondent en général sous 2 jours