AsyncTask: fixed reentrancy bug tested by f8e6f036affaaca135103556bd2c7f15a943d29b

This commit is contained in:
Dylan K. Taylor 2023-07-01 13:27:32 +01:00
parent f8e6f036af
commit 70dd9c7371
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -252,9 +252,15 @@ abstract class AsyncTask extends \Threaded{
final public function __destruct(){
$this->reallyDestruct();
if(self::$threadLocalStorage !== null && isset(self::$threadLocalStorage[$h = spl_object_id($this)])){
unset(self::$threadLocalStorage[$h]);
if(self::$threadLocalStorage->count() === 0){
//Beware changing this code!
//This code may cause the GC to be triggered, causing destruction of other AsyncTasks (which may or may not
//have been indirectly referenced by the TLS).
//This may cause the code to be re-entered from a different context unexpectedly, causing a crash if handled
//incorrectly.
if(self::$threadLocalStorage->count() === 1){
self::$threadLocalStorage = null;
}else{
unset(self::$threadLocalStorage[$h]);
}
}
}