Moteur WebAssembly : remettre la pile en place après chaque commande
callMain (Emscripten) copie les arguments sur la pile du WebAssembly (64 Ko) sans les retirer. Pendant une partie dans le navigateur, le même moteur reçoit des centaines de commandes : vers la 540e, la pile débordait et corrompait la mémoire du moteur (moteur muet dans Firefox, onglet planté dans Chromium, « memory access out of bounds » sous Node). Repéré par make test-browser. stackSave et stackRestore sont exportés et encadrent chaque commande ; un test en envoie 3000 à la suite. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
a8636b3f83
commit
ae1ea54782
+6
-2
@@ -33,14 +33,18 @@ ENGINE_INCLUDES := -I$(COMPAT) -I$(COMPAT)/glib-shim -I$(GNUBG) -I$(GNUBG)/lib -
|
||||
# - main n'est pas lancé au chargement, et le programme ne s'arrête pas à sa
|
||||
# sortie : le moteur reste chargé entre deux commandes ;
|
||||
# - mémoire extensible : les bases de fin de partie occupent plusieurs
|
||||
# mégaoctets.
|
||||
# mégaoctets ;
|
||||
# - stackSave et stackRestore : callMain laisse ses arguments sur la pile
|
||||
# (64 Ko) ; sans restauration après chaque commande, elle déborde au bout
|
||||
# de quelques centaines de commandes et corrompt la mémoire du moteur
|
||||
# (voir web/engine-wasm.mjs).
|
||||
LINK_FLAGS := -O3 \
|
||||
-sMODULARIZE -sEXPORT_ES6 -sEXPORT_NAME=createEngineModule \
|
||||
-sENVIRONMENT=web,worker,node \
|
||||
-sINVOKE_RUN=0 -sEXIT_RUNTIME=0 \
|
||||
-sALLOW_MEMORY_GROWTH \
|
||||
-sEXPORTED_FUNCTIONS=_main,_engine_init \
|
||||
-sEXPORTED_RUNTIME_METHODS=callMain,ccall,HEAPU8 \
|
||||
-sEXPORTED_RUNTIME_METHODS=callMain,ccall,HEAPU8,stackSave,stackRestore \
|
||||
--preload-file $(BUILD)/data@/data
|
||||
|
||||
DATA := $(BUILD)/data/gnubg.wd $(BUILD)/data/gnubg_os0.bd $(BUILD)/data/gnubg_ts0.bd \
|
||||
|
||||
Reference in New Issue
Block a user