Android: data race on ArgConverter's process-wide long-conversion cache when workers start or stop concurrently
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 48/100
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- Linguagem predominante
- C++
- Estrelas
- 27
- Forks
- 4
- Merge médio
- 16h 48min
- PRs com merge (30d)
- 4
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de NativeScript/runtimes
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
NativeScript/runtimes#100 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
NativeScript/runtimes#99 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 4/5 1-2 dias Facilidade para iniciantes 55/100
NativeScript/runtimes#98 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 53/100
NativeScript/runtimes#97 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
NativeScript/runtimes#94 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de NativeScript/runtimes
Issues semelhantes
-
good first issue invalid
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 72/100
DanielJerolm/gpcc#74 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
patrick-hudson/put.gd-desktop#808 ·
Mantenedores costumam responder em até 1 dia
-
DPI change is not fully handled in the cascading window on WindowsTalvez já em andamento @yukawa assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
Mantenedores costumam responder em até 4 dias
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
enhancement Ready for final check
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 79/100
mpogue2/SquareDesk#1818 · 1 comentário ·