[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-cvs
Subject:    [PHP-CVS] [php-src] fix-in-fiber-reset: Fix resetting ZEND_GENERATOR_IN_FIBER flag
From:       Bob Weinand <noreply () php ! net>
Date:       2023-01-30 10:59:01
Message-ID: PyrxMwbLpXTKTqcqj3YUNP4jE7OHtLpVU01f9IkQQ () main ! php ! net
[Download RAW message or body]

Author: Bob Weinand (bwoebi)
Date: 2023-01-30T11:59:12+01:00

Commit: https://github.com/php/php-src/commit/6fec12581eed58c370bdfd148f704cf684c4683b
 Raw diff: https://github.com/php/php-src/commit/6fec12581eed58c370bdfd148f704cf684c4683b.diff


Fix resetting ZEND_GENERATOR_IN_FIBER flag

Signed-off-by: Bob Weinand <bobwei9@hotmail.com>

Changed paths:
  A  Zend/tests/gh9916-012.phpt
  M  Zend/zend_generators.c


Diff:

diff --git a/Zend/tests/gh9916-012.phpt b/Zend/tests/gh9916-012.phpt
new file mode 100644
index 000000000000..1d32d92f27cd
--- /dev/null
+++ b/Zend/tests/gh9916-012.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug GH-9916 001 (Entering shutdown sequence with a fiber suspended in a Generator \
emits an unavoidable fatal error or crashes) +--FILE--
+<?php
+
+$gen = (function() {
+    yield from (function() { yield; })();
+})();
+$fiber = new Fiber(function() use ($gen) {
+    $gen->current();
+});
+$fiber->start();
+
+?>
+==DONE==
+--EXPECT--
+==DONE==
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 6997d95af039..eb74563e9c02 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -761,7 +761,7 @@ ZEND_API void zend_generator_resume(zend_generator \
*orig_generator) /* {{{ */  zend_observer_fcall_end(generator->execute_data, \
&generator->value);  }
 	}
-	generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING;
+	generator->flags &= ~(ZEND_GENERATOR_CURRENTLY_RUNNING | ZEND_GENERATOR_IN_FIBER);
 
 	generator->frozen_call_stack = NULL;
 	if (EXPECTED(generator->execute_data) &&
@@ -801,7 +801,6 @@ ZEND_API void zend_generator_resume(zend_generator \
*orig_generator) /* {{{ */  goto try_again;
 	}
 
-	generator->flags &= ~ZEND_GENERATOR_IN_FIBER;
 	orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
 }
 /* }}} */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic