Browse Source

* WebAssembly threads: made FreeStackAndTlsBlock set the StackBlock and
TlsPointers to nil

Nikolay Nikolov 11 months ago
parent
commit
4abbd82135
1 changed files with 13 additions and 5 deletions
  1. 13 5
      rtl/wasi/systhrd.inc

+ 13 - 5
rtl/wasi/systhrd.inc

@@ -452,12 +452,20 @@ exports wasi_thread_start;
 
 Function wasi_thread_spawn(start_arg: PWasmThread) : LongInt; external 'wasi' name 'thread-spawn';
 
+{ Just because we set the original pointer to nil, using InterlockedExchange
+  to avoid race conditions leading to double free, doesn't mean this function is
+  meant to be called more than once, or from multiple threads. This just adds
+  some extra layer of protection. }
 procedure FreeStackAndTlsBlock(T : PWasmThread);
-begin
-  if Assigned(T^.StackBlock) then
-    FreeMem(T^.StackBlock);
-  if Assigned(T^.TLSBlock) then
-    FreeMem(T^.TLSBlock);
+var
+  P: Pointer;
+begin
+  P:=InterlockedExchange(T^.StackBlock,nil);
+  if Assigned(P) then
+    FreeMem(P);
+  P:=InterlockedExchange(T^.TLSBlock,nil);
+  if Assigned(P) then
+    FreeMem(P);
 end;
 
 function WasiBeginThread(sa : Pointer;stacksize : PtrUInt; ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword; var ThreadId : TThreadID) : TThreadID;