diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index b2fe964e7face..c3b53aec0ebb8 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -874,6 +874,7 @@ static bool php_pcntl_set_user_signal_infos( zval *user_signal_no; ZEND_HASH_FOREACH_VAL(user_signals, user_signal_no) { bool failed = true; + ZVAL_DEREF(user_signal_no); zend_long tmp = zval_try_get_long(user_signal_no, &failed); if (failed) { diff --git a/ext/pcntl/tests/gh16769.phpt b/ext/pcntl/tests/gh16769.phpt new file mode 100644 index 0000000000000..60baee616101d --- /dev/null +++ b/ext/pcntl/tests/gh16769.phpt @@ -0,0 +1,18 @@ +--TEST-- +pcntl_sigwaitinfo abort when signals is an array with self-reference. +--EXTENSIONS-- +pcntl +--SKIPIF-- + +--FILE-- +getMessage(); +} +?> +--EXPECT-- +pcntl_sigwaitinfo(): Argument #1 ($signals) signals must be of type int, array given