From 42baffd2bf00ab6016df653ef88b8196ddbc3a2e Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 23 Feb 2026 13:30:41 +0100 Subject: [PATCH 1/6] Add note about session behavior change in UPGRADE file (#21271) --- UPGRADING | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/UPGRADING b/UPGRADING index 3df40b98a33d..77d8463afe99 100644 --- a/UPGRADING +++ b/UPGRADING @@ -30,6 +30,14 @@ PHP 8.6 UPGRADE NOTES sessions. It only returns false now when the session data could not be encoded. This mainly happens with the default serialization handler if a key contains the pipe | character. + . When session.lazy_write is enabled and a session handler implements + SessionUpdateTimestampHandlerInterface, sessions that were read as empty + and remain empty at write time will now trigger updateTimestamp() instead + of write(). Previously, write() was always called for empty sessions + because session_encode() returned false, bypassing the lazy_write + comparison. Custom session handlers that rely on write() being called + with empty data (e.g. to destroy the session) should implement the same + logic in their updateTimestamp() method. - Standard: . Invalid mode values now throw in array_filter() instead of being silently From b58087daab70ce925c549b33be78574480ea1c3e Mon Sep 17 00:00:00 2001 From: Jorg Adam Sowa Date: Mon, 23 Feb 2026 13:36:38 +0100 Subject: [PATCH 2/6] test: improve tests for in_array (#21087) By splitting the massive tests into more specific, smaller tests. --- .../in_array/in_array_variation1_bool.phpt | 118 ++++ .../in_array/in_array_variation1_data.inc | 28 + .../in_array/in_array_variation1_empty.phpt | 118 ++++ .../in_array/in_array_variation1_enum.phpt | 118 ++++ .../in_array/in_array_variation1_mixed.phpt | 118 ++++ .../in_array_variation1_negative.phpt | 118 ++++ .../in_array/in_array_variation1_nested.phpt | 118 ++++ .../in_array_variation1_null_bytes.phpt | 118 ++++ .../in_array_variation1_special_chars.phpt | 118 ++++ .../in_array/in_array_variation1_zero.phpt | 118 ++++ .../{ => in_array}/in_array_variation2.phpt | 0 .../{ => in_array}/in_array_variation3.phpt | 0 .../{ => in_array}/in_array_variation4.phpt | 0 .../array/in_array/in_array_with_ref.phpt | 125 ++++ .../tests/array/in_array_variation1.phpt | 635 ------------------ .../tests/array/in_array_with_ref.phpt | 14 - 16 files changed, 1215 insertions(+), 649 deletions(-) create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_bool.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_data.inc create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_empty.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_enum.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_mixed.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_negative.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_nested.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_null_bytes.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_special_chars.phpt create mode 100644 ext/standard/tests/array/in_array/in_array_variation1_zero.phpt rename ext/standard/tests/array/{ => in_array}/in_array_variation2.phpt (100%) rename ext/standard/tests/array/{ => in_array}/in_array_variation3.phpt (100%) rename ext/standard/tests/array/{ => in_array}/in_array_variation4.phpt (100%) create mode 100644 ext/standard/tests/array/in_array/in_array_with_ref.phpt delete mode 100644 ext/standard/tests/array/in_array_variation1.phpt delete mode 100644 ext/standard/tests/array/in_array_with_ref.phpt diff --git a/ext/standard/tests/array/in_array/in_array_variation1_bool.phpt b/ext/standard/tests/array/in_array/in_array_variation1_bool.phpt new file mode 100644 index 000000000000..9b9475dec90e --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_bool.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with booleans +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_data.inc b/ext/standard/tests/array/in_array/in_array_variation1_data.inc new file mode 100644 index 000000000000..150b8c4d3194 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_data.inc @@ -0,0 +1,28 @@ + 4, + "string '4'" => "4", + "float 4.00" => 4.00, + "string 'b'" => "b", + "string '5'" => "5", + "integer -2" => -2, + "float -2.0" => -2.0, + "float -2.98989" => -2.98989, + "string '-.9'" => "-.9", + "string 'True'" => "True", + "empty string" => "", + "empty array" => [], + "null" => NULL, + "string 'ab'" => "ab", + "string 'abcd'" => "abcd", + "float 0.0" => 0.0, + "integer -0" => -0, + "string with null bytes" => "abcd\x00abcd\x00abcd", + "enum Sample::A" => Sample::A, + "enum Sample::B" => Sample::B, +]; diff --git a/ext/standard/tests/array/in_array/in_array_variation1_empty.phpt b/ext/standard/tests/array/in_array/in_array_variation1_empty.phpt new file mode 100644 index 000000000000..e661dcf299b9 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_empty.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with empty string and array +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- empty array -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- null -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_enum.phpt b/ext/standard/tests/array/in_array/in_array_variation1_enum.phpt new file mode 100644 index 000000000000..ed21aa52b26a --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_enum.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with enum values +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_mixed.phpt b/ext/standard/tests/array/in_array/in_array_variation1_mixed.phpt new file mode 100644 index 000000000000..2655484ce7ea --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_mixed.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with mixed string/int keys +--FILE-- + "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL, "b", "ab", "abcd"]; + +foreach ($values as $desc => $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string '4' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string 'ab' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string 'abcd' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- float 0.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_negative.phpt b/ext/standard/tests/array/in_array/in_array_variation1_negative.phpt new file mode 100644 index 000000000000..90c30f40f187 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_negative.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with negative numbers/floats +--FILE-- + "neg0.005", 2 => "float2", "-.9" => -.9]; + +foreach ($values as $desc => $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- float -2.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_nested.phpt b/ext/standard/tests/array/in_array/in_array_variation1_nested.phpt new file mode 100644 index 000000000000..bfbe0dde347d --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_nested.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with nested arrays +--FILE-- + 3], "one" => 1, "5" => 5]; + +foreach ($values as $desc => $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string '4' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_null_bytes.phpt b/ext/standard/tests/array/in_array/in_array_variation1_null_bytes.phpt new file mode 100644 index 000000000000..0b4369b241a3 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_null_bytes.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with null byte strings +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_special_chars.phpt b/ext/standard/tests/array/in_array/in_array_variation1_special_chars.phpt new file mode 100644 index 000000000000..d424093c86ed --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_special_chars.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with special character strings +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array/in_array_variation1_zero.phpt b/ext/standard/tests/array/in_array/in_array_variation1_zero.phpt new file mode 100644 index 000000000000..695b417eaa99 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_variation1_zero.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test in_array() function : usage variations - haystack with zero element +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $haystack)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $haystack, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '4' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- null -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'ab' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string with null bytes -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) +-- enum Sample::B -- +in_array() strict=false +bool(false) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array_variation2.phpt b/ext/standard/tests/array/in_array/in_array_variation2.phpt similarity index 100% rename from ext/standard/tests/array/in_array_variation2.phpt rename to ext/standard/tests/array/in_array/in_array_variation2.phpt diff --git a/ext/standard/tests/array/in_array_variation3.phpt b/ext/standard/tests/array/in_array/in_array_variation3.phpt similarity index 100% rename from ext/standard/tests/array/in_array_variation3.phpt rename to ext/standard/tests/array/in_array/in_array_variation3.phpt diff --git a/ext/standard/tests/array/in_array_variation4.phpt b/ext/standard/tests/array/in_array/in_array_variation4.phpt similarity index 100% rename from ext/standard/tests/array/in_array_variation4.phpt rename to ext/standard/tests/array/in_array/in_array_variation4.phpt diff --git a/ext/standard/tests/array/in_array/in_array_with_ref.phpt b/ext/standard/tests/array/in_array/in_array_with_ref.phpt new file mode 100644 index 000000000000..e2134dda5a82 --- /dev/null +++ b/ext/standard/tests/array/in_array/in_array_with_ref.phpt @@ -0,0 +1,125 @@ +--TEST-- +in_array() with references +--FILE-- + $needle) { + echo "-- $desc --\n"; + echo "in_array() strict=false\n"; + var_dump(in_array($needle, $array)); + echo "in_array() strict=true\n"; + var_dump(in_array($needle, $array, TRUE)); +} + +?> +--EXPECT-- +-- integer 4 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string '4' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 4.00 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'b' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string '5' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -2 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float -2.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float -2.98989 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string '-.9' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'True' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- empty string -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- empty array -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- null -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- string 'ab' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string 'abcd' -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- float 0.0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- integer -0 -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- string with null bytes -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) +-- enum Sample::A -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(true) +-- enum Sample::B -- +in_array() strict=false +bool(true) +in_array() strict=true +bool(false) diff --git a/ext/standard/tests/array/in_array_variation1.phpt b/ext/standard/tests/array/in_array_variation1.phpt deleted file mode 100644 index 0c88a4533206..000000000000 --- a/ext/standard/tests/array/in_array_variation1.phpt +++ /dev/null @@ -1,635 +0,0 @@ ---TEST-- -Test in_array() function : usage variations - different needdle values ---FILE-- - "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL, "b", "ab", "abcd"), - array(4, array(1, 2 => 3), "one" => 1, "5" => 5 ), - array(-1, -2, -3, -4, -2.989888, "-0.005" => "neg0.005", 2 => "float2", "-.9" => -.9), - array(TRUE, FALSE), - array("", array()), - array("abcd\x00abcd\x00abcd"), - array("abcd\tabcd\nabcd\rabcd\0abcdefghij") -); - -$array_compare = array ( - 4, - "4", - 4.00, - "b", - "5", - -2, - -2.0, - -2.98989, - "-.9", - "True", - "", - array(), - NULL, - "ab", - "abcd", - 0.0, - -0, - "abcd\x00abcd\x00abcd" -); -/* loop to check if elements in $array_compare exist in $arrays - using in_array() */ -$counter = 1; -foreach($arrays as $array) { - foreach($array_compare as $compare) { - echo "-- Iteration $counter --\n"; - //strict option OFF - var_dump(in_array($compare,$array)); - //strict option ON - var_dump(in_array($compare,$array,TRUE)); - //strict option OFF - var_dump(in_array($compare,$array,FALSE)); - $counter++; - } -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing in_array() with different needle values *** --- Iteration 1 -- -bool(false) -bool(false) -bool(false) --- Iteration 2 -- -bool(false) -bool(false) -bool(false) --- Iteration 3 -- -bool(false) -bool(false) -bool(false) --- Iteration 4 -- -bool(false) -bool(false) -bool(false) --- Iteration 5 -- -bool(false) -bool(false) -bool(false) --- Iteration 6 -- -bool(false) -bool(false) -bool(false) --- Iteration 7 -- -bool(false) -bool(false) -bool(false) --- Iteration 8 -- -bool(false) -bool(false) -bool(false) --- Iteration 9 -- -bool(false) -bool(false) -bool(false) --- Iteration 10 -- -bool(false) -bool(false) -bool(false) --- Iteration 11 -- -bool(false) -bool(false) -bool(false) --- Iteration 12 -- -bool(false) -bool(false) -bool(false) --- Iteration 13 -- -bool(true) -bool(false) -bool(true) --- Iteration 14 -- -bool(false) -bool(false) -bool(false) --- Iteration 15 -- -bool(false) -bool(false) -bool(false) --- Iteration 16 -- -bool(true) -bool(false) -bool(true) --- Iteration 17 -- -bool(true) -bool(true) -bool(true) --- Iteration 18 -- -bool(false) -bool(false) -bool(false) --- Iteration 19 -- -bool(true) -bool(true) -bool(true) --- Iteration 20 -- -bool(true) -bool(false) -bool(true) --- Iteration 21 -- -bool(true) -bool(false) -bool(true) --- Iteration 22 -- -bool(true) -bool(true) -bool(true) --- Iteration 23 -- -bool(false) -bool(false) -bool(false) --- Iteration 24 -- -bool(false) -bool(false) -bool(false) --- Iteration 25 -- -bool(false) -bool(false) -bool(false) --- Iteration 26 -- -bool(false) -bool(false) -bool(false) --- Iteration 27 -- -bool(false) -bool(false) -bool(false) --- Iteration 28 -- -bool(false) -bool(false) -bool(false) --- Iteration 29 -- -bool(true) -bool(false) -bool(true) --- Iteration 30 -- -bool(true) -bool(false) -bool(true) --- Iteration 31 -- -bool(true) -bool(true) -bool(true) --- Iteration 32 -- -bool(true) -bool(true) -bool(true) --- Iteration 33 -- -bool(true) -bool(true) -bool(true) --- Iteration 34 -- -bool(true) -bool(false) -bool(true) --- Iteration 35 -- -bool(true) -bool(false) -bool(true) --- Iteration 36 -- -bool(false) -bool(false) -bool(false) --- Iteration 37 -- -bool(true) -bool(true) -bool(true) --- Iteration 38 -- -bool(true) -bool(false) -bool(true) --- Iteration 39 -- -bool(true) -bool(false) -bool(true) --- Iteration 40 -- -bool(false) -bool(false) -bool(false) --- Iteration 41 -- -bool(true) -bool(false) -bool(true) --- Iteration 42 -- -bool(false) -bool(false) -bool(false) --- Iteration 43 -- -bool(false) -bool(false) -bool(false) --- Iteration 44 -- -bool(false) -bool(false) -bool(false) --- Iteration 45 -- -bool(false) -bool(false) -bool(false) --- Iteration 46 -- -bool(false) -bool(false) -bool(false) --- Iteration 47 -- -bool(false) -bool(false) -bool(false) --- Iteration 48 -- -bool(false) -bool(false) -bool(false) --- Iteration 49 -- -bool(false) -bool(false) -bool(false) --- Iteration 50 -- -bool(false) -bool(false) -bool(false) --- Iteration 51 -- -bool(false) -bool(false) -bool(false) --- Iteration 52 -- -bool(false) -bool(false) -bool(false) --- Iteration 53 -- -bool(false) -bool(false) -bool(false) --- Iteration 54 -- -bool(false) -bool(false) -bool(false) --- Iteration 55 -- -bool(false) -bool(false) -bool(false) --- Iteration 56 -- -bool(false) -bool(false) -bool(false) --- Iteration 57 -- -bool(false) -bool(false) -bool(false) --- Iteration 58 -- -bool(false) -bool(false) -bool(false) --- Iteration 59 -- -bool(false) -bool(false) -bool(false) --- Iteration 60 -- -bool(true) -bool(true) -bool(true) --- Iteration 61 -- -bool(true) -bool(false) -bool(true) --- Iteration 62 -- -bool(false) -bool(false) -bool(false) --- Iteration 63 -- -bool(true) -bool(false) -bool(true) --- Iteration 64 -- -bool(false) -bool(false) -bool(false) --- Iteration 65 -- -bool(false) -bool(false) -bool(false) --- Iteration 66 -- -bool(false) -bool(false) -bool(false) --- Iteration 67 -- -bool(false) -bool(false) -bool(false) --- Iteration 68 -- -bool(false) -bool(false) -bool(false) --- Iteration 69 -- -bool(false) -bool(false) -bool(false) --- Iteration 70 -- -bool(false) -bool(false) -bool(false) --- Iteration 71 -- -bool(false) -bool(false) -bool(false) --- Iteration 72 -- -bool(false) -bool(false) -bool(false) --- Iteration 73 -- -bool(true) -bool(false) -bool(true) --- Iteration 74 -- -bool(true) -bool(false) -bool(true) --- Iteration 75 -- -bool(true) -bool(false) -bool(true) --- Iteration 76 -- -bool(true) -bool(false) -bool(true) --- Iteration 77 -- -bool(true) -bool(false) -bool(true) --- Iteration 78 -- -bool(true) -bool(false) -bool(true) --- Iteration 79 -- -bool(true) -bool(false) -bool(true) --- Iteration 80 -- -bool(true) -bool(false) -bool(true) --- Iteration 81 -- -bool(true) -bool(false) -bool(true) --- Iteration 82 -- -bool(true) -bool(false) -bool(true) --- Iteration 83 -- -bool(true) -bool(false) -bool(true) --- Iteration 84 -- -bool(true) -bool(false) -bool(true) --- Iteration 85 -- -bool(true) -bool(false) -bool(true) --- Iteration 86 -- -bool(true) -bool(false) -bool(true) --- Iteration 87 -- -bool(true) -bool(false) -bool(true) --- Iteration 88 -- -bool(true) -bool(false) -bool(true) --- Iteration 89 -- -bool(true) -bool(false) -bool(true) --- Iteration 90 -- -bool(true) -bool(false) -bool(true) --- Iteration 91 -- -bool(false) -bool(false) -bool(false) --- Iteration 92 -- -bool(false) -bool(false) -bool(false) --- Iteration 93 -- -bool(false) -bool(false) -bool(false) --- Iteration 94 -- -bool(false) -bool(false) -bool(false) --- Iteration 95 -- -bool(false) -bool(false) -bool(false) --- Iteration 96 -- -bool(false) -bool(false) -bool(false) --- Iteration 97 -- -bool(false) -bool(false) -bool(false) --- Iteration 98 -- -bool(false) -bool(false) -bool(false) --- Iteration 99 -- -bool(false) -bool(false) -bool(false) --- Iteration 100 -- -bool(false) -bool(false) -bool(false) --- Iteration 101 -- -bool(true) -bool(true) -bool(true) --- Iteration 102 -- -bool(true) -bool(true) -bool(true) --- Iteration 103 -- -bool(true) -bool(false) -bool(true) --- Iteration 104 -- -bool(false) -bool(false) -bool(false) --- Iteration 105 -- -bool(false) -bool(false) -bool(false) --- Iteration 106 -- -bool(false) -bool(false) -bool(false) --- Iteration 107 -- -bool(false) -bool(false) -bool(false) --- Iteration 108 -- -bool(false) -bool(false) -bool(false) --- Iteration 109 -- -bool(false) -bool(false) -bool(false) --- Iteration 110 -- -bool(false) -bool(false) -bool(false) --- Iteration 111 -- -bool(false) -bool(false) -bool(false) --- Iteration 112 -- -bool(false) -bool(false) -bool(false) --- Iteration 113 -- -bool(false) -bool(false) -bool(false) --- Iteration 114 -- -bool(false) -bool(false) -bool(false) --- Iteration 115 -- -bool(false) -bool(false) -bool(false) --- Iteration 116 -- -bool(false) -bool(false) -bool(false) --- Iteration 117 -- -bool(false) -bool(false) -bool(false) --- Iteration 118 -- -bool(false) -bool(false) -bool(false) --- Iteration 119 -- -bool(false) -bool(false) -bool(false) --- Iteration 120 -- -bool(false) -bool(false) -bool(false) --- Iteration 121 -- -bool(false) -bool(false) -bool(false) --- Iteration 122 -- -bool(false) -bool(false) -bool(false) --- Iteration 123 -- -bool(false) -bool(false) -bool(false) --- Iteration 124 -- -bool(false) -bool(false) -bool(false) --- Iteration 125 -- -bool(false) -bool(false) -bool(false) --- Iteration 126 -- -bool(true) -bool(true) -bool(true) --- Iteration 127 -- -bool(false) -bool(false) -bool(false) --- Iteration 128 -- -bool(false) -bool(false) -bool(false) --- Iteration 129 -- -bool(false) -bool(false) -bool(false) --- Iteration 130 -- -bool(false) -bool(false) -bool(false) --- Iteration 131 -- -bool(false) -bool(false) -bool(false) --- Iteration 132 -- -bool(false) -bool(false) -bool(false) --- Iteration 133 -- -bool(false) -bool(false) -bool(false) --- Iteration 134 -- -bool(false) -bool(false) -bool(false) --- Iteration 135 -- -bool(false) -bool(false) -bool(false) --- Iteration 136 -- -bool(false) -bool(false) -bool(false) --- Iteration 137 -- -bool(false) -bool(false) -bool(false) --- Iteration 138 -- -bool(false) -bool(false) -bool(false) --- Iteration 139 -- -bool(false) -bool(false) -bool(false) --- Iteration 140 -- -bool(false) -bool(false) -bool(false) --- Iteration 141 -- -bool(false) -bool(false) -bool(false) --- Iteration 142 -- -bool(false) -bool(false) -bool(false) --- Iteration 143 -- -bool(false) -bool(false) -bool(false) --- Iteration 144 -- -bool(false) -bool(false) -bool(false) -Done diff --git a/ext/standard/tests/array/in_array_with_ref.phpt b/ext/standard/tests/array/in_array_with_ref.phpt deleted file mode 100644 index 2ad3667d2326..000000000000 --- a/ext/standard/tests/array/in_array_with_ref.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -in_array() with references ---FILE-- - ---EXPECT-- -bool(true) -bool(true) From 7b4a7035d6f8cbe8a641bdcdddf1f529c316b1fe Mon Sep 17 00:00:00 2001 From: Arshid Date: Mon, 23 Feb 2026 18:09:25 +0530 Subject: [PATCH 3/6] ext/standard: Cleanup boolean return macros (#21261) - Replace RETVAL_TRUE/FALSE with RETVAL_BOOL - Replace RETURN_TRUE/FALSE with RETURN_BOOL --- ext/standard/head.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/ext/standard/head.c b/ext/standard/head.c index 76ba89dc0171..797d8d66c56a 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -260,11 +260,7 @@ static void php_setcookie_common(INTERNAL_FUNCTION_PARAMETERS, bool is_raw) } } - if (php_setcookie(name, value, expires, path, domain, secure, httponly, samesite, partitioned, !is_raw) == SUCCESS) { - RETVAL_TRUE; - } else { - RETVAL_FALSE; - } + RETVAL_BOOL(php_setcookie(name, value, expires, path, domain, secure, httponly, samesite, partitioned, !is_raw) == SUCCESS); if (options) { cleanup: @@ -328,11 +324,7 @@ PHP_FUNCTION(headers_sent) break; } - if (SG(headers_sent)) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } + RETURN_BOOL(SG(headers_sent)); } /* }}} */ From 6a1bde5d385762ee9e13be9d8d928ece5c00ccfe Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 21 Feb 2026 03:52:49 +0000 Subject: [PATCH 4/6] ext/pcntl: Fix signal table updated before php_signal4 succeeds in pcntl_signal Move the signal table update after the php_signal4 call, mirroring what is already done in the SIG_DFL/SIG_IGN (integer) code path. This prevents a stale entry in the table if sigaction fails. close GH-21270 --- NEWS | 4 +++- ext/pcntl/pcntl.c | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index d31c2d160426..1affbb7f8a3b 100644 --- a/NEWS +++ b/NEWS @@ -43,9 +43,11 @@ PHP NEWS - PCNTL: . Fixed pcntl_setns() internal errors handling regarding errnos. - (David Carlier) + (David Carlier/ndossche) . Fixed cpuset leak in pcntl_setcpuaffinity on out-of-range CPU ID on NetBSD/Solaris platforms. (David Carlier) + . Fixed pcntl_signal() signal table registering the callback first + OS-wise before the internal list. (David Carlier) - PDO_PGSQL: . Fixed bug GH-21055 (connection attribute status typo for GSS negotiation). diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index e3b4a9c4c69f..de8d7dfecfd7 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -798,15 +798,16 @@ PHP_FUNCTION(pcntl_signal) RETURN_THROWS(); } - /* Add the function name to our signal table */ - handle = zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle); - Z_TRY_ADDREF_P(handle); - + /* Register with the OS first so that on failure we don't record a handler that was never installed */ if (php_signal4(signo, pcntl_signal_handler, (int) restart_syscalls, 1) == (void *)SIG_ERR) { PCNTL_G(last_error) = errno; php_error_docref(NULL, E_WARNING, "Error assigning signal"); RETURN_FALSE; } + + /* Add the function name to our signal table */ + handle = zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle); + Z_TRY_ADDREF_P(handle); RETURN_TRUE; } /* }}} */ From 6b9294036321a26606c7c344eea6d437468cfa8c Mon Sep 17 00:00:00 2001 From: Arshid Date: Mon, 23 Feb 2026 20:31:51 +0530 Subject: [PATCH 5/6] ext/xls: Replace RETVAL_TRUE/RETVAL_FALSE with RETVAL_BOOL (#21278) --- ext/xsl/xsltprocessor.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index 95e2e2e8754b..7e184421aeeb 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -703,11 +703,7 @@ PHP_METHOD(XSLTProcessor, removeParameter) RETURN_THROWS(); } intern = Z_XSL_P(id); - if (zend_hash_del(intern->parameter, key) == SUCCESS) { - RETVAL_TRUE; - } else { - RETVAL_FALSE; - } + RETVAL_BOOL(zend_hash_del(intern->parameter, key) == SUCCESS); zend_string_release_ex(key, false); } /* }}} end XSLTProcessor::removeParameter */ From db6cca26dd2413852d4237b04da769d70569c405 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Thu, 30 Jan 2025 02:37:31 +0000 Subject: [PATCH 6/6] sapi/*/Makefile.frag: install programs built with libtool, with libtool When installing executables that were built using libtool, we are supposed to use $ libtool --mode-install rather than the bare . This is discussed ever so briefly in the "Installing executables" section of the GNU libtool documentation: https://www.gnu.org/software/libtool/manual/libtool.html So far this has not caused a problem with GNU libtool on the platforms that PHP supports, but there is an alternate libtool implementation called slibtool that stores wrappers at the locations where PHP is expecting the true executables to live. As a result, the wrappers (and not the executables) are installed when slibtool is used to build PHP. This is fixed by replacing, $(INSTALL) with $(LIBTOOL) --mode=install $(INSTALL) in the install-foo rules for the executables that are built with libtool. Closes GH-13674 --- NEWS | 2 ++ sapi/cgi/Makefile.frag | 2 +- sapi/cli/Makefile.frag | 2 +- sapi/fpm/Makefile.frag | 2 +- sapi/litespeed/Makefile.frag | 2 +- sapi/phpdbg/Makefile.frag | 2 +- 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 1affbb7f8a3b..6a1388a961c5 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,8 @@ PHP NEWS . Fixed OSS-Fuzz #478009707 (Borked assign-op/inc/dec on untyped hooked property backing value). (ilutov) . Fixed bug GH-21215 (Build fails with -std=). (Arnaud) + . Fixed bug GH-13674 (Build system installs libtool wrappers when using + slibtool). (Michael Orlitzky) - Curl: . Fixed bug GH-21023 (CURLOPT_XFERINFOFUNCTION crash with a null callback). diff --git a/sapi/cgi/Makefile.frag b/sapi/cgi/Makefile.frag index 79e2afec2545..eeadc7d3864c 100644 --- a/sapi/cgi/Makefile.frag +++ b/sapi/cgi/Makefile.frag @@ -6,7 +6,7 @@ $(SAPI_CGI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_FASTCGI_OBJS) $(PH install-cgi: $(SAPI_CGI_PATH) @echo "Installing PHP CGI binary: $(INSTALL_ROOT)$(bindir)/" @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) - @$(INSTALL) -m 0755 $(SAPI_CGI_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)php-cgi$(program_suffix)$(EXEEXT) + @$(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(SAPI_CGI_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)php-cgi$(program_suffix)$(EXEEXT) @echo "Installing PHP CGI man page: $(INSTALL_ROOT)$(mandir)/man1/" @$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1 @$(INSTALL_DATA) sapi/cgi/php-cgi.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)php-cgi$(program_suffix).1 diff --git a/sapi/cli/Makefile.frag b/sapi/cli/Makefile.frag index aa1d642b9cd6..52150d92d528 100644 --- a/sapi/cli/Makefile.frag +++ b/sapi/cli/Makefile.frag @@ -6,7 +6,7 @@ $(SAPI_CLI_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CLI_OBJS) install-cli: $(SAPI_CLI_PATH) @echo "Installing PHP CLI binary: $(INSTALL_ROOT)$(bindir)/" @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) - @$(INSTALL) -m 0755 $(SAPI_CLI_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)php$(program_suffix)$(EXEEXT) + @$(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(SAPI_CLI_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)php$(program_suffix)$(EXEEXT) @echo "Installing PHP CLI man page: $(INSTALL_ROOT)$(mandir)/man1/" @$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1 @$(INSTALL_DATA) sapi/cli/php.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)php$(program_suffix).1 diff --git a/sapi/fpm/Makefile.frag b/sapi/fpm/Makefile.frag index c6a290f9d59b..8c90e8c00daa 100644 --- a/sapi/fpm/Makefile.frag +++ b/sapi/fpm/Makefile.frag @@ -8,7 +8,7 @@ install-fpm: $(SAPI_FPM_PATH) @$(mkinstalldirs) $(INSTALL_ROOT)$(sbindir) @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/log @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/run - @$(INSTALL) -m 0755 $(SAPI_FPM_PATH) $(INSTALL_ROOT)$(sbindir)/$(program_prefix)php-fpm$(program_suffix)$(EXEEXT) + @$(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(SAPI_FPM_PATH) $(INSTALL_ROOT)$(sbindir)/$(program_prefix)php-fpm$(program_suffix)$(EXEEXT) @if test -f "$(INSTALL_ROOT)$(sysconfdir)/php-fpm.conf"; then \ echo "Installing PHP FPM defconfig: skipping"; \ diff --git a/sapi/litespeed/Makefile.frag b/sapi/litespeed/Makefile.frag index 2010d8d6235f..d33d467c7def 100644 --- a/sapi/litespeed/Makefile.frag +++ b/sapi/litespeed/Makefile.frag @@ -6,4 +6,4 @@ $(SAPI_LITESPEED_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_LITESPEED_OB install-litespeed: $(SAPI_LITESPEED_PATH) @echo "Installing PHP LiteSpeed binary: $(INSTALL_ROOT)$(bindir)/" @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) - @$(INSTALL) -m 0755 $(SAPI_LITESPEED_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)lsphp$(program_suffix) + @$(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(SAPI_LITESPEED_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)lsphp$(program_suffix) diff --git a/sapi/phpdbg/Makefile.frag b/sapi/phpdbg/Makefile.frag index a069a23685d9..aa1a1cd79428 100644 --- a/sapi/phpdbg/Makefile.frag +++ b/sapi/phpdbg/Makefile.frag @@ -25,7 +25,7 @@ install-phpdbg: $(BUILD_BINARY) @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/log @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/run - @$(INSTALL) -m 0755 $(BUILD_BINARY) $(INSTALL_ROOT)$(bindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT) + @$(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(BUILD_BINARY) $(INSTALL_ROOT)$(bindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT) @echo "Installing phpdbg man page: $(INSTALL_ROOT)$(mandir)/man1/" @$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1 @$(INSTALL_DATA) sapi/phpdbg/phpdbg.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phpdbg$(program_suffix).1