From da9eb96a779ba333a7207b176d44914c43c15bac Mon Sep 17 00:00:00 2001 From: Sergey Zhemoytel Date: Wed, 5 Feb 2025 21:23:16 +0000 Subject: [PATCH] 7.4.33 --- .abf.yml | 2 +- ...tice-on-array-access-on-illegal-type.patch | 433 ++++ CVE-2022-4900.patch | 30 + fix-include-e2k.patch | 12 + macros.php | 18 + php-5.3.x-fpm-0.6.5-mdv_conf.diff | 20 +- php-5.3.x-fpm-0.6.5-shared.diff | 4 +- php-7.2.0-visibility.patch | 182 +- php-7.3.4-libtool-2.4.6.patch | 115 + php-7.4.0-phpize.patch | 35 + php-7.4.1-missing-symbols.patch | 36 + php-7.4.30-svace-fixes.patch | 339 +++ php-7.4.33-openssl3.patch | 2017 +++++++++++++++ php-imap-annotation+status-current.diff | 6 +- php-imap-myrights.diff | 2 +- php-not-use-libgd-const.patch | 47 + php-shared.diff | 18 +- php-umask.diff | 20 +- php5-apache2-filters.diff | 12 +- php7.spec | 2178 +++++++++++++++++ 20 files changed, 5402 insertions(+), 124 deletions(-) create mode 100644 0001-Revert-Throw-notice-on-array-access-on-illegal-type.patch create mode 100644 CVE-2022-4900.patch create mode 100644 fix-include-e2k.patch create mode 100644 macros.php create mode 100644 php-7.3.4-libtool-2.4.6.patch create mode 100644 php-7.4.0-phpize.patch create mode 100644 php-7.4.1-missing-symbols.patch create mode 100644 php-7.4.30-svace-fixes.patch create mode 100644 php-7.4.33-openssl3.patch create mode 100644 php-not-use-libgd-const.patch create mode 100644 php7.spec diff --git a/.abf.yml b/.abf.yml index 9670b48..6216a89 100644 --- a/.abf.yml +++ b/.abf.yml @@ -1,2 +1,2 @@ sources: - php-7.3.0RC6.tar.xz: b6396dea2a03b1e59f94d2c0e3becb00ee40122c + php-7.4.33.tar.gz: 7c29812c51880390b74a5b23f0afe61e3b374645 diff --git a/0001-Revert-Throw-notice-on-array-access-on-illegal-type.patch b/0001-Revert-Throw-notice-on-array-access-on-illegal-type.patch new file mode 100644 index 0000000..2bc5a57 --- /dev/null +++ b/0001-Revert-Throw-notice-on-array-access-on-illegal-type.patch @@ -0,0 +1,433 @@ +From 37c1f7580dda6d5c6022d97d861b97530cfb8cde Mon Sep 17 00:00:00 2001 +From: Mikhail Novosyolov +Date: Tue, 16 Jan 2024 12:52:30 +0300 +Subject: [PATCH] Revert "Throw notice on array access on illegal type" + +This reverts commit c42b7dd6d32b43304b76452add158a2ef325d494 +https://github.com/php/php-src/commit/c42b7dd6d32b43304 + +That commit causes a crash on the following input: + +$ echo "Uwo8P1RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRU +VFRUVFQAAAAmIyRiYQoBJMhjW3JbWxAAGiYjJGJhCgEkyGNbcltbEABdXV1dPSR1cltbEAAaw11d +XV09JHWQk3I/Pg==" | base64 -d > input8 +$ php input8 + +php 7.4.x segfaults. The problem is in trying to access is_list. +With this revert, exit code is 0, but php 8.0.0+ more correctly gives an error about invalid input. +--- + UPGRADING | 4 ---- + Zend/tests/024.phpt | 14 ++++-------- + Zend/tests/033.phpt | 30 -------------------------- + Zend/tests/assign_to_var_003.phpt | 3 +-- + Zend/tests/call_user_func_007.phpt | 2 -- + Zend/tests/dereference_002.phpt | 2 -- + Zend/tests/dereference_010.phpt | 3 --- + Zend/tests/dereference_014.phpt | 4 ---- + Zend/tests/isset_003.phpt | 2 -- + Zend/tests/offset_bool.phpt | 19 +--------------- + Zend/tests/offset_long.phpt | 19 +--------------- + Zend/tests/offset_null.phpt | 19 +--------------- + Zend/zend_execute.c | 6 +----- + ext/spl/tests/array_026.phpt | 6 ++---- + ext/spl/tests/bug62978.phpt | 2 -- + ext/standard/tests/array/bug31158.phpt | 2 -- + tests/lang/bug25922.phpt | 1 - + tests/lang/passByReference_003.phpt | 6 ++---- + 18 files changed, 13 insertions(+), 131 deletions(-) + +diff --git a/UPGRADING b/UPGRADING +index 354e4fac02..44546f4572 100644 +--- a/UPGRADING ++++ b/UPGRADING +@@ -22,10 +22,6 @@ PHP 7.4 UPGRADE NOTES + ======================================== + + - Core: +- . Trying to use values of type null, bool, int, float or resource as an +- array (such as $null["key"]) will now generate a notice. This does not +- affect array accesses performed by list(). +- RFC: https://wiki.php.net/rfc/notice-for-non-valid-array-container + . get_declared_classes() no longer returns anonymous classes that haven't + been instantiated yet. + . "fn" is now a reserved keyword. In particular, it can no longer be used as a +diff --git a/Zend/tests/024.phpt b/Zend/tests/024.phpt +index 9e647d4231..34dac0f1e3 100644 +--- a/Zend/tests/024.phpt ++++ b/Zend/tests/024.phpt +@@ -16,23 +16,19 @@ var_dump($a->$b->{$c[1]}); + ?> + --EXPECTF-- + Notice: Undefined variable: a in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL + +-Notice: Undefined variable: a in %s on line %d +- +-Notice: Undefined variable: c in %s on line %d ++Notice: Undefined variable: %s in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d ++Notice: Undefined variable: %s in %s on line %d + NULL + + Notice: Undefined variable: a in %s on line %d + int(1) + +-Notice: Undefined variable: a in %s on line %d ++Notice: Undefined variable: %s in %s on line %d + +-Notice: Undefined variable: b in %s on line %d ++Notice: Undefined variable: %s in %s on line %d + int(0) + + Notice: Undefined variable: a in %s on line %d +@@ -49,8 +45,6 @@ NULL + + Notice: Undefined variable: c in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Trying to get property '1' of non-object in %s on line %d + + Notice: Trying to get property '' of non-object in %s on line %d +diff --git a/Zend/tests/033.phpt b/Zend/tests/033.phpt +index 1e7fca1e0d..a76a322ccf 100644 +--- a/Zend/tests/033.phpt ++++ b/Zend/tests/033.phpt +@@ -19,40 +19,10 @@ $arr[][]->bar = 2; + --EXPECTF-- + Notice: Undefined variable: arr in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Undefined variable: arr in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Undefined variable: arr in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Trying to get property 'foo' of non-object in %s on line %d + + Warning: Creating default object from empty value in %s on line %d +diff --git a/Zend/tests/assign_to_var_003.phpt b/Zend/tests/assign_to_var_003.phpt +index bbe1b372bb..b915c7231e 100644 +--- a/Zend/tests/assign_to_var_003.phpt ++++ b/Zend/tests/assign_to_var_003.phpt +@@ -12,8 +12,7 @@ var_dump($var1); + + echo "Done\n"; + ?> +---EXPECTF-- +-Notice: Trying to access array offset on value of type float in %s on line %d ++--EXPECT-- + NULL + NULL + Done +diff --git a/Zend/tests/call_user_func_007.phpt b/Zend/tests/call_user_func_007.phpt +index ed44320c3f..f73f14b1ff 100644 +--- a/Zend/tests/call_user_func_007.phpt ++++ b/Zend/tests/call_user_func_007.phpt +@@ -13,8 +13,6 @@ var_dump($a); + --EXPECTF-- + Notice: Undefined offset: 0 in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Warning: Parameter 1 to foo() expected to be a reference, value given in %s on line %d + array(0) { + } +diff --git a/Zend/tests/dereference_002.phpt b/Zend/tests/dereference_002.phpt +index 7290df7714..d16e1bb483 100644 +--- a/Zend/tests/dereference_002.phpt ++++ b/Zend/tests/dereference_002.phpt +@@ -69,8 +69,6 @@ array(2) { + int(5) + } + int(1) +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL + + Notice: Undefined offset: 4 in %s on line %d +diff --git a/Zend/tests/dereference_010.phpt b/Zend/tests/dereference_010.phpt +index c63f6acaf9..981fe31160 100644 +--- a/Zend/tests/dereference_010.phpt ++++ b/Zend/tests/dereference_010.phpt +@@ -21,10 +21,7 @@ var_dump(b()[1]); + + ?> + --EXPECTF-- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL + + Fatal error: Uncaught Error: Cannot use object of type stdClass as array in %s:%d +diff --git a/Zend/tests/dereference_014.phpt b/Zend/tests/dereference_014.phpt +index 189dca7a38..f8910dd016 100644 +--- a/Zend/tests/dereference_014.phpt ++++ b/Zend/tests/dereference_014.phpt +@@ -27,12 +27,8 @@ var_dump($h); + + ?> + --EXPECTF-- +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Trying to get property 'a' of non-object in %s on line %d + NULL + +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Trying to get property 'b' of non-object in %s on line %d + NULL +diff --git a/Zend/tests/isset_003.phpt b/Zend/tests/isset_003.phpt +index 06cbe3d51d..eac72f7e0a 100644 +--- a/Zend/tests/isset_003.phpt ++++ b/Zend/tests/isset_003.phpt +@@ -33,8 +33,6 @@ Notice: Undefined variable: c in %s on line %d + + Notice: Undefined variable: d in %s on line %d + +-Notice: Trying to access array offset on value of type null in %s on line %d +- + Notice: Trying to get property '' of non-object in %s on line %d + bool(false) + bool(true) +diff --git a/Zend/tests/offset_bool.phpt b/Zend/tests/offset_bool.phpt +index 8ed9f28e43..a08dd5450c 100644 +--- a/Zend/tests/offset_bool.phpt ++++ b/Zend/tests/offset_bool.phpt +@@ -24,31 +24,14 @@ var_dump($bool[$arr]); + + echo "Done\n"; + ?> +---EXPECTF-- +-Notice: Trying to access array offset on value of type bool in %s on line %d ++--EXPECT-- + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type bool in %s on line %d + NULL + Done +diff --git a/Zend/tests/offset_long.phpt b/Zend/tests/offset_long.phpt +index 4c6b3972d2..98b9b0f08b 100644 +--- a/Zend/tests/offset_long.phpt ++++ b/Zend/tests/offset_long.phpt +@@ -24,31 +24,14 @@ var_dump($long[$arr]); + + echo "Done\n"; + ?> +---EXPECTF-- +-Notice: Trying to access array offset on value of type int in %s on line %d ++--EXPECT-- + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type int in %s on line %d + NULL + Done +diff --git a/Zend/tests/offset_null.phpt b/Zend/tests/offset_null.phpt +index ad0b1f3049..c6ad6561db 100644 +--- a/Zend/tests/offset_null.phpt ++++ b/Zend/tests/offset_null.phpt +@@ -24,31 +24,14 @@ var_dump($null[$arr]); + + echo "Done\n"; + ?> +---EXPECTF-- +-Notice: Trying to access array offset on value of type null in %s on line %d ++--EXPECT-- + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL + Done +diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c +index 35cf24e586..7bc2248aa3 100644 +--- a/Zend/zend_execute.c ++++ b/Zend/zend_execute.c +@@ -2479,15 +2479,11 @@ try_string_offset: + } + } else { + if (type != BP_VAR_IS && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { +- container = ZVAL_UNDEFINED_OP1(); ++ ZVAL_UNDEFINED_OP1(); + } + if (ZEND_CONST_COND(dim_type == IS_CV, 1) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) { + ZVAL_UNDEFINED_OP2(); + } +- if (!is_list && type != BP_VAR_IS) { +- zend_error(E_NOTICE, "Trying to access array offset on value of type %s", +- zend_zval_type_name(container)); +- } + ZVAL_NULL(result); + } + } +diff --git a/ext/spl/tests/array_026.phpt b/ext/spl/tests/array_026.phpt +index 8ff6aafb93..9c79c57b66 100644 +--- a/ext/spl/tests/array_026.phpt ++++ b/ext/spl/tests/array_026.phpt +@@ -8,10 +8,8 @@ $test['d1']['d3'] = 'world'; + var_dump($test, $test3['mmmmm']); + ?> + --EXPECTF-- +-Notice: Undefined variable: test3 in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d +-object(ArrayObject)#1 (1) { ++Notice: Undefined variable: test3 in %s%earray_026.php on line %d ++object(ArrayObject)#%d (1) { + ["storage":"ArrayObject":private]=> + array(1) { + ["d1"]=> +diff --git a/ext/spl/tests/bug62978.phpt b/ext/spl/tests/bug62978.phpt +index 972bd07ce1..5c55507ad9 100644 +--- a/ext/spl/tests/bug62978.phpt ++++ b/ext/spl/tests/bug62978.phpt +@@ -32,8 +32,6 @@ Notice: Undefined index: epic_magic in %sbug62978.php on line %d + NULL + + Notice: Undefined variable: c in %sbug62978.php on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d + NULL + + Notice: Undefined index: epic_magic in %sbug62978.php on line %d +diff --git a/ext/standard/tests/array/bug31158.phpt b/ext/standard/tests/array/bug31158.phpt +index 62ba1cfaa3..d9e65bdde9 100644 +--- a/ext/standard/tests/array/bug31158.phpt ++++ b/ext/standard/tests/array/bug31158.phpt +@@ -15,6 +15,4 @@ echo "ok\n"; + ?> + --EXPECTF-- + Notice: Undefined variable: GLOBALS in %sbug31158.php on line 6 +- +-Notice: Trying to access array offset on value of type null in %sbug31158.php on line 6 + ok +diff --git a/tests/lang/bug25922.phpt b/tests/lang/bug25922.phpt +index 796ef6df82..41fb135e03 100644 +--- a/tests/lang/bug25922.phpt ++++ b/tests/lang/bug25922.phpt +@@ -20,5 +20,4 @@ test(); + ?> + --EXPECT-- + Undefined variable: data +-Trying to access array offset on value of type null + Undefined index here: '' +diff --git a/tests/lang/passByReference_003.phpt b/tests/lang/passByReference_003.phpt +index ad9e1e39de..be002031d7 100644 +--- a/tests/lang/passByReference_003.phpt ++++ b/tests/lang/passByReference_003.phpt +@@ -25,16 +25,14 @@ var_dump($undef2) + --EXPECTF-- + Passing undefined by value + +-Notice: Undefined variable: undef1 in %s on line %d +- +-Notice: Trying to access array offset on value of type null in %s on line %d ++Notice: Undefined variable: undef1 in %s on line 13 + + Inside passbyVal call: + NULL + + After call + +-Notice: Undefined variable: undef1 in %s on line %d ++Notice: Undefined variable: undef1 in %s on line 15 + NULL + + Passing undefined by reference +-- +2.40.1 + diff --git a/CVE-2022-4900.patch b/CVE-2022-4900.patch new file mode 100644 index 0000000..20dca73 --- /dev/null +++ b/CVE-2022-4900.patch @@ -0,0 +1,30 @@ +# from https://github.com/php/php-src/commit/789a37f14405e2d1a05a76c9fb4ed2d49d4580d5#diff-0265438340ea11a73f2e268834e3ac37b52342d9a911b5c4193df0b0072895ecR2389 + +diff -ruN a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c +--- a/sapi/cli/php_cli_server.c 2022-10-31 19:36:05.000000000 +0900 ++++ b/sapi/cli/php_cli_server.c 2024-11-28 11:05:56.301504326 +0900 +@@ -517,13 +517,8 @@ + if (php_cli_server_workers_max > 1) { + zend_long php_cli_server_worker; + +- php_cli_server_workers = calloc( +- php_cli_server_workers_max, sizeof(pid_t)); +- if (!php_cli_server_workers) { +- php_cli_server_workers_max = 1; +- +- return SUCCESS; +- } ++ php_cli_server_workers = pecalloc( ++ php_cli_server_workers_max, sizeof(pid_t), 1); + + php_cli_server_master = getpid(); + +@@ -2361,7 +2356,7 @@ + !WIFSIGNALED(php_cli_server_worker_status)); + } + +- free(php_cli_server_workers); ++ pefree(php_cli_server_workers, 1); + } + #endif + } /* }}} */ diff --git a/fix-include-e2k.patch b/fix-include-e2k.patch new file mode 100644 index 0000000..516a35f --- /dev/null +++ b/fix-include-e2k.patch @@ -0,0 +1,12 @@ +diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c +index 53efa865..d6975a44 100644 +--- a/ext/opcache/zend_accelerator_util_funcs.c ++++ b/ext/opcache/zend_accelerator_util_funcs.c +@@ -24,6 +24,7 @@ + #include "zend_accelerator_util_funcs.h" + #include "zend_persist.h" + #include "zend_shared_alloc.h" ++#include + + #if SIZEOF_SIZE_T <= SIZEOF_ZEND_LONG + /* If sizeof(void*) == sizeof(zend_ulong) we can use zend_hash index functions */ diff --git a/macros.php b/macros.php new file mode 100644 index 0000000..532d00e --- /dev/null +++ b/macros.php @@ -0,0 +1,18 @@ +# +# Interface versions exposed by PHP: +# +%php_core_api @PHP_APIVER@ +%php_zend_api @PHP_ZENDVER@ +%php_pdo_api @PHP_PDOVER@ +%php_version @PHP_VERSION@ + +# Compatibility, drop when nobody uses it +%php_api @PHP_ZENDVER@ + +%php_extdir %{_libdir}/php/modules + +%php_inidir %{_sysconfdir}/php.d + +%php_incldir %{_includedir}/php + +%__php %{_bindir}/php diff --git a/php-5.3.x-fpm-0.6.5-mdv_conf.diff b/php-5.3.x-fpm-0.6.5-mdv_conf.diff index 7e96f6e..ef79cbf 100644 --- a/php-5.3.x-fpm-0.6.5-mdv_conf.diff +++ b/php-5.3.x-fpm-0.6.5-mdv_conf.diff @@ -1,5 +1,6 @@ ---- php-7.0.1/sapi/fpm/php-fpm.conf.in.fpmmdv.droplet 2015-12-16 11:41:54.000000000 +0100 -+++ php-7.0.1/sapi/fpm/php-fpm.conf.in 2015-12-29 00:32:32.641437818 +0100 +diff -up php-7.4.1/sapi/fpm/php-fpm.conf.in.fpmmdv.droplet php-7.4.1/sapi/fpm/php-fpm.conf.in +--- php-7.4.1/sapi/fpm/php-fpm.conf.in.fpmmdv.droplet 2019-12-17 17:35:58.000000000 +0100 ++++ php-7.4.1/sapi/fpm/php-fpm.conf.in 2020-01-08 22:22:54.634218365 +0100 @@ -14,14 +14,14 @@ ; Pid file ; Note: the default prefix is @EXPANDED_LOCALSTATEDIR@ @@ -17,8 +18,9 @@ ; syslog_facility is used to specify what type of program is logging the ; message. This lets syslogd specify that messages from different facilities ---- php-7.0.1/sapi/fpm/www.conf.in.fpmmdv.droplet 2015-12-29 00:33:15.685147449 +0100 -+++ php-7.0.1/sapi/fpm/www.conf.in 2015-12-29 00:34:56.491559636 +0100 +diff -up php-7.4.1/sapi/fpm/www.conf.in.fpmmdv.droplet php-7.4.1/sapi/fpm/www.conf.in +--- php-7.4.1/sapi/fpm/www.conf.in.fpmmdv.droplet 2019-12-17 17:35:58.000000000 +0100 ++++ php-7.4.1/sapi/fpm/www.conf.in 2020-01-08 22:23:54.016215484 +0100 @@ -33,7 +33,7 @@ group = @php_fpm_group@ ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. @@ -28,7 +30,7 @@ ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) -@@ -104,22 +104,22 @@ pm = dynamic +@@ -110,22 +110,22 @@ pm = dynamic ; forget to tweak pm.* to fit your needs. ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' ; Note: This value is mandatory. @@ -37,7 +39,7 @@ ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' - ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 + ; Default Value: (min_spare_servers + max_spare_servers) / 2 -pm.start_servers = 2 +pm.start_servers = 20 @@ -55,7 +57,7 @@ ; The number of seconds after which an idle process will be killed. ; Note: Used only when pm is set to 'ondemand' -@@ -130,7 +130,7 @@ pm.max_spare_servers = 3 +@@ -136,7 +136,7 @@ pm.max_spare_servers = 3 ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 @@ -64,7 +66,7 @@ ; The URI to view the FPM status page. If this value is not set, no URI will be ; recognized as a status page. It shows the following informations: -@@ -314,7 +314,7 @@ pm.max_spare_servers = 3 +@@ -320,7 +320,7 @@ pm.max_spare_servers = 3 ; The log file for slow requests ; Default Value: not set ; Note: slowlog is mandatory if request_slowlog_timeout is set @@ -73,7 +75,7 @@ ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. -@@ -386,6 +386,7 @@ pm.max_spare_servers = 3 +@@ -411,6 +411,7 @@ pm.max_spare_servers = 3 ;env[TMP] = /tmp ;env[TMPDIR] = /tmp ;env[TEMP] = /tmp diff --git a/php-5.3.x-fpm-0.6.5-shared.diff b/php-5.3.x-fpm-0.6.5-shared.diff index efe078a..ca92be7 100644 --- a/php-5.3.x-fpm-0.6.5-shared.diff +++ b/php-5.3.x-fpm-0.6.5-shared.diff @@ -4,8 +4,8 @@ BUILD_FPM="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_FPM_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" ;; *) -- BUILD_FPM="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" -+ BUILD_FPM="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" +- BUILD_FPM="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" ++ BUILD_FPM="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" ;; esac diff --git a/php-7.2.0-visibility.patch b/php-7.2.0-visibility.patch index bab08e0..63d6654 100644 --- a/php-7.2.0-visibility.patch +++ b/php-7.2.0-visibility.patch @@ -1,83 +1,8 @@ ---- php-7.2.0/ext/date/php_date.c.omv~ 2017-11-29 13:24:17.183364915 +0100 -+++ php-7.2.0/ext/date/php_date.c 2017-11-29 13:24:28.970391388 +0100 -@@ -664,7 +664,7 @@ static zval *date_period_read_property(z - static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); - - /* {{{ Module struct */ --zend_module_entry date_module_entry = { -+__attribute__((visibility("default"))) zend_module_entry date_module_entry = { - STANDARD_MODULE_HEADER_EX, - NULL, - NULL, ---- php-7.2.0/ext/libxml/libxml.c.omv~ 2017-11-29 13:29:29.380067310 +0100 -+++ php-7.2.0/ext/libxml/libxml.c 2017-11-29 13:29:45.521103681 +0100 -@@ -135,7 +135,7 @@ static const zend_function_entry libxml_ - PHP_FE_END - }; - --zend_module_entry libxml_module_entry = { -+__attribute__((visibility("default"))) zend_module_entry libxml_module_entry = { - STANDARD_MODULE_HEADER, - "libxml", /* extension name */ - libxml_functions, /* extension function list */ ---- php-7.2.0/ext/pcre/php_pcre.c.omv~ 2017-11-29 13:29:59.452135074 +0100 -+++ php-7.2.0/ext/pcre/php_pcre.c 2017-11-29 13:30:04.050145437 +0100 -@@ -2715,7 +2715,7 @@ static const zend_function_entry pcre_fu - PHP_FE_END - }; - --zend_module_entry pcre_module_entry = { -+__attribute__((visibility("default"))) zend_module_entry pcre_module_entry = { - STANDARD_MODULE_HEADER, - "pcre", - pcre_functions, ---- php-7.2.0/ext/reflection/php_reflection.c.omv~ 2017-11-29 13:30:13.372166447 +0100 -+++ php-7.2.0/ext/reflection/php_reflection.c 2017-11-29 13:30:34.731214591 +0100 -@@ -6830,7 +6830,7 @@ PHP_MINFO_FUNCTION(reflection) /* {{{ */ - php_info_print_table_end(); - } /* }}} */ - --zend_module_entry reflection_module_entry = { /* {{{ */ -+__attribute__((visibility("default"))) zend_module_entry reflection_module_entry = { /* {{{ */ - STANDARD_MODULE_HEADER, - "Reflection", - reflection_ext_functions, ---- php-7.2.0/ext/simplexml/simplexml.c.omv~ 2017-11-29 13:31:10.373294945 +0100 -+++ php-7.2.0/ext/simplexml/simplexml.c 2017-11-29 13:31:14.562304390 +0100 -@@ -2676,7 +2676,7 @@ static const zend_module_dep simplexml_d - }; - /* }}} */ - --zend_module_entry simplexml_module_entry = { /* {{{ */ -+__attribute__((visibility("default"))) zend_module_entry simplexml_module_entry = { /* {{{ */ - STANDARD_MODULE_HEADER_EX, NULL, - simplexml_deps, - "SimpleXML", ---- php-7.2.0/ext/spl/php_spl.c.omv~ 2017-11-29 13:30:51.564252538 +0100 -+++ php-7.2.0/ext/spl/php_spl.c 2017-11-29 13:31:00.361272372 +0100 -@@ -1015,7 +1015,7 @@ PHP_RSHUTDOWN_FUNCTION(spl) /* {{{ */ - - /* {{{ spl_module_entry - */ --zend_module_entry spl_module_entry = { -+__attribute__((visibility("default"))) zend_module_entry spl_module_entry = { - STANDARD_MODULE_HEADER, - "SPL", - spl_functions, ---- php-7.2.0/ext/standard/basic_functions.c.omv~ 2017-11-29 13:31:35.333351228 +0100 -+++ php-7.2.0/ext/standard/basic_functions.c 2017-11-29 13:31:39.891361507 +0100 -@@ -3422,7 +3422,7 @@ static const zend_module_dep standard_de - }; - /* }}} */ - --zend_module_entry basic_functions_module = { /* {{{ */ -+__attribute__((visibility("default"))) zend_module_entry basic_functions_module = { /* {{{ */ - STANDARD_MODULE_HEADER_EX, - NULL, - standard_deps, ---- php-7.2.0/Zend/zend_signal.c.omv~ 2017-11-29 13:31:58.788404124 +0100 -+++ php-7.2.0/Zend/zend_signal.c 2017-11-29 13:32:19.265450309 +0100 -@@ -377,7 +377,7 @@ static void zend_signal_globals_ctor(zen +diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c +index e6991475..1fbd59f6 100644 +--- a/Zend/zend_signal.c ++++ b/Zend/zend_signal.c +@@ -386,7 +386,7 @@ static void zend_signal_globals_ctor(zend_signal_globals_t *zend_signal_globals) } /* }}} */ @@ -86,12 +11,103 @@ { int signo; struct sigaction sa; -@@ -399,7 +399,7 @@ void zend_signal_init(void) /* {{{ */ +@@ -408,7 +408,7 @@ void zend_signal_init(void) /* {{{ */ /* {{{ zend_signal_startup * alloc zend signal globals */ --void zend_signal_startup(void) -+__attribute__((visibility("default"))) void zend_signal_startup(void) +-ZEND_API void zend_signal_startup(void) ++__attribute__((visibility("default"))) ZEND_API void zend_signal_startup(void) { #ifdef ZTS +diff --git a/ext/date/php_date.c b/ext/date/php_date.c +index 02068b44..e7883b32 100644 +--- a/ext/date/php_date.c ++++ b/ext/date/php_date.c +@@ -683,7 +683,7 @@ static zval *date_period_get_property_ptr_ptr(zval *object, zval *member, int ty + static int date_object_compare_timezone(zval *tz1, zval *tz2); + + /* {{{ Module struct */ +-zend_module_entry date_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry date_module_entry = { + STANDARD_MODULE_HEADER_EX, + NULL, + NULL, +diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c +index c024e166..926708dc 100644 +--- a/ext/libxml/libxml.c ++++ b/ext/libxml/libxml.c +@@ -130,7 +130,7 @@ static const zend_function_entry libxml_functions[] = { + PHP_FE_END + }; + +-zend_module_entry libxml_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry libxml_module_entry = { + STANDARD_MODULE_HEADER, + "libxml", /* extension name */ + libxml_functions, /* extension function list */ +diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c +index 39896bb0..9d7c7d12 100644 +--- a/ext/pcre/php_pcre.c ++++ b/ext/pcre/php_pcre.c +@@ -3058,7 +3058,7 @@ static const zend_function_entry pcre_functions[] = { + PHP_FE_END + }; + +-zend_module_entry pcre_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry pcre_module_entry = { + STANDARD_MODULE_HEADER, + "pcre", + pcre_functions, +diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c +index f62dd15e..78638d9c 100644 +--- a/ext/reflection/php_reflection.c ++++ b/ext/reflection/php_reflection.c +@@ -6946,7 +6946,7 @@ PHP_MINFO_FUNCTION(reflection) /* {{{ */ + php_info_print_table_end(); + } /* }}} */ + +-zend_module_entry reflection_module_entry = { /* {{{ */ ++__attribute__((visibility("default"))) zend_module_entry reflection_module_entry = { /* {{{ */ + STANDARD_MODULE_HEADER, + "Reflection", + reflection_ext_functions, +diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c +index 6394d491..dc21dc11 100644 +--- a/ext/simplexml/simplexml.c ++++ b/ext/simplexml/simplexml.c +@@ -2661,7 +2661,7 @@ static const zend_module_dep simplexml_deps[] = { /* {{{ */ + }; + /* }}} */ + +-zend_module_entry simplexml_module_entry = { /* {{{ */ ++__attribute__((visibility("default"))) zend_module_entry simplexml_module_entry = { /* {{{ */ + STANDARD_MODULE_HEADER_EX, NULL, + simplexml_deps, + "SimpleXML", +diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c +index b147a961..2e1e551d 100644 +--- a/ext/spl/php_spl.c ++++ b/ext/spl/php_spl.c +@@ -1042,7 +1042,7 @@ PHP_RSHUTDOWN_FUNCTION(spl) /* {{{ */ + + /* {{{ spl_module_entry + */ +-zend_module_entry spl_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry spl_module_entry = { + STANDARD_MODULE_HEADER, + "SPL", + spl_functions, +diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c +index 64f27ef5..a4905b8a 100644 +--- a/ext/standard/basic_functions.c ++++ b/ext/standard/basic_functions.c +@@ -3448,7 +3448,7 @@ static const zend_module_dep standard_deps[] = { /* {{{ */ + }; + /* }}} */ + +-zend_module_entry basic_functions_module = { /* {{{ */ ++__attribute__((visibility("default"))) zend_module_entry basic_functions_module = { /* {{{ */ + STANDARD_MODULE_HEADER_EX, + NULL, + standard_deps, diff --git a/php-7.3.4-libtool-2.4.6.patch b/php-7.3.4-libtool-2.4.6.patch new file mode 100644 index 0000000..2e3a85f --- /dev/null +++ b/php-7.3.4-libtool-2.4.6.patch @@ -0,0 +1,115 @@ +diff -up php-7.3.4/build/Makefile.global.omv~ php-7.3.4/build/Makefile.global +--- php-7.3.4/build/Makefile.global.omv~ 2019-04-03 03:49:31.503343477 +0200 ++++ php-7.3.4/build/Makefile.global 2019-04-03 03:49:41.524376338 +0200 +@@ -16,7 +16,7 @@ build-modules: $(PHP_MODULES) $(PHP_ZEND + build-binaries: $(PHP_BINARIES) + + libphp$(PHP_MAJOR_VERSION).la: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) +- $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ + -@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1 + + libs/libphp$(PHP_MAJOR_VERSION).bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) +diff -up php-7.3.4/sapi/cgi/config9.m4.omv~ php-7.3.4/sapi/cgi/config9.m4 +--- php-7.3.4/sapi/cgi/config9.m4.omv~ 2019-04-03 03:49:12.605281759 +0200 ++++ php-7.3.4/sapi/cgi/config9.m4 2019-04-03 03:49:28.095332321 +0200 +@@ -53,16 +53,16 @@ if test "$PHP_CGI" != "no"; then + case $host_alias in + *aix*) + if test "$php_sapi_module" = "shared"; then +- BUILD_CGI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CGI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/.libs\/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ++ BUILD_CGI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CGI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/.libs\/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" + else +- BUILD_CGI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CGI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ++ BUILD_CGI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CGI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" + fi + ;; + *darwin*) + BUILD_CGI="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_CGI_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" + ;; + *) +- BUILD_CGI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ++ BUILD_CGI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" + ;; + esac + +diff -up php-7.3.4/sapi/cgi/config.w32.omv~ php-7.3.4/sapi/cgi/config.w32 +diff -up php-7.3.4/sapi/fpm/config.m4.omv~ php-7.3.4/sapi/fpm/config.m4 +--- php-7.3.4/sapi/fpm/config.m4.omv~ 2019-04-03 03:48:02.579056166 +0200 ++++ php-7.3.4/sapi/fpm/config.m4 2019-04-03 03:48:15.722098116 +0200 +@@ -706,13 +706,13 @@ if test "$PHP_FPM" != "no"; then + + case $host_alias in + *aix*) +- BUILD_FPM="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FPM_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" ++ BUILD_FPM="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FPM_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" + ;; + *darwin*) + BUILD_FPM="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_FPM_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" + ;; + *) +- BUILD_FPM="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" ++ BUILD_FPM="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)" + ;; + esac + +diff -up php-7.3.4/sapi/phpdbg/config.m4.omv~ php-7.3.4/sapi/phpdbg/config.m4 +--- php-7.3.4/sapi/phpdbg/config.m4.omv~ 2019-04-03 03:48:27.441135676 +0200 ++++ php-7.3.4/sapi/phpdbg/config.m4 2019-04-03 03:48:43.169186314 +0200 +@@ -37,7 +37,7 @@ if test "$BUILD_PHPDBG" = "" && test "$P + BUILD_BINARY="sapi/phpdbg/phpdbg" + BUILD_SHARED="sapi/phpdbg/libphpdbg.la" + +- BUILD_PHPDBG="\$(LIBTOOL) --mode=link \ ++ BUILD_PHPDBG="\$(LIBTOOL) --mode=link --tag=CC \ + \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ + \$(PHP_GLOBAL_OBJS) \ + \$(PHP_BINARY_OBJS) \ +@@ -48,7 +48,7 @@ if test "$BUILD_PHPDBG" = "" && test "$P + \$(PHP_FRAMEWORKS) \ + -o \$(BUILD_BINARY)" + +- BUILD_PHPDBG_SHARED="\$(LIBTOOL) --mode=link \ ++ BUILD_PHPDBG_SHARED="\$(LIBTOOL) --mode=link --tag=CC \ + \$(CC) -shared -Wl,-soname,libphpdbg.so -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ + \$(PHP_GLOBAL_OBJS) \ + \$(PHP_BINARY_OBJS) \ +diff -up php-7.3.4/sapi/phpdbg/config..omv~ php-7.3.4/sapi/phpdbg/config. +diff -up php-7.3.4/sapi/cli/config.m4.omv~ php-7.3.4/sapi/cli/config.m4 +--- php-7.3.4/sapi/cli/config.m4.omv~ 2019-04-03 03:52:42.245983057 +0200 ++++ php-7.3.4/sapi/cli/config.m4 2019-04-03 03:52:55.589028777 +0200 +@@ -33,16 +33,16 @@ if test "$PHP_CLI" != "no"; then + case $host_alias in + *aix*) + if test "$php_sapi_module" = "shared"; then +- BUILD_CLI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/.libs\/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ++ BUILD_CLI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/.libs\/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" + else +- BUILD_CLI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ++ BUILD_CLI="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" + fi + ;; + *darwin*) + BUILD_CLI="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_CLI_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" + ;; + *) +- BUILD_CLI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ++ BUILD_CLI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" + ;; + esac + +diff -up php-7.3.4/configure.ac.omv~ php-7.3.4/configure.ac +--- php-7.3.4/configure.ac.omv~ 2019-04-03 14:28:11.391584272 +0200 ++++ php-7.3.4/configure.ac 2019-04-03 14:29:17.445196792 +0200 +@@ -1479,8 +1479,9 @@ PHP_SET_LIBTOOL_VARIABLE([--silent]) + dnl libtool 1.4.3 needs this. + PHP_SET_LIBTOOL_VARIABLE([--preserve-dup-deps]) ++PHP_SET_LIBTOOL_VARIABLE([--tag=CC]) + +-test -z "$PHP_COMPILE" && PHP_COMPILE='$(LIBTOOL) --mode=compile $(COMPILE) -c $<' +-test -z "$CXX_PHP_COMPILE" && CXX_PHP_COMPILE='$(LIBTOOL) --mode=compile $(CXX_COMPILE) -c $<' ++test -z "$PHP_COMPILE" && PHP_COMPILE='$(LIBTOOL) --mode=compile --tag=CC $(COMPILE) -c $<' ++test -z "$CXX_PHP_COMPILE" && CXX_PHP_COMPILE='$(LIBTOOL) --mode=compile --tag=CXX $(CXX_COMPILE) -c $<' + SHARED_LIBTOOL='$(LIBTOOL)' + + CC=$old_CC diff --git a/php-7.4.0-phpize.patch b/php-7.4.0-phpize.patch new file mode 100644 index 0000000..fb99f3e --- /dev/null +++ b/php-7.4.0-phpize.patch @@ -0,0 +1,35 @@ +diff -up ./scripts/phpize.in.headers ./scripts/phpize.in +--- ./scripts/phpize.in.headers 2019-07-23 10:05:11.000000000 +0200 ++++ ./scripts/phpize.in 2019-07-23 10:18:13.648098089 +0200 +@@ -165,6 +165,15 @@ phpize_autotools() + $PHP_AUTOHEADER || exit 1 + } + ++phpize_check_headers() ++{ ++ if test ! -f $includedir/main/php.h; then ++ echo "Can't find PHP headers in $includedir" ++ echo "The php-devel package is required for use of this command." ++ exit 1 ++ fi ++} ++ + # Main script + + case "$1" in +@@ -183,12 +192,15 @@ case "$1" in + + # Version + --version|-v) ++ phpize_check_headers + phpize_print_api_numbers + exit 0 + ;; + + # Default + *) ++ phpize_check_headers ++ + phpize_check_configm4 0 + + phpize_check_build_files diff --git a/php-7.4.1-missing-symbols.patch b/php-7.4.1-missing-symbols.patch new file mode 100644 index 0000000..453ea16 --- /dev/null +++ b/php-7.4.1-missing-symbols.patch @@ -0,0 +1,36 @@ +diff -up php-7.4.1/build/Makefile.global.omv~ php-7.4.1/build/Makefile.global +--- php-7.4.1/build/Makefile.global.omv~ 2020-01-09 17:28:46.652882773 +0100 ++++ php-7.4.1/build/Makefile.global 2020-01-09 17:28:59.936882128 +0100 +@@ -16,7 +16,7 @@ build-modules: $(PHP_MODULES) $(PHP_ZEND + build-binaries: $(PHP_BINARIES) + + libphp$(PHP_MAJOR_VERSION)_common.la: $(PHP_GLOBAL_OBJS) +- $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -version-info 8:0:3 -rpath $(phptempdir) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -version-info 8:0:3 -rpath $(phptempdir) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -lz -o $@ + -@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1 + + libphp$(PHP_MAJOR_VERSION).la: libphp$(PHP_MAJOR_VERSION)_common.la $(PHP_SAPI_OBJS) +diff -up php-7.4.1/ext/hash/hash.c.omv~ php-7.4.1/ext/hash/hash.c +--- php-7.4.1/ext/hash/hash.c.omv~ 2020-01-09 15:43:14.481189986 +0100 ++++ php-7.4.1/ext/hash/hash.c 2020-01-09 15:43:30.344189217 +0100 +@@ -1486,7 +1486,7 @@ static const zend_function_entry hash_fu + + /* {{{ hash_module_entry + */ +-zend_module_entry hash_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry hash_module_entry = { + STANDARD_MODULE_HEADER, + PHP_HASH_EXTNAME, + hash_functions, +diff -up php-7.4.1/ext/gd/gd.c.omv~ php-7.4.1/ext/gd/gd.c +--- php-7.4.1/ext/gd/gd.c.omv~ 2020-01-10 21:34:30.189975665 +0100 ++++ php-7.4.1/ext/gd/gd.c 2020-01-10 21:34:43.455975021 +0100 +@@ -1018,7 +1018,7 @@ static const zend_function_entry gd_func + }; + /* }}} */ + +-zend_module_entry gd_module_entry = { ++__attribute__((visibility("default"))) zend_module_entry gd_module_entry = { + STANDARD_MODULE_HEADER, + "gd", + gd_functions, diff --git a/php-7.4.30-svace-fixes.patch b/php-7.4.30-svace-fixes.patch new file mode 100644 index 0000000..8a50b20 --- /dev/null +++ b/php-7.4.30-svace-fixes.patch @@ -0,0 +1,339 @@ +diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c +index 33dfea0..057fe96 100644 +--- a/Zend/zend_builtin_functions.c ++++ b/Zend/zend_builtin_functions.c +@@ -1636,7 +1636,9 @@ ZEND_FUNCTION(set_error_handler) + zend_string *error_handler_name = zend_get_callable_name(error_handler); + zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback", + get_active_function_name(), error_handler_name?ZSTR_VAL(error_handler_name):"unknown"); +- zend_string_release_ex(error_handler_name, 0); ++ if (error_handler_name) { ++ zend_string_release_ex(error_handler_name, 0); ++ } + return; + } + } +@@ -1703,7 +1705,9 @@ ZEND_FUNCTION(set_exception_handler) + zend_string *exception_handler_name = zend_get_callable_name(exception_handler); + zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback", + get_active_function_name(), exception_handler_name?ZSTR_VAL(exception_handler_name):"unknown"); +- zend_string_release_ex(exception_handler_name, 0); ++ if (exception_handler_name) { ++ zend_string_release_ex(exception_handler_name, 0); ++ } + return; + } + } +diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c +index 2d52e4e..a1c1022 100644 +--- a/Zend/zend_exceptions.c ++++ b/Zend/zend_exceptions.c +@@ -1040,8 +1040,12 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* { + zend_error_va(severity, (file && ZSTR_LEN(file) > 0) ? ZSTR_VAL(file) : NULL, line, + "Uncaught %s\n thrown", ZSTR_VAL(str)); + +- zend_string_release_ex(str, 0); +- zend_string_release_ex(file, 0); ++ if (str) { ++ zend_string_release_ex(str, 0); ++ } ++ if (file) { ++ zend_string_release_ex(file, 0); ++ } + } else { + zend_error(severity, "Uncaught exception '%s'", ZSTR_VAL(ce_exception->name)); + } +diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c +index 956ffbb..0c7c65e 100644 +--- a/Zend/zend_multibyte.c ++++ b/Zend/zend_multibyte.c +@@ -115,6 +115,9 @@ ZEND_API int zend_multibyte_set_functions(const zend_multibyte_functions *functi + */ + { + const char *value = zend_ini_string("zend.script_encoding", sizeof("zend.script_encoding") - 1, 0); ++ if (!value) { ++ return FAILURE; ++ } + zend_multibyte_set_script_encoding_by_string(value, strlen(value)); + } + return SUCCESS; +diff --git a/ext/dom/entity.c b/ext/dom/entity.c +index b412550..34b83ee 100644 +--- a/ext/dom/entity.c ++++ b/ext/dom/entity.c +@@ -106,6 +106,9 @@ int dom_entity_notation_name_read(dom_object *obj, zval *retval) + ZVAL_NULL(retval); + } else { + content = (char *) xmlNodeGetContent((xmlNodePtr) nodep); ++ if (!content) { ++ return FAILURE; ++ } + ZVAL_STRING(retval, content); + xmlFree(content); + } +diff --git a/ext/phar/phar.c b/ext/phar/phar.c +index ecab916..06bb697 100644 +--- a/ext/phar/phar.c ++++ b/ext/phar/phar.c +@@ -2751,8 +2751,10 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv + newentry = phar_open_jit(phar, entry, error); + if (!newentry) { + /* major problem re-opening, so we ignore this file and the error */ +- efree(*error); +- *error = NULL; ++ if (error) { ++ efree(*error); ++ *error = NULL; ++ } + continue; + } + entry = newentry; +diff --git a/ext/phar/tar.c b/ext/phar/tar.c +index 03e6dd4..52b5c5d 100644 +--- a/ext/phar/tar.c ++++ b/ext/phar/tar.c +@@ -899,7 +899,7 @@ int phar_tar_setmetadata(zval *metadata, phar_entry_info *entry, char **error) / + spprintf(error, 0, "phar error: unable to create temporary file"); + return -1; + } +- if (ZSTR_LEN(entry->metadata_str.s) != php_stream_write(entry->fp, ZSTR_VAL(entry->metadata_str.s), ZSTR_LEN(entry->metadata_str.s))) { ++ if (entry->metadata_str.s && ZSTR_LEN(entry->metadata_str.s) != php_stream_write(entry->fp, ZSTR_VAL(entry->metadata_str.s), ZSTR_LEN(entry->metadata_str.s))) { + spprintf(error, 0, "phar tar error: unable to write metadata to magic metadata file \"%s\"", entry->filename); + zend_hash_str_del(&(entry->phar->manifest), entry->filename, entry->filename_len); + return ZEND_HASH_APPLY_STOP; +diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c +index f4d8066..9386c05 100644 +--- a/ext/sqlite3/sqlite3.c ++++ b/ext/sqlite3/sqlite3.c +@@ -877,7 +877,9 @@ static int sqlite3_do_callback(struct php_sqlite3_fci *fc, zval *cb, int argc, s + if (agg_context && !Z_ISUNDEF(agg_context->zval_context)) { + zval_ptr_dtor(&agg_context->zval_context); + } +- ZVAL_COPY_VALUE(&agg_context->zval_context, &retval); ++ if (agg_context) { ++ ZVAL_COPY_VALUE(&agg_context->zval_context, &retval); ++ } + ZVAL_UNDEF(&retval); + } + +diff --git a/ext/standard/filters.c b/ext/standard/filters.c +index 018270c..6acce21 100644 +--- a/ext/standard/filters.c ++++ b/ext/standard/filters.c +@@ -766,7 +766,7 @@ static void php_conv_qprint_encode_dtor(php_conv_qprint_encode *inst) + } + + #define NEXT_CHAR(ps, icnt, lb_ptr, lb_cnt, lbchars) \ +- ((lb_ptr) < (lb_cnt) ? (lbchars)[(lb_ptr)] : *(ps)) ++ ((lb_ptr) < (lb_cnt) && (lbchars) ? (lbchars)[(lb_ptr)] : ((ps) ? *(ps) : '\0')) + + #define CONSUME_CHAR(ps, icnt, lb_ptr, lb_cnt) \ + if ((lb_ptr) < (lb_cnt)) { \ +diff --git a/ext/standard/var.c b/ext/standard/var.c +index 37a68bb..ba68cf3 100644 +--- a/ext/standard/var.c ++++ b/ext/standard/var.c +@@ -1070,8 +1070,10 @@ again: + /* Mark this value in the var_hash, to avoid creating references to it. */ + zval *var_idx = zend_hash_index_find(&var_hash->ht, + (zend_ulong) (zend_uintptr_t) Z_COUNTED_P(struc)); +- ZVAL_LONG(var_idx, -1); +- smart_str_appendl(buf, "N;", 2); ++ if (var_idx) { ++ ZVAL_LONG(var_idx, -1); ++ smart_str_appendl(buf, "N;", 2); ++ } + } + if (serialized_data) { + efree(serialized_data); +diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c +index 7a05286..378c585 100644 +--- a/sapi/fpm/fpm/fpm_conf.c ++++ b/sapi/fpm/fpm/fpm_conf.c +@@ -720,8 +720,8 @@ static int fpm_evaluate_full_path(char **path, struct fpm_worker_pool_s *wp, cha + } + + if (strlen(*path) > strlen("$prefix")) { +- free(*path); + tmp = strdup((*path) + strlen("$prefix")); ++ free(*path); + *path = tmp; + } else { + free(*path); +diff --git a/sapi/fpm/fpm/zlog.c b/sapi/fpm/fpm/zlog.c +index 4808447..849370c 100644 +--- a/sapi/fpm/fpm/zlog.c ++++ b/sapi/fpm/fpm/zlog.c +@@ -348,7 +348,7 @@ static ssize_t zlog_stream_direct_write( + static inline ssize_t zlog_stream_unbuffered_write( + struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */ + { +- const char *append; ++ const char *append = NULL; + size_t append_len = 0, required_len, reserved_len; + ssize_t written; + +@@ -637,10 +637,10 @@ zlog_bool zlog_stream_set_msg_suffix( + if (suffix != NULL) { + stream->msg_suffix_len = strlen(suffix); + len = stream->msg_suffix_len + 1; +- stream->msg_suffix = malloc(len); + if (stream->msg_suffix != NULL) { + free(stream->msg_suffix); + } ++ stream->msg_suffix = malloc(len); + if (stream->msg_suffix == NULL) { + return ZLOG_FALSE; + } +@@ -652,7 +652,7 @@ zlog_bool zlog_stream_set_msg_suffix( + len = stream->msg_final_suffix_len + 1; + stream->msg_final_suffix = malloc(len); + if (stream->msg_final_suffix != NULL) { +- free(stream->msg_suffix); ++ free(stream->msg_final_suffix); + } + if (stream->msg_final_suffix == NULL) { + return ZLOG_FALSE; +diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c +index 6b0de5c..0764789 100644 +--- a/sapi/phpdbg/phpdbg_prompt.c ++++ b/sapi/phpdbg/phpdbg_prompt.c +@@ -544,6 +544,9 @@ int phpdbg_compile_stdin(zend_string *code) { + /* remove trailing data after zero byte, used for avoiding conflicts in eval()'ed code snippets */ + zend_string *source_path = strpprintf(0, "Standard input code%c%p", 0, PHPDBG_G(ops)->opcodes); + phpdbg_file_source *data = zend_hash_find_ptr(&PHPDBG_G(file_sources), source_path); ++ if (!data) { ++ return FAILURE; ++ } + dtor_func_t dtor = PHPDBG_G(file_sources).pDestructor; + PHPDBG_G(file_sources).pDestructor = NULL; + zend_hash_del(&PHPDBG_G(file_sources), source_path); +@@ -1349,7 +1352,7 @@ PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name) + module_entry->handle = handle; + + if ((module_entry = zend_register_module_ex(module_entry)) == NULL) { +- phpdbg_error("dl", "type=\"registerfailure\" module=\"%s\"", "Unable to register module %s", module_entry->name); ++ phpdbg_error("dl", "type=\"registerfailure\" module=\"%s\"", "Unable to register module %s", "Unknown module"); + + goto quit; + } +diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c +index 4d10e68..1acfec6 100644 +--- a/main/streams/plain_wrapper.c ++++ b/main/streams/plain_wrapper.c +@@ -926,6 +926,7 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void + } + } + ++ return PHP_STREAM_OPTION_RETURN_NOTIMPL; + #ifdef PHP_WIN32 + case PHP_STREAM_OPTION_PIPE_BLOCKING: + data->is_pipe_blocking = value; +diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c +index b0de6e4..5e3adec 100644 +--- a/ext/phar/phar_object.c ++++ b/ext/phar/phar_object.c +@@ -2654,16 +2654,14 @@ + zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname); + return; + } +- if (zend_hash_str_exists(&phar_obj->archive->manifest, fname, (uint32_t) fname_len)) { +- if (NULL != (entry = zend_hash_str_find_ptr(&phar_obj->archive->manifest, fname, (uint32_t) fname_len))) { +- if (entry->is_deleted) { +- /* entry is deleted, but has not been flushed to disk yet */ +- RETURN_TRUE; +- } else { +- entry->is_deleted = 1; +- entry->is_modified = 1; +- phar_obj->archive->is_modified = 1; +- } ++ if (NULL != (entry = zend_hash_str_find_ptr(&phar_obj->archive->manifest, fname, (uint32_t) fname_len))) { ++ if (entry->is_deleted) { ++ /* entry is deleted, but has not been flushed to disk yet */ ++ RETURN_TRUE; ++ } else { ++ entry->is_deleted = 1; ++ entry->is_modified = 1; ++ phar_obj->archive->is_modified = 1; + } + } else { + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be deleted", fname); +@@ -3478,18 +3476,16 @@ + RETURN_FALSE; + } + +- if (!zend_hash_str_exists(&phar_obj->archive->manifest, oldfile, (uint32_t) oldfile_len) || NULL == (oldentry = zend_hash_str_find_ptr(&phar_obj->archive->manifest, oldfile, (uint32_t) oldfile_len)) || oldentry->is_deleted) { ++ if (NULL == (oldentry = zend_hash_str_find_ptr(&phar_obj->archive->manifest, oldfile, (uint32_t) oldfile_len)) || oldentry->is_deleted) { + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, + "file \"%s\" cannot be copied to file \"%s\", file does not exist in %s", oldfile, newfile, phar_obj->archive->fname); + RETURN_FALSE; + } + +- if (zend_hash_str_exists(&phar_obj->archive->manifest, newfile, (uint32_t) newfile_len)) { +- if (NULL != (temp = zend_hash_str_find_ptr(&phar_obj->archive->manifest, newfile, (uint32_t) newfile_len)) || !temp->is_deleted) { +- zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, +- "file \"%s\" cannot be copied to file \"%s\", file must not already exist in phar %s", oldfile, newfile, phar_obj->archive->fname); +- RETURN_FALSE; +- } ++ if (NULL != (temp = zend_hash_str_find_ptr(&phar_obj->archive->manifest, newfile, (uint32_t) newfile_len)) && !temp->is_deleted) { ++ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, ++ "file \"%s\" cannot be copied to file \"%s\", file must not already exist in phar %s", oldfile, newfile, phar_obj->archive->fname); ++ RETURN_FALSE; + } + + tmp_len = newfile_len; +diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c +index 6ce9d4b..d8e26f6 100644 +--- a/ext/enchant/enchant.c ++++ b/ext/enchant/enchant.c +@@ -269,7 +269,9 @@ static void php_enchant_dict_free(zend_resource *rsrc) /* {{{ */ + enchant_broker_free_dict(pbroker->pbroker, pdict->pdict); + } + +- pbroker->dict[pdict->id] = NULL; ++ if (pbroker->dict) ++ pbroker->dict[pdict->id] = NULL; ++ + efree(pdict); + zend_list_delete(pbroker->rsrc); + } +diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +index ac476b3..9b51dd0 100644 +--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c ++++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +@@ -682,7 +682,7 @@ mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter) + k = filter->cache; + filter->cache = 0; + +- if (filter->status == 1 && k >= 0 && k <= jisx0213_u2_tbl_len) { ++ if (filter->status == 1 && k >= 0 && k < jisx0213_u2_tbl_len) { + s1 = jisx0213_u2_fb_tbl[k]; + + if (filter->to->no_encoding == mbfl_no_encoding_sjis2004) { +diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c +index e0cf63d..d30d9e1 100644 +--- a/ext/soap/php_encoding.c ++++ b/ext/soap/php_encoding.c +@@ -907,7 +907,7 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo + xmlAddChild(ret, text); + efree(str); + +- if (style == SOAP_ENCODED) { ++ if (style == SOAP_ENCODED && type) { + set_ns_and_type(ret, type); + } + return ret; +diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c +index 4dcaf12..96e516b 100644 +--- a/ext/mysqlnd/mysqlnd_result.c ++++ b/ext/mysqlnd/mysqlnd_result.c +@@ -1396,8 +1396,8 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c + UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); + free_end: + PACKET_FREE(&row_packet); ++ DBG_INF_FMT("rows=%llu", (unsigned long long)set->row_count); + end: +- DBG_INF_FMT("rows=%llu", (unsigned long long)result->stored_data->row_count); + DBG_RETURN(ret); + } + /* }}} */ diff --git a/php-7.4.33-openssl3.patch b/php-7.4.33-openssl3.patch new file mode 100644 index 0000000..5c75dda --- /dev/null +++ b/php-7.4.33-openssl3.patch @@ -0,0 +1,2017 @@ +# rediff from https://git.remirepo.net/cgit/rpms/scl-php74/php.git/plain/php-7.4.26-openssl3.patch + +diff -ruN a/ext/openssl/openssl.c b/ext/openssl/openssl.c +--- a/ext/openssl/openssl.c 2024-08-09 13:19:44.284566181 +0900 ++++ b/ext/openssl/openssl.c 2024-08-09 13:59:20.384801178 +0900 +@@ -25,6 +25,9 @@ + #include "config.h" + #endif + ++# pragma GCC diagnostic ignored "-Wdeprecated-declarations" ++# pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" ++ + #include "php.h" + #include "php_ini.h" + #include "php_openssl.h" +@@ -55,6 +58,11 @@ + #include + #include + #include ++#include ++#if PHP_OPENSSL_API_VERSION >= 0x30000 ++#include ++#include ++#endif + + /* Common */ + #include +@@ -833,8 +841,8 @@ + static char default_ssl_conf_filename[MAXPATHLEN]; + + struct php_x509_request { /* {{{ */ +- LHASH_OF(CONF_VALUE) * global_config; /* Global SSL config */ +- LHASH_OF(CONF_VALUE) * req_config; /* SSL config for this request */ ++ CONF *global_config; /* Global SSL config */ ++ CONF *req_config; + const EVP_MD * md_alg; + const EVP_MD * digest; + char * section_name, +@@ -1046,13 +1054,13 @@ + } + /* }}} */ + +-static inline int php_openssl_config_check_syntax(const char * section_label, const char * config_filename, const char * section, LHASH_OF(CONF_VALUE) * config) /* {{{ */ ++static inline int php_openssl_config_check_syntax(const char * section_label, const char * config_filename, const char * section, CONF *config) /* {{{ */ + { + X509V3_CTX ctx; + + X509V3_set_ctx_test(&ctx); +- X509V3_set_conf_lhash(&ctx, config); +- if (!X509V3_EXT_add_conf(config, &ctx, (char *)section, NULL)) { ++ X509V3_set_nconf(&ctx, config); ++ if (!X509V3_EXT_add_nconf(config, &ctx, (char *)section, NULL)) { + php_openssl_store_errors(); + php_error_docref(NULL, E_WARNING, "Error loading %s section %s of %s", + section_label, +@@ -1064,17 +1072,24 @@ + } + /* }}} */ + +-static char *php_openssl_conf_get_string( +- LHASH_OF(CONF_VALUE) *conf, const char *group, const char *name) { +- char *str = CONF_get_string(conf, group, name); +- if (str == NULL) { +- /* OpenSSL reports an error if a configuration value is not found. +- * However, we don't want to generate errors for optional configuration. */ +- ERR_clear_error(); +- } ++static char *php_openssl_conf_get_string(CONF *conf, const char *group, const char *name) { ++ /* OpenSSL reports an error if a configuration value is not found. ++ * However, we don't want to generate errors for optional configuration. */ ++ ERR_set_mark(); ++ char *str = NCONF_get_string(conf, group, name); ++ ERR_pop_to_mark(); + return str; + } + ++static long php_openssl_conf_get_number(CONF *conf, const char *group, const char *name) { ++ /* Same here, ignore errors. */ ++ long res = 0; ++ ERR_set_mark(); ++ NCONF_get_number(conf, group, name, &res); ++ ERR_pop_to_mark(); ++ return res; ++} ++ + static int php_openssl_add_oid_section(struct php_x509_request * req) /* {{{ */ + { + char * str; +@@ -1086,7 +1101,7 @@ + if (str == NULL) { + return SUCCESS; + } +- sktmp = CONF_get_section(req->req_config, str); ++ sktmp = NCONF_get_section(req->req_config, str); + if (sktmp == NULL) { + php_openssl_store_errors(); + php_error_docref(NULL, E_WARNING, "problem loading oid section %s", str); +@@ -1157,13 +1172,12 @@ + + SET_OPTIONAL_STRING_ARG("config", req->config_filename, default_ssl_conf_filename); + SET_OPTIONAL_STRING_ARG("config_section_name", req->section_name, "req"); +- req->global_config = CONF_load(NULL, default_ssl_conf_filename, NULL); +- if (req->global_config == NULL) { ++ req->global_config = NCONF_new(NULL); ++ if (!NCONF_load(req->global_config, default_ssl_conf_filename, NULL)) { + php_openssl_store_errors(); + } +- req->req_config = CONF_load(NULL, req->config_filename, NULL); +- if (req->req_config == NULL) { +- php_openssl_store_errors(); ++ req->req_config = NCONF_new(NULL); ++ if (!NCONF_load(req->req_config, req->config_filename, NULL)) { + return FAILURE; + } + +@@ -1187,8 +1201,7 @@ + SET_OPTIONAL_STRING_ARG("req_extensions", req->request_extensions_section, + php_openssl_conf_get_string(req->req_config, req->section_name, "req_extensions")); + SET_OPTIONAL_LONG_ARG("private_key_bits", req->priv_key_bits, +- CONF_get_number(req->req_config, req->section_name, "default_bits")); +- ++ php_openssl_conf_get_number(req->req_config, req->section_name, "default_bits")); + SET_OPTIONAL_LONG_ARG("private_key_type", req->priv_key_type, OPENSSL_KEYTYPE_DEFAULT); + + if (optional_args && (item = zend_hash_str_find(Z_ARRVAL_P(optional_args), "encrypt_key", sizeof("encrypt_key")-1)) != NULL) { +@@ -1268,11 +1281,11 @@ + req->priv_key = NULL; + } + if (req->global_config) { +- CONF_free(req->global_config); ++ NCONF_free(req->global_config); + req->global_config = NULL; + } + if (req->req_config) { +- CONF_free(req->req_config); ++ NCONF_free(req->req_config); + req->req_config = NULL; + } + } +@@ -1517,7 +1530,9 @@ + REGISTER_LONG_CONSTANT("PKCS7_NOSIGS", PKCS7_NOSIGS, CONST_CS|CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("OPENSSL_PKCS1_PADDING", RSA_PKCS1_PADDING, CONST_CS|CONST_PERSISTENT); ++#ifdef RSA_SSLV23_PADDING + REGISTER_LONG_CONSTANT("OPENSSL_SSLV23_PADDING", RSA_SSLV23_PADDING, CONST_CS|CONST_PERSISTENT); ++#endif + REGISTER_LONG_CONSTANT("OPENSSL_NO_PADDING", RSA_NO_PADDING, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("OPENSSL_PKCS1_OAEP_PADDING", RSA_PKCS1_OAEP_PADDING, CONST_CS|CONST_PERSISTENT); + +@@ -3130,12 +3145,12 @@ + STACK_OF(CONF_VALUE) * dn_sk, *attr_sk = NULL; + char * str, *dn_sect, *attr_sect; + +- dn_sect = CONF_get_string(req->req_config, req->section_name, "distinguished_name"); ++ dn_sect = NCONF_get_string(req->req_config, req->section_name, "distinguished_name"); + if (dn_sect == NULL) { + php_openssl_store_errors(); + return FAILURE; + } +- dn_sk = CONF_get_section(req->req_config, dn_sect); ++ dn_sk = NCONF_get_section(req->req_config, dn_sect); + if (dn_sk == NULL) { + php_openssl_store_errors(); + return FAILURE; +@@ -3144,7 +3159,7 @@ + if (attr_sect == NULL) { + attr_sk = NULL; + } else { +- attr_sk = CONF_get_section(req->req_config, attr_sect); ++ attr_sk = NCONF_get_section(req->req_config, attr_sect); + if (attr_sk == NULL) { + php_openssl_store_errors(); + return FAILURE; +@@ -3550,8 +3565,8 @@ + X509V3_CTX ctx; + + X509V3_set_ctx(&ctx, cert, new_cert, csr, NULL, 0); +- X509V3_set_conf_lhash(&ctx, req.req_config); +- if (!X509V3_EXT_add_conf(req.req_config, &ctx, req.extensions_section, new_cert)) { ++ X509V3_set_nconf(&ctx, req.req_config); ++ if (!X509V3_EXT_add_nconf(req.req_config, &ctx, req.extensions_section, new_cert)) { + php_openssl_store_errors(); + goto cleanup; + } +@@ -3634,11 +3649,11 @@ + X509V3_CTX ext_ctx; + + X509V3_set_ctx(&ext_ctx, NULL, NULL, csr, NULL, 0); +- X509V3_set_conf_lhash(&ext_ctx, req.req_config); ++ X509V3_set_nconf(&ext_ctx, req.req_config); + + /* Add extensions */ +- if (req.request_extensions_section && !X509V3_EXT_REQ_add_conf(req.req_config, +- &ext_ctx, req.request_extensions_section, csr)) ++ if (req.request_extensions_section && !X509V3_EXT_REQ_add_nconf(req.req_config, ++ &ext_ctx, req.request_extensions_section, csr)) + { + php_openssl_store_errors(); + php_error_docref(NULL, E_WARNING, "Error loading extension section %s", req.request_extensions_section); +@@ -3712,6 +3727,20 @@ + } + /* }}} */ + ++static EVP_PKEY *php_openssl_extract_public_key(EVP_PKEY *priv_key) ++{ ++ /* Extract public key portion by round-tripping through PEM. */ ++ BIO *bio = BIO_new(BIO_s_mem()); ++ if (!bio || !PEM_write_bio_PUBKEY(bio, priv_key)) { ++ BIO_free(bio); ++ return NULL; ++ } ++ ++ EVP_PKEY *pub_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); ++ BIO_free(bio); ++ return pub_key; ++} ++ + /* {{{ proto mixed openssl_csr_get_public_key(mixed csr) + Returns the subject of a CERT or FALSE on error */ + PHP_FUNCTION(openssl_csr_get_public_key) +@@ -3719,42 +3748,24 @@ + zval * zcsr; + zend_bool use_shortnames = 1; + zend_resource *csr_resource; +- +- X509_REQ *orig_csr, *csr; ++ X509_REQ *csr; + EVP_PKEY *tpubkey; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &zcsr, &use_shortnames) == FAILURE) { + return; + } + +- orig_csr = php_openssl_csr_from_zval(zcsr, 0, &csr_resource); ++ csr = php_openssl_csr_from_zval(zcsr, 0, &csr_resource); + +- if (orig_csr == NULL) { ++ if (csr == NULL) { + RETURN_FALSE; + } + +-#if PHP_OPENSSL_API_VERSION >= 0x10100 +- /* Due to changes in OpenSSL 1.1 related to locking when decoding CSR, +- * the pub key is not changed after assigning. It means if we pass +- * a private key, it will be returned including the private part. +- * If we duplicate it, then we get just the public part which is +- * the same behavior as for OpenSSL 1.0 */ +- csr = X509_REQ_dup(orig_csr); +-#else +- csr = orig_csr; +-#endif +- +- /* Retrieve the public key from the CSR */ +- tpubkey = X509_REQ_get_pubkey(csr); +- +- if (csr != orig_csr) { +- /* We need to free the duplicated CSR */ +- X509_REQ_free(csr); +- } ++ tpubkey = php_openssl_extract_public_key(X509_REQ_get_pubkey(csr)); + + if (!csr_resource) { + /* We also need to free the original CSR if it was freshly created */ +- X509_REQ_free(orig_csr); ++ X509_REQ_free(csr); + } + + if (tpubkey == NULL) { +@@ -3985,140 +3996,130 @@ + } + /* }}} */ + ++static int php_openssl_get_evp_pkey_type(int key_type) { ++ switch (key_type) { ++ case OPENSSL_KEYTYPE_RSA: ++ return EVP_PKEY_RSA; ++#if !defined(NO_DSA) ++ case OPENSSL_KEYTYPE_DSA: ++ return EVP_PKEY_DSA; ++#endif ++#if !defined(NO_DH) ++ case OPENSSL_KEYTYPE_DH: ++ return EVP_PKEY_DH; ++#endif ++#ifdef HAVE_EVP_PKEY_EC ++ case OPENSSL_KEYTYPE_EC: ++ return EVP_PKEY_EC; ++#endif ++ default: ++ return -1; ++ } ++} ++ + /* {{{ php_openssl_generate_private_key */ + static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req) + { +- char * randfile = NULL; +- int egdsocket, seeded; +- EVP_PKEY * return_val = NULL; +- + if (req->priv_key_bits < MIN_KEY_LENGTH) { + php_error_docref(NULL, E_WARNING, "private key length is too short; it needs to be at least %d bits, not %d", + MIN_KEY_LENGTH, req->priv_key_bits); + return NULL; + } + +- randfile = php_openssl_conf_get_string(req->req_config, req->section_name, "RANDFILE"); ++ int type = php_openssl_get_evp_pkey_type(req->priv_key_type); ++ if (type < 0) { ++ php_error_docref(NULL, E_WARNING, "Unsupported private key type"); ++ return NULL; ++ } ++ ++ int egdsocket, seeded; ++ char *randfile = php_openssl_conf_get_string(req->req_config, req->section_name, "RANDFILE"); + php_openssl_load_rand_file(randfile, &egdsocket, &seeded); ++ PHP_OPENSSL_RAND_ADD_TIME(); + +- if ((req->priv_key = EVP_PKEY_new()) != NULL) { +- switch(req->priv_key_type) { +- case OPENSSL_KEYTYPE_RSA: +- { +- RSA* rsaparam; +-#if OPENSSL_VERSION_NUMBER < 0x10002000L +- /* OpenSSL 1.0.2 deprecates RSA_generate_key */ +- PHP_OPENSSL_RAND_ADD_TIME(); +- rsaparam = (RSA*)RSA_generate_key(req->priv_key_bits, RSA_F4, NULL, NULL); +-#else +- { +- BIGNUM *bne = (BIGNUM *)BN_new(); +- if (BN_set_word(bne, RSA_F4) != 1) { +- BN_free(bne); +- php_error_docref(NULL, E_WARNING, "failed setting exponent"); +- return NULL; +- } +- rsaparam = RSA_new(); +- PHP_OPENSSL_RAND_ADD_TIME(); +- if (rsaparam == NULL || !RSA_generate_key_ex(rsaparam, req->priv_key_bits, bne, NULL)) { +- php_openssl_store_errors(); +- RSA_free(rsaparam); +- rsaparam = NULL; +- } +- BN_free(bne); +- } +-#endif +- if (rsaparam && EVP_PKEY_assign_RSA(req->priv_key, rsaparam)) { +- return_val = req->priv_key; +- } else { +- php_openssl_store_errors(); +- } +- } +- break; ++ EVP_PKEY *key = NULL; ++ EVP_PKEY *params = NULL; ++ EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(type, NULL); ++ if (!ctx) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ ++ if (type != EVP_PKEY_RSA) { ++ if (EVP_PKEY_paramgen_init(ctx) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ ++ switch (type) { + #if !defined(NO_DSA) +- case OPENSSL_KEYTYPE_DSA: +- PHP_OPENSSL_RAND_ADD_TIME(); +- { +- DSA *dsaparam = DSA_new(); +- if (dsaparam && DSA_generate_parameters_ex(dsaparam, req->priv_key_bits, NULL, 0, NULL, NULL, NULL)) { +- DSA_set_method(dsaparam, DSA_get_default_method()); +- if (DSA_generate_key(dsaparam)) { +- if (EVP_PKEY_assign_DSA(req->priv_key, dsaparam)) { +- return_val = req->priv_key; +- } else { +- php_openssl_store_errors(); +- } +- } else { +- php_openssl_store_errors(); +- DSA_free(dsaparam); +- } +- } else { +- php_openssl_store_errors(); +- } +- } +- break; ++ case EVP_PKEY_DSA: ++ if (EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, req->priv_key_bits) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ break; + #endif + #if !defined(NO_DH) +- case OPENSSL_KEYTYPE_DH: +- PHP_OPENSSL_RAND_ADD_TIME(); +- { +- int codes = 0; +- DH *dhparam = DH_new(); +- if (dhparam && DH_generate_parameters_ex(dhparam, req->priv_key_bits, 2, NULL)) { +- DH_set_method(dhparam, DH_get_default_method()); +- if (DH_check(dhparam, &codes) && codes == 0 && DH_generate_key(dhparam)) { +- if (EVP_PKEY_assign_DH(req->priv_key, dhparam)) { +- return_val = req->priv_key; +- } else { +- php_openssl_store_errors(); +- } +- } else { +- php_openssl_store_errors(); +- DH_free(dhparam); +- } +- } else { +- php_openssl_store_errors(); +- } +- } +- break; ++ case EVP_PKEY_DH: ++ if (EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, req->priv_key_bits) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ break; + #endif + #ifdef HAVE_EVP_PKEY_EC +- case OPENSSL_KEYTYPE_EC: +- { +- EC_KEY *eckey; +- if (req->curve_name == NID_undef) { +- php_error_docref(NULL, E_WARNING, "Missing configuration value: 'curve_name' not set"); +- return NULL; +- } +- eckey = EC_KEY_new_by_curve_name(req->curve_name); +- if (eckey) { +- EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE); +- if (EC_KEY_generate_key(eckey) && +- EVP_PKEY_assign_EC_KEY(req->priv_key, eckey)) { +- return_val = req->priv_key; +- } else { +- EC_KEY_free(eckey); +- } +- } +- } +- break; ++ case EVP_PKEY_EC: ++ if (req->curve_name == NID_undef) { ++ php_error_docref(NULL, E_WARNING, "Missing configuration value: \"curve_name\" not set"); ++ goto cleanup; ++ } ++ ++ if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, req->curve_name) <= 0 || ++ EVP_PKEY_CTX_set_ec_param_enc(ctx, OPENSSL_EC_NAMED_CURVE) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ break; + #endif +- default: +- php_error_docref(NULL, E_WARNING, "Unsupported private key type"); ++ EMPTY_SWITCH_DEFAULT_CASE() ++ } ++ ++ if (EVP_PKEY_paramgen(ctx, ¶ms) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; + } +- } else { ++ ++ EVP_PKEY_CTX_free(ctx); ++ ctx = EVP_PKEY_CTX_new(params, NULL); ++ if (!ctx) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } ++ } ++ ++ if (EVP_PKEY_keygen_init(ctx) <= 0) { + php_openssl_store_errors(); ++ goto cleanup; + } + +- php_openssl_write_rand_file(randfile, egdsocket, seeded); ++ if (type == EVP_PKEY_RSA && EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, req->priv_key_bits) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; ++ } + +- if (return_val == NULL) { +- EVP_PKEY_free(req->priv_key); +- req->priv_key = NULL; +- return NULL; ++ if (EVP_PKEY_keygen(ctx, &key) <= 0) { ++ php_openssl_store_errors(); ++ goto cleanup; + } + +- return return_val; ++ req->priv_key = key; ++ ++cleanup: ++ php_openssl_write_rand_file(randfile, egdsocket, seeded); ++ EVP_PKEY_free(params); ++ EVP_PKEY_CTX_free(ctx); ++ return key; + } + /* }}} */ + +@@ -4372,8 +4373,222 @@ + } + /* }}} */ + +-/* {{{ proto resource openssl_pkey_new([array configargs]) +- Generates a new private key */ ++#ifdef HAVE_EVP_PKEY_EC ++#if PHP_OPENSSL_API_VERSION < 0x30000 ++static int php_openssl_pkey_init_legacy_ec(EC_KEY *eckey, zval *data, int *is_private) { ++ EC_GROUP *group = NULL; ++ EC_POINT *pnt = NULL; ++ BIGNUM *d = NULL; ++ zval *bn; ++ zval *x; ++ zval *y; ++ ++ if ((bn = zend_hash_str_find(Z_ARRVAL_P(data), "curve_name", sizeof("curve_name") - 1)) != NULL && ++ Z_TYPE_P(bn) == IS_STRING) { ++ int nid = OBJ_sn2nid(Z_STRVAL_P(bn)); ++ if (nid != NID_undef) { ++ group = EC_GROUP_new_by_curve_name(nid); ++ if (!group) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); ++ EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); ++ if (!EC_KEY_set_group(eckey, group)) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ } ++ } ++ ++ if (group == NULL) { ++ php_error_docref(NULL, E_WARNING, "Unknown curve name"); ++ goto clean_exit; ++ } ++ ++ // The public key 'pnt' can be calculated from 'd' or is defined by 'x' and 'y' ++ *is_private = 0; ++ if ((bn = zend_hash_str_find(Z_ARRVAL_P(data), "d", sizeof("d") - 1)) != NULL && ++ Z_TYPE_P(bn) == IS_STRING) { ++ *is_private = 1; ++ d = BN_bin2bn((unsigned char*) Z_STRVAL_P(bn), Z_STRLEN_P(bn), NULL); ++ if (!EC_KEY_set_private_key(eckey, d)) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ // Calculate the public key by multiplying the Point Q with the public key ++ // P = d * Q ++ pnt = EC_POINT_new(group); ++ if (!pnt || !EC_POINT_mul(group, pnt, d, NULL, NULL, NULL)) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ ++ BN_free(d); ++ } else if ((x = zend_hash_str_find(Z_ARRVAL_P(data), "x", sizeof("x") - 1)) != NULL && ++ Z_TYPE_P(x) == IS_STRING && ++ (y = zend_hash_str_find(Z_ARRVAL_P(data), "y", sizeof("y") - 1)) != NULL && ++ Z_TYPE_P(y) == IS_STRING) { ++ pnt = EC_POINT_new(group); ++ if (pnt == NULL) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ if (!EC_POINT_set_affine_coordinates_GFp( ++ group, pnt, BN_bin2bn((unsigned char*) Z_STRVAL_P(x), Z_STRLEN_P(x), NULL), ++ BN_bin2bn((unsigned char*) Z_STRVAL_P(y), Z_STRLEN_P(y), NULL), NULL)) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ } ++ ++ if (pnt != NULL) { ++ if (!EC_KEY_set_public_key(eckey, pnt)) { ++ php_openssl_store_errors(); ++ goto clean_exit; ++ } ++ EC_POINT_free(pnt); ++ pnt = NULL; ++ } ++ ++ if (!EC_KEY_check_key(eckey)) { ++ *is_private = 1; ++ PHP_OPENSSL_RAND_ADD_TIME(); ++ EC_KEY_generate_key(eckey); ++ php_openssl_store_errors(); ++ } ++ if (EC_KEY_check_key(eckey)) { ++ return 1; ++ } else { ++ php_openssl_store_errors(); ++ } ++ ++clean_exit: ++ BN_free(d); ++ EC_POINT_free(pnt); ++ EC_GROUP_free(group); ++ return 0; ++} ++#endif ++ ++static EVP_PKEY *php_openssl_pkey_init_ec(zval *data, int *is_private) { ++#if PHP_OPENSSL_API_VERSION >= 0x30000 ++ BIGNUM *d = NULL, *x = NULL, *y = NULL; ++ EC_GROUP *group = NULL; ++ EC_POINT *pnt = NULL; ++ unsigned char *pnt_oct = NULL; ++ EVP_PKEY *param_key = NULL, *pkey = NULL; ++ EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL); ++ OSSL_PARAM *params = NULL; ++ OSSL_PARAM_BLD *bld = OSSL_PARAM_BLD_new(); ++ zval *curve_name_zv = zend_hash_str_find(Z_ARRVAL_P(data), "curve_name", sizeof("curve_name") - 1); ++ ++ OPENSSL_PKEY_SET_BN(data, d); ++ OPENSSL_PKEY_SET_BN(data, x); ++ OPENSSL_PKEY_SET_BN(data, y); ++ ++ if (!ctx || !bld || !curve_name_zv || Z_TYPE_P(curve_name_zv) != IS_STRING) { ++ goto cleanup; ++ } ++ ++ int nid = OBJ_sn2nid(Z_STRVAL_P(curve_name_zv)); ++ group = EC_GROUP_new_by_curve_name(nid); ++ if (!group) { ++ php_error_docref(NULL, E_WARNING, "Unknown curve name"); ++ goto cleanup; ++ } ++ ++ OSSL_PARAM_BLD_push_utf8_string( ++ bld, OSSL_PKEY_PARAM_GROUP_NAME, Z_STRVAL_P(curve_name_zv), Z_STRLEN_P(curve_name_zv)); ++ ++ if (d) { ++ OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, d); ++ ++ pnt = EC_POINT_new(group); ++ if (!pnt || !EC_POINT_mul(group, pnt, d, NULL, NULL, NULL)) { ++ goto cleanup; ++ } ++ } else if (x && y) { ++ /* OpenSSL does not allow setting EC_PUB_X/EC_PUB_Y, so convert to encoded format. */ ++ pnt = EC_POINT_new(group); ++ if (!pnt || !EC_POINT_set_affine_coordinates(group, pnt, x, y, NULL)) { ++ goto cleanup; ++ } ++ } ++ ++ if (pnt) { ++ size_t pnt_oct_len = ++ EC_POINT_point2buf(group, pnt, POINT_CONVERSION_COMPRESSED, &pnt_oct, NULL); ++ if (!pnt_oct_len) { ++ goto cleanup; ++ } ++ ++ OSSL_PARAM_BLD_push_octet_string(bld, OSSL_PKEY_PARAM_PUB_KEY, pnt_oct, pnt_oct_len); ++ } ++ ++ params = OSSL_PARAM_BLD_to_param(bld); ++ if (!params) { ++ goto cleanup; ++ } ++ ++ if (EVP_PKEY_fromdata_init(ctx) <= 0 || ++ EVP_PKEY_fromdata(ctx, ¶m_key, EVP_PKEY_KEYPAIR, params) <= 0) { ++ goto cleanup; ++ } ++ ++ EVP_PKEY_CTX_free(ctx); ++ ctx = EVP_PKEY_CTX_new(param_key, NULL); ++ if (EVP_PKEY_check(ctx)) { ++ *is_private = d != NULL; ++ EVP_PKEY_up_ref(param_key); ++ pkey = param_key; ++ } else { ++ *is_private = 1; ++ PHP_OPENSSL_RAND_ADD_TIME(); ++ if (EVP_PKEY_keygen_init(ctx) <= 0 || EVP_PKEY_keygen(ctx, &pkey) <= 0) { ++ goto cleanup; ++ } ++ } ++ ++cleanup: ++ php_openssl_store_errors(); ++ EVP_PKEY_free(param_key); ++ EVP_PKEY_CTX_free(ctx); ++ OSSL_PARAM_free(params); ++ OSSL_PARAM_BLD_free(bld); ++ EC_POINT_free(pnt); ++ EC_GROUP_free(group); ++ OPENSSL_free(pnt_oct); ++ BN_free(d); ++ BN_free(x); ++ BN_free(y); ++ return pkey; ++#else ++ EVP_PKEY *pkey = EVP_PKEY_new(); ++ if (!pkey) { ++ php_openssl_store_errors(); ++ return NULL; ++ } ++ ++ EC_KEY *ec = EC_KEY_new(); ++ if (!ec) { ++ EVP_PKEY_free(pkey); ++ return NULL; ++ } ++ ++ if (!php_openssl_pkey_init_legacy_ec(ec, data, is_private) ++ || !EVP_PKEY_assign_EC_KEY(pkey, ec)) { ++ php_openssl_store_errors(); ++ EVP_PKEY_free(pkey); ++ EC_KEY_free(ec); ++ return NULL; ++ } ++ ++ return pkey; ++#endif ++} ++#endif ++ + PHP_FUNCTION(openssl_pkey_new) + { + struct php_x509_request req; +@@ -4454,119 +4669,12 @@ + #ifdef HAVE_EVP_PKEY_EC + } else if ((data = zend_hash_str_find(Z_ARRVAL_P(args), "ec", sizeof("ec") - 1)) != NULL && + Z_TYPE_P(data) == IS_ARRAY) { +- EC_KEY *eckey = NULL; +- EC_GROUP *group = NULL; +- EC_POINT *pnt = NULL; +- BIGNUM *d = NULL; +- pkey = EVP_PKEY_new(); +- if (pkey) { +- eckey = EC_KEY_new(); +- if (eckey) { +- EC_GROUP *group = NULL; +- zval *bn; +- zval *x; +- zval *y; +- +- if ((bn = zend_hash_str_find(Z_ARRVAL_P(data), "curve_name", sizeof("curve_name") - 1)) != NULL && +- Z_TYPE_P(bn) == IS_STRING) { +- int nid = OBJ_sn2nid(Z_STRVAL_P(bn)); +- if (nid != NID_undef) { +- group = EC_GROUP_new_by_curve_name(nid); +- if (!group) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); +- EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); +- if (!EC_KEY_set_group(eckey, group)) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- } +- } +- +- if (group == NULL) { +- php_error_docref(NULL, E_WARNING, "Unknown curve_name"); +- goto clean_exit; +- } +- +- // The public key 'pnt' can be calculated from 'd' or is defined by 'x' and 'y' +- if ((bn = zend_hash_str_find(Z_ARRVAL_P(data), "d", sizeof("d") - 1)) != NULL && +- Z_TYPE_P(bn) == IS_STRING) { +- d = BN_bin2bn((unsigned char*) Z_STRVAL_P(bn), Z_STRLEN_P(bn), NULL); +- if (!EC_KEY_set_private_key(eckey, d)) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- // Calculate the public key by multiplying the Point Q with the public key +- // P = d * Q +- pnt = EC_POINT_new(group); +- if (!pnt || !EC_POINT_mul(group, pnt, d, NULL, NULL, NULL)) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- +- BN_free(d); +- } else if ((x = zend_hash_str_find(Z_ARRVAL_P(data), "x", sizeof("x") - 1)) != NULL && +- Z_TYPE_P(x) == IS_STRING && +- (y = zend_hash_str_find(Z_ARRVAL_P(data), "y", sizeof("y") - 1)) != NULL && +- Z_TYPE_P(y) == IS_STRING) { +- pnt = EC_POINT_new(group); +- if (pnt == NULL) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- if (!EC_POINT_set_affine_coordinates_GFp( +- group, pnt, BN_bin2bn((unsigned char*) Z_STRVAL_P(x), Z_STRLEN_P(x), NULL), +- BN_bin2bn((unsigned char*) Z_STRVAL_P(y), Z_STRLEN_P(y), NULL), NULL)) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- } +- +- if (pnt != NULL) { +- if (!EC_KEY_set_public_key(eckey, pnt)) { +- php_openssl_store_errors(); +- goto clean_exit; +- } +- EC_POINT_free(pnt); +- pnt = NULL; +- } +- +- if (!EC_KEY_check_key(eckey)) { +- PHP_OPENSSL_RAND_ADD_TIME(); +- EC_KEY_generate_key(eckey); +- php_openssl_store_errors(); +- } +- if (EC_KEY_check_key(eckey) && EVP_PKEY_assign_EC_KEY(pkey, eckey)) { +- EC_GROUP_free(group); +- RETURN_RES(zend_register_resource(pkey, le_key)); +- } else { +- php_openssl_store_errors(); +- } +- } else { +- php_openssl_store_errors(); +- } +- } else { +- php_openssl_store_errors(); +- } +-clean_exit: +- if (d != NULL) { +- BN_free(d); +- } +- if (pnt != NULL) { +- EC_POINT_free(pnt); +- } +- if (group != NULL) { +- EC_GROUP_free(group); +- } +- if (eckey != NULL) { +- EC_KEY_free(eckey); +- } +- if (pkey != NULL) { +- EVP_PKEY_free(pkey); ++ int is_private; ++ pkey = php_openssl_pkey_init_ec(data, &is_private); ++ if (!pkey) { ++ RETURN_FALSE; + } +- RETURN_FALSE; ++ RETURN_RES(zend_register_resource(pkey, le_key)); + #endif + } + } +@@ -4637,21 +4745,9 @@ + cipher = NULL; + } + +- switch (EVP_PKEY_base_id(key)) { +-#ifdef HAVE_EVP_PKEY_EC +- case EVP_PKEY_EC: +- pem_write = PEM_write_bio_ECPrivateKey( +- bio_out, EVP_PKEY_get0_EC_KEY(key), cipher, +- (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); +- break; +-#endif +- default: +- pem_write = PEM_write_bio_PrivateKey( +- bio_out, key, cipher, +- (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); +- break; +- } +- ++ pem_write = PEM_write_bio_PrivateKey( ++ bio_out, key, cipher, ++ (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); + if (pem_write) { + /* Success! + * If returning the output as a string, do so now */ +@@ -4714,21 +4810,9 @@ + cipher = NULL; + } + +- switch (EVP_PKEY_base_id(key)) { +-#ifdef HAVE_EVP_PKEY_EC +- case EVP_PKEY_EC: +- pem_write = PEM_write_bio_ECPrivateKey( +- bio_out, EVP_PKEY_get0_EC_KEY(key), cipher, +- (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); +- break; +-#endif +- default: +- pem_write = PEM_write_bio_PrivateKey( +- bio_out, key, cipher, +- (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); +- break; +- } +- ++ pem_write = PEM_write_bio_PrivateKey( ++ bio_out, key, cipher, ++ (unsigned char *)passphrase, (int)passphrase_len, NULL, NULL); + if (pem_write) { + /* Success! + * If returning the output as a string, do so now */ +@@ -6389,6 +6473,31 @@ + } + /* }}} */ + ++#if PHP_OPENSSL_API_VERSION >= 0x30000 ++static void php_openssl_add_cipher_name(const char *name, void *arg) ++{ ++ size_t len = strlen(name); ++ zend_string *str = zend_string_alloc(len, 0); ++ zend_str_tolower_copy(ZSTR_VAL(str), name, len); ++ add_next_index_str((zval*)arg, str); ++} ++ ++static void php_openssl_add_cipher_or_alias(EVP_CIPHER *cipher, void *arg) ++{ ++ EVP_CIPHER_names_do_all(cipher, php_openssl_add_cipher_name, arg); ++} ++ ++static void php_openssl_add_cipher(EVP_CIPHER *cipher, void *arg) ++{ ++ php_openssl_add_cipher_name(EVP_CIPHER_get0_name(cipher), arg); ++} ++ ++static int php_openssl_compare_func(const void *a, const void *b) ++{ ++ return string_compare_function(&((Bucket *)a)->val, &((Bucket *)b)->val); ++} ++#endif ++ + /* {{{ proto array openssl_get_cipher_methods([bool aliases = false]) + Return array of available cipher methods */ + PHP_FUNCTION(openssl_get_cipher_methods) +@@ -6399,9 +6508,16 @@ + return; + } + array_init(return_value); ++#if PHP_OPENSSL_API_VERSION >= 0x30000 ++ EVP_CIPHER_do_all_provided(NULL, ++ aliases ? php_openssl_add_cipher_or_alias : php_openssl_add_cipher, ++ return_value); ++ zend_hash_sort(Z_ARRVAL_P(return_value), php_openssl_compare_func, 1); ++#else + OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, +- aliases ? php_openssl_add_method_or_alias: php_openssl_add_method, ++ aliases ? php_openssl_add_method_or_alias : php_openssl_add_method, + return_value); ++#endif + } + /* }}} */ + +diff -ruN a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h +--- a/ext/openssl/php_openssl.h 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/php_openssl.h 2024-08-09 13:20:33.120890846 +0900 +@@ -41,8 +41,10 @@ + #define PHP_OPENSSL_API_VERSION 0x10001 + #elif OPENSSL_VERSION_NUMBER < 0x10100000L + #define PHP_OPENSSL_API_VERSION 0x10002 +-#else ++#elif OPENSSL_VERSION_NUMBER < 0x30000000L + #define PHP_OPENSSL_API_VERSION 0x10100 ++#else ++#define PHP_OPENSSL_API_VERSION 0x30000 + #endif + #endif + +diff -ruN a/ext/openssl/tests/bug28382.phpt b/ext/openssl/tests/bug28382.phpt +--- a/ext/openssl/tests/bug28382.phpt 2024-08-09 13:19:44.273565657 +0900 ++++ b/ext/openssl/tests/bug28382.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -9,11 +9,10 @@ + $cert = file_get_contents(__DIR__ . "/bug28382cert.txt"); + $ext = openssl_x509_parse($cert); + var_dump($ext['extensions']); +-/* openssl 1.0 prepends the string "Full Name:" to the crlDistributionPoints array key. +- For now, as this is the one difference only between 0.9.x and 1.x, it's handled with +- placeholders to not to duplicate the test. When more diffs come, a duplication would +- be probably a better solution. +-*/ ++/* ++ * The reason for %A at the end of crlDistributionPoints and authorityKeyIdentifier is that ++ * OpenSSL 3.0 removes new lines which were present in previous versions. ++ */ + ?> + --EXPECTF-- + array(11) { +@@ -24,8 +23,7 @@ + ["nsCertType"]=> + string(30) "SSL Client, SSL Server, S/MIME" + ["crlDistributionPoints"]=> +- string(%d) "%AURI:http://mobile.blue-software.ro:90/ca/crl.shtml +-" ++ string(%d) "%AURI:http://mobile.blue-software.ro:90/ca/crl.shtml%A" + ["nsCaPolicyUrl"]=> + string(38) "http://mobile.blue-software.ro:90/pub/" + ["subjectAltName"]=> +@@ -33,9 +31,8 @@ + ["subjectKeyIdentifier"]=> + string(59) "B0:A7:FF:F9:41:15:DE:23:39:BD:DD:31:0F:97:A0:B2:A2:74:E0:FC" + ["authorityKeyIdentifier"]=> +- string(115) "DirName:/C=RO/ST=Romania/L=Craiova/O=Sergiu/OU=Sergiu SRL/CN=Sergiu CA/emailAddress=n_sergiu@hotmail.com +-serial:00 +-" ++ string(%d) "DirName:/C=RO/ST=Romania/L=Craiova/O=Sergiu/OU=Sergiu SRL/CN=Sergiu CA/emailAddress=n_sergiu@hotmail.com ++serial:00%A" + ["keyUsage"]=> + string(71) "Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment" + ["nsBaseUrl"]=> +diff -ruN a/ext/openssl/tests/bug52093.phpt b/ext/openssl/tests/bug52093.phpt +--- a/ext/openssl/tests/bug52093.phpt 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/tests/bug52093.phpt 2024-08-09 13:20:33.123890989 +0900 +@@ -14,10 +14,10 @@ + "commonName" => "Henrique do N. Angelo", + "emailAddress" => "hnangelo@php.net" + ); +- ++$options = ['config' => __DIR__ . DIRECTORY_SEPARATOR . 'openssl.cnf']; + $privkey = openssl_pkey_new(); +-$csr = openssl_csr_new($dn, $privkey); +-$cert = openssl_csr_sign($csr, null, $privkey, 365, [], PHP_INT_MAX); ++$csr = openssl_csr_new($dn, $privkey, $options); ++$cert = openssl_csr_sign($csr, null, $privkey, 365, $options, PHP_INT_MAX); + var_dump(openssl_x509_parse($cert)['serialNumber']); + ?> + --EXPECT-- +diff -ruN a/ext/openssl/tests/bug71917.phpt b/ext/openssl/tests/bug71917.phpt +--- a/ext/openssl/tests/bug71917.phpt 2024-08-09 13:19:44.275565752 +0900 ++++ b/ext/openssl/tests/bug71917.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -3,6 +3,7 @@ + --SKIPIF-- + + --FILE-- + + --FILE-- + "hello", 1 => "world"); +-$var2 = openssl_csr_new(array(0),$var0,null,array(0)); ++$var0 = [0 => "hello", 1 => "world"]; ++$options = ['config' => __DIR__ . DIRECTORY_SEPARATOR . 'openssl.cnf']; ++$var2 = openssl_csr_new([0], $var0, $options, [0]); + ?> + ==DONE== + --EXPECTF-- +diff -ruN a/ext/openssl/tests/bug72362.phpt b/ext/openssl/tests/bug72362.phpt +--- a/ext/openssl/tests/bug72362.phpt 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/tests/bug72362.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -3,6 +3,7 @@ + --SKIPIF-- + + --FILE-- + + --FILE-- + OPENSSL_KEYTYPE_DSA, 'config' => $cnf])); +-var_dump(openssl_pkey_new(["private_key_type" => OPENSSL_KEYTYPE_DH, 'config' => $cnf])); ++$config = __DIR__ . DIRECTORY_SEPARATOR . 'openssl.cnf'; ++var_dump(openssl_pkey_new([ ++ "private_key_type" => OPENSSL_KEYTYPE_DSA, ++ "private_key_bits" => 1024, ++ 'config' => $config, ++])); ++var_dump(openssl_pkey_new([ ++ "private_key_type" => OPENSSL_KEYTYPE_DH, ++ "private_key_bits" => 512, ++ 'config' => $config, ++])); + echo "DONE"; + ?> + --EXPECTF-- +diff -ruN a/ext/openssl/tests/bug74022_2.phpt b/ext/openssl/tests/bug74022_2.phpt +--- a/ext/openssl/tests/bug74022_2.phpt 2024-08-09 13:19:44.272565609 +0900 ++++ b/ext/openssl/tests/bug74022_2.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -12,11 +12,13 @@ + var_dump(count($cert_data['extracerts'])); + } + +-$p12_base64 = 'MIIW+QIBAzCCFr8GCSqGSIb3DQEHAaCCFrAEghasMIIWqDCCEV8GCSqGSIb3DQEHBqCCEVAwghFMAgEAMIIRRQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIQOfCxIAgGIICAggAgIIRGFTkvHpJjCtFjukXYVlhyOIqKiS8Zvg84dX244hhI0S51Uyn/tlXM2GD/3hDNVxcVKwP/fKN21lEkoXoK4h2/5BY3qCdZa3Ef3vk44b/+FGCUAqvsOo1ZjD2P/sBGhLu3aFnQ6ktUXlKV4cnqhlF62AqY4e5efQzmJXn+gI8cSNI5c+qQ0RQgGoRY4nJfvMSZG0/DAkirjGikU/2TZd8LwLkxVUBYbF5/T0fNtA3o99+4tF+8ZRv6ArYjplRdwcBbMbzGhn3ytCq6cmVid9iLjwHJFmvAPXKbmu0Lh5eRRznX9gBWlzGd08Q/ch0MW2ehZTu1A2VrNWl+FKWSk8l0MlSoTPJFutFiejRvMr6VzbQItyJ/mtrNa9b1Hicgoj9HaBB6arx4wKORlbSOxFNOWdTCUhFdqthK5o7b9i/owyVgyY0s7BFEZChc0zGpRq7BLrynY79b+pHKzpil9isuisp1++piHZx9Y/bpC7OP5FlYF9+3TJL0EpEFQD8FqEoqcMFRxIDWGpCQiLGcmL14OH1JKSgOJEAgogsIF/KQhvWeKcUSJlai+0sskl8mOrCt2EJwuRvzmemuzebYN3JMOiBXKONYR0yU8AeAyNTgSBimWhACtikUyfpgZXlIeXyFMvj9fmd0I/zqjaW4upqrCudCOj/CWx7+e+8udfJxI7agWwrZMf1BEkOhRFOHOIuV+IEbaoMP6vVrGlhK71oN+gnoes5ivohpFDJWSZ3+1fMh56vfNynuM2wLJO7FTROPla+4ug33V/2ubGpoIyXn2lTSbuXaYDfsXMa1inakOMW9Q+PHGdIjZrwQU/u9Q2H0IlwFd4uQojZo15SRf4xh5FOuUrrfGRAnp1mWHALTBqd2VnkgqtBl8rXZXqA+CiEhEDhTAQmvf+wCKd3FklrhV+p65YcfRK9OJv5aFQM1/+WbJozF4/Wi5j4rtIDPrgMMEflOyoZIxGxDOaklyAvaasRU2TT8E2LIEvGKOzlrhIZqWyRESjgXdh6l0UBMaVAidIZ0JLf+8fqSZ0Zia5iAaJpm82MQr/PVXC4lqqxDlHhefwM3OKfZVkfAw0a2eePM5YkIxAgMpAstBt32UIixlj/5l4MwqzP8Reb4MsV6Fph2e14vsV1diLBaJI3hrU5UBVEDWV0GSbwdhZLtdubSaBHcv5v9aZ1cdFKL6d2rHksW9ooNnh/ljPxmVlfHbb8sPYDXmLmBNJdNV1gQouhKKrt0ov1J9+sqE53D9+9dfRwf/myYlnyNgqU4vNMrZI2flyugkYoUxIC8stVF46zfL5QkSg3GqdLQC4gpeJ0WdTSyOBaOgUvqGdSARb5bXm1VXF5IxVg1B4v+puNIHS9yuphXUJvw6xWWPjbQAllDrPjMqAbxmF465vFyQP0qEvMjRD+SaFIgW4KjMqfteKo4MgqKTRF4UP9r0HkwRErOznxWDfSxzXYztY6U72NdifN9IIFiBikKQqZvfvaN+1jukehSRpGQHQB5OxeeKThJZJGiUC5Fgvl7lPb6Djx8Rfba/FJvVsR2KFS64sArtUKmC6LcJxEY9WcsiJTHek817zvYej7FD1NxuttNp+ue9ArOoIhOEf08HIOu3d2yjeRlN5CJ/jIdKYlZW6m6Ap1M+OUHhJTF73K6lKKD9Diwa3s6FoqOwtZF4uYwHnCG218BMY8GgEVD73x5KjDOP02Y6EakZNp/9QIqQT4WkMWXMaqAPADtoh8X1FJLlnvs2Ko+hLlPxuPaIA4KvSuuocnWx/6HJbdqHUS/Se+JJo0Igt4Svax1R2kvoIPuQmPmHJ6l7CeZZiNbe+baFSx+V6g/6AgHUsUOSqGvUIEns1uIE9CQ8w0G3yLVonjERJLrdj+em3Pt7fxrxoOI4nwjplX0wJk0rkQREiS8ULQDHueptUcxJxMKpugAc4CL+BsHohkhm4kpOEmviKDwzxytQhDp2Fj2PRO9kqyNrNfzNGCN5709blEIVYTtonELI2vR5Ap+O2pH+AlqrnHWgeOYAKAyWT13xCNRsGNdv2sCDDiHqxq01IBzYhPvoWzECOmGbJRRSGOVzYCJJpVjl0NNKv9ucmftSQRjm6xgLIqv1xrehDYuJ/IMsYQ5QwXBGxy7nkeRg+onWzA0ZnEWgzLs3T/Pj7z/TPQWiN03MH24RvQXTWBqp9iBwXpsCZVgUIM/VLCQJn0/V5gfRy9Ne0rk2/tHMnzGHvll5Spoy6WkxSfQ8c8CjTilaoPWV6fOcNB2Z6ZuTqX0fbnxcEAu2fOK7e6ryGipEgaxrdiopDTlgPEFMdGUETbUh0ACrv/gNsS+m5MtNisWnhxFEiXrsWoWIgW/6TgRJGo+l52bh/xxC0bwHbYuHK62sxDVeXpBOnA4VE+WckWsC0CKYJvv4vfTbLI46fyd3lnlcSuHYM4SdbND7THNeK+KB5GyuUFLgAhhtZv8ceEo63IOlBUUy1NlWnr0cbidxvVnOugFLExCV5QGr+xbrssIibQxs8AfOBK8Cxh83IlzJVe7dX1mZVG1c6AM6SKSC6F0LBOeNEvcLlz4PBMIciubCE6ecdXCzJYFbj9ERDlnrZMKrnATRMsgCPaWdyYgQwkDuCj5uqf4aiKLzA61918hLY3MB7mSyJcCkXDYKr11Br0YSAdu8uG6IjpiUQS2PFz8E8XHBmO/uobhEuCPR2LnUv+xFN8zoPQlA5ueRz1yBF8L+CsvDGp/N3KF26ETWlvmnEdt7foE+o/J7aG6xO/CNB+/+yGbVPZRVAntZec9nbqlQ55qECnWtQNnShW7+3RSGamWeTtE2DyRSfd/62JkPNEY25jbBUIkMNtKolA5dbYa+u50S3lvakMmvQvzcSC3PONajKHgk4mBn3qf9X2uM5RDL83M7489r6JPcxTnNK27rQoxplkxLiN8HuB+AB5hp82WoyvLydR4hoBnJPIYKMcmEfIR+SgLoCyNIQLjzk5Iyk1ZwdwsjyNPXi1/HHZq8+NhoTCupjGfWgXghoz89MTYAjpMvOlES2rgFuCdphSc8Nd1uQtZx4CLMOU0gut0PI81ePBBI0iG74PWMEcp5HlHHY/hPTaRkBFLYkq9CWmJc1PfjiCWf3pwRmT7dUnmcptynexIMOZt2Nd76jc+g7k5MmEK+Qdz7/c1un4sVLquxdY6nUY/znLz+2zC/OTSsF39+rak3p8TXR0kBNsHl8UTioi4CGhCMsWsQy9me25TDHzbtIvBPVp9xXufsOe2wqPLjq3iNEGXTsagx3sLvl7BJ6WW/YMC7sUpjx1Ai3zkqViW0jQB+BzMZjfYM/8Yj31EEE+WssxY+NfitBgZzeMGGjNOAKp7XN0glwhuo1G2/APyU/Zopx3gMYj5OExgkZ7kvK++7+NlPmE+8AEuZ/uf30TtKwvRXOSvAMqqm26kb/WQPCj1xFQ0AEDl0Sbyfgk1E51Cd/ujL0t32FNkSoE8pe3IaTnwAnW7NHTZ/RByh2nsr0ThfFg4pFFuSD4dzU8r2J/4YJG3B06eyyTRLoyLBQwzwIgzGBAU8USdD8CXlA8SkfBbF39500ZRNcMIt6wdQa1CHAUHDLPw9JF9Q0FwCspgkjc9+lTRZMtumN5ChgypSkUB1dzLV2hqeQzDngVjcco/CoxM0Svm8gGrM9qobCTGzGF8/wZljv1yRiqu6HGFYWDAQ/p+wWx6ScstxEAB+5R5GrOedgd4zPXi2NMvyeN+ACFRBSPkhXIXpLZADvBi/WQMYbHia1wL8WUrSGQuB4P46cWGyseaxl//6GQ9IoGbK3XuLIPeE+BpPLB0H9LSLY+5f3qOEkKzCCW0z+68ZMlanlsThLKhqk8yrmJhV4788Tr7BC3eGbAie1urrrfUR613Jsp5peLSJuWQHdWCE/fdKgoSsRJ+DYkPoyS1YNz4BF4yz1Oem9Mti7gvgTQNX6g6PCu0rN8B6HIgY9TvWy5OCoZjJKasb+OgTMld7TJDnyK5/JcvDKHNVwcpK74lxcVX7IRorP/eh4IQ1+P/Gh06A62RHp2dEh/fNuKeCiRM2vGH0gdIN/Ca6MX8MqazgJq2EONyWiqRoGPqqZpAVTa8l5kgGvxQE/CQ4x0uAxwresRRTUZ+fJEanAhTWYgI5mRoEkG88UZjyCWmCnpNMQRYHoq7iY0So5qUdkHvpUA48cNMyztPEEHsUyWC36ZCyNsQN26FoJrG9TqXedBrhcki0sPOWugvKtGsdTT354wJTDe5OCo0AH3eFo/auuuAk/DF7yu614UCmKtXHYJ61GpIkjBu9WrPAIJhndMqfGMD/yU4UMEPHyojqHvU0BSgv1k76vI3K2lqERkaNYFfzRNj+e7k+NNos8w7XCzilWBL2ePB3pG5xfivcH4tYFm0FbnIkSz52VIy+PTiK7QQuBPDRTcn1k41+9vxQxRWpsqM/NP+4gqGozNyANXLQ64Y+QXSnWrD+xMjL/kVFwUBJ2HaAIJHjZ7ZqLRzXVOUbQ9pivJiBkXvLptSo72Iw4zsbRd1x8WNEaihx1MBAj+s+4MNdC5MBkQMlSB0PTJzs9xlz0gN+Oz0lohH6JO7ngPJUYbo2AIWEYZN+9kn/RyHblQTElrJeLf1jGNi4anBfzbsIXQuVm/nsrE5MH23X66+rJzUk8Fc5JAIDGBslkDPg3UNnElcE3cYbcB/ZzjFtgz8ducWKQmI+Yqv4p7BVXji/rHPim8vL6P5xZc95tbIonp5bQH+PPSmcfDk3rrf5mS58dJvWh/UpwcfdVvUAsWLJEV1lUBg1qecVbCsa6Oy7tJ2ZK7e3KdtZrmXiYpSAnSzRNJotr4g4H99brG6IwUx3qk5BE4x3C8MpSb+1NcKnM9nhqwAGRb9sfVXG38eNltm7hDnsolQcFQmHkDSM4arUVRqmsG8O16bThtlFWbYYN355aGQxrO2pICnt0ZOAI5CA3Rl8FprhFZgVy4pcpMVwy2zCNaYGJoGYsxDm/lEWJbTGcVm6YkyaZvdkXM1uAVegLZOCKnlW9H7b1uU3NvUw4Qx3DhI5xMD9jZhlXIsYfa9s5NQjTeIX8fFbx1fdENpHjVRxs82DO26uLEaJpoL/Ywn1xfs1uV0VQb2NGPvUJKysjMRoX0Zfa0hsSBhw/ZSlyX1xfQY8ShusVswf3zEnwI1LTgtr0CvBNwnuaSDv/IoypEfCOuMrJEGJuTPDbGGyS4VeRf0He5Dk9RskehgrJcwhlw+hXajR6SluODcsEGfL+eOUjAOO9agWaqM2CfV52/vJNhA5KMEJwHuQAU1SHr4+xaW4EKWPlxB6Sjjz/IuL+toLBetBA3ZhEfokac6rQplUIiOICd3Ghwi1rpUZPL5YuP0murhpBGTdzMzGSMhSZ74LeAcoRKEG4rKKIS3fRS65QMlaLC6uOT8givHdXsk+4zLBF0BnYAe4bq8RDcpt9TJRczL6+NaxYxa36R+DRin4U1SwaUdIvEKaEDBdVLnzKkpAim5cww1MYkGZmFcVg8u8fSnoz5TeorZy00dQCMCC+SyMb58TTA08UrCOSq07+ILregexlx+Cxpbgpabo858lkJLDpPJmq8YQmog2gaMstJbpyV3M4wf1GL4ylPurPWUuyX58H8oRyX/FH79cpsbyeNoghwfvRVw8/tOUyF1DbA8Lw0HauIHTQwMTOvREPCPmlMvldIUJxHqIpqcsXESIWT/+YaHBiKGueGqPOdkFPtXSyf4t1Ka56M/9ftvdR/oFtr/iApE0Hyosz84INF/Rq9HYd8jrVb3IcQw637U2s4sE+I95+c+VaYxcDq29Jd2jD3uZfn6vbxb7Zz//Z8G4PGBNDns+D/jDoAMIIFQQYJKoZIhvcNAQcBoIIFMgSCBS4wggUqMIIFJgYLKoZIhvcNAQwKAQKgggTuMIIE6jAcBgoqhkiG9w0BDAEDMA4ECDpR8wgSXD4AAgIIAASCBMijRdwb0L38qXtBGebx6l35L3eR8/NPfJTyDKqYQOiIhNfYp/f+Ml9g3NlCB+ba03BZBCFSo1a9csjMZ1fDgS5AoNE683hbPdNj6D5JYQtvOpX/D5rawmI0iuDTIc6GOpN5PS0ds9OLnlS6pagq3U7QycuiPR0jVq72qzQUDxnqXU0XO+IwQXFP5UhKrPJe/cbUotznQPGH5g88ydM9YelIvIVImXLlXeVLY8CtzRQPSduX1zckVUMktrpSvqJUhVuN4ikhh+4ga1LvtaziOibk6HNekSlN13sqSQ7GeWGToB1AOmN8i1LZmWRnrPG61dT3uPg0R/5rPq6hrNQvAnx7Mpq7Uz1OuzDzGoaBtX+/CVIpeYLAYm7hdKouT84hk7qsT9ls1Dwb5P1C8HjBWas0KufoyxoHL61A+xGIcHkbOeVNy20AFUf7Xhb+kPlSdOhP3Ik1F2iUXa0pFxqTNcsmTDRzAReciYxVJ0lOTbqX7O6/a+U/sT109GqVGZJcpyk1FCUSk3HWbjSKOhxjpvxqfSKexr9ZOTmih7rBNYSY6sRUYgtpQyWNo8iWilwSP3FCBCbRIJrzJ5O6wn0JDTHONqxS9zENz/MvX8oHEZk+mkpxZA4YCodP10zQjzKHsXI1lRWrUARzpDfqGck1BBXXLrLNDL3w+00ipkTdEgtdhNFtHZ7A0Fda62ys5JTKt/oWSi0FPhjXdGnxf+8rBkB/jlKx99Ue6R4S+ve7Eqyl98TelFvX5C6wa63+/kw4/8L5aSlhrAUyYrykmnZ9nb61YY4HTmwpSJP0tHmr3LHxPVx15vp3KIyrYQVvbap+FvfcLjMoU6ckLQDZpQSJdFo86MdNedrKbwmVN7pV/M2b3DjPp5ixLCSXJgK3RaATIxQL88IDv4+ySL0Z2t6jUopZ40liyDnHGDl9zajeQ1WaW4yHS65aVlzYHSFvCGr8F/4Lydk5ax5HHqna6LbFeuQ4kUcUaGfiIagtFW+ueyfOckqLnwYisjG5fQmheONPHb7jg/qHQoKasD4TvmwrvUcG20c5J57oZ80C94zySYpdHTaETXHEOwz7NBPP1hplC1IaAfbhwZ48Z0kWWqddfELUC5miapzthvzpycOzL6zWmTLjyTXPZrbkqYfVrD26bsD/YOo54BThGcBdEfu2chT2eNF0rRZwF5U9TACfzMFYxUIVRq4rWAaerppkK5JNBT/la2QxUElh9HPn+0GGL1BYYEPCihciwWy2BwJs1IgjhU4ARTlukuxK+WLPTflwvlOX5G1P5D57up8kxtDncR5IIuZJgWWSFLGOkGeHXmjynLMqS1OCzIId3dj0c3EYBnku82eItAQd5fk7/rs0Lg0S1XeVSrgPphTgviGXzTWSh28S3VZJ2G7k4dr1P/sJQounjbcDrFyYaFxYXEqyO9L6vFShO5z7/vD5h9uLPddE4vC6PKJxZoWopWncLcLljuYKG0k+y4MV9U0/cESYJWzBbcZZpULdesinhxMg1wNPu5FeeFCsZpdhN2FadIuu/Kcsk6xNeDDIwwYXb3hVY0ARRAo//LyLv3zDB0LWz1LH3qJQeZ53DbgZ4VXQ6uK0yTgSsH4Lwaj5oFBPp4NJ3hdGa7trpJbeUMIxJTAjBgkqhkiG9w0BCRUxFgQUh6FIxf4sbyJnvvC+6J1NHGaa9w0wMTAhMAkGBSsOAwIaBQAEFFkCkI701QHxh2zcZkzDy8bn7qKwBAjafnZaU5r0FgICCAA='; ++$cert = file_get_contents(__DIR__ . "/public.crt"); ++$priv = file_get_contents(__DIR__ . "/private.crt"); ++$extracert = file_get_contents(__DIR__ . "/cert.crt"); ++$pass = "qwerty"; ++openssl_pkcs12_export($cert, $p12, $priv, $pass, array('extracerts' => [$extracert, $extracert])); + +-$p12 = base64_decode($p12_base64); +- +-test($p12, 'qwerty'); ++test($p12, $pass); + ?> + ===DONE=== + --EXPECT-- +diff -ruN a/ext/openssl/tests/bug79145.phpt b/ext/openssl/tests/bug79145.phpt +--- a/ext/openssl/tests/bug79145.phpt 2024-08-09 13:19:44.281566038 +0900 ++++ b/ext/openssl/tests/bug79145.phpt 2024-08-09 13:20:33.109890323 +0900 +@@ -14,13 +14,14 @@ + C9C4JmhTOjBVAK8SewIDAQAC + -----END PUBLIC KEY-----'; + ++$a = openssl_get_publickey($b); ++@openssl_free_key($a); ++ + $start = memory_get_usage(true); +-for ($i = 0; $i < 100000; $i++) { +- $a = openssl_get_publickey($b); +- openssl_free_key($a); +-} ++$a = openssl_get_publickey($b); ++@openssl_free_key($a); + $end = memory_get_usage(true); +-var_dump($end <= 1.1 * $start); ++var_dump($end == $start); + ?> + --EXPECT-- + bool(true) +diff -ruN a/ext/openssl/tests/bug80747.phpt b/ext/openssl/tests/bug80747.phpt +--- a/ext/openssl/tests/bug80747.phpt 2024-08-09 13:19:44.273565657 +0900 ++++ b/ext/openssl/tests/bug80747.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -14,11 +14,9 @@ + 'private_key_bits' => 511, + ); + var_dump(openssl_pkey_new($conf)); +-while ($e = openssl_error_string()) { +- echo $e, "\n"; +-} ++var_dump(openssl_error_string() !== false); + + ?> +---EXPECTF-- ++--EXPECT-- + bool(false) +-error:%s:key size too small ++bool(true) +diff -ruN a/ext/openssl/tests/CertificateGenerator.inc b/ext/openssl/tests/CertificateGenerator.inc +--- a/ext/openssl/tests/CertificateGenerator.inc 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/tests/CertificateGenerator.inc 2024-08-09 13:20:33.120890846 +0900 +@@ -65,7 +65,10 @@ + ), + null, + $this->caKey, +- 2 ++ 2, ++ [ ++ 'config' => self::CONFIG, ++ ] + ); + } + +@@ -101,6 +104,7 @@ + [ req ] + distinguished_name = req_distinguished_name + default_md = sha256 ++default_bits = 1024 + + [ req_distinguished_name ] + +@@ -124,8 +128,9 @@ + ]; + + $this->lastKey = self::generateKey($keyLength); ++ $csr = openssl_csr_new($dn, $this->lastKey, $config); + $this->lastCert = openssl_csr_sign( +- openssl_csr_new($dn, $this->lastKey, $config), ++ $csr, + $this->ca, + $this->caKey, + /* days */ 2, +@@ -139,7 +144,7 @@ + openssl_x509_export($this->lastCert, $certText); + + $keyText = ''; +- openssl_pkey_export($this->lastKey, $keyText); ++ openssl_pkey_export($this->lastKey, $keyText, null, $config); + + file_put_contents($file, $certText . PHP_EOL . $keyText); + } finally { +diff -ruN a/ext/openssl/tests/cve2013_4073.phpt b/ext/openssl/tests/cve2013_4073.phpt +--- a/ext/openssl/tests/cve2013_4073.phpt 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/tests/cve2013_4073.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -9,11 +9,10 @@ + var_export($info['extensions']); + + ?> +---EXPECT-- ++--EXPECTF-- + array ( + 'basicConstraints' => 'CA:FALSE', + 'subjectKeyIdentifier' => '88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C', + 'keyUsage' => 'Digital Signature, Non Repudiation, Key Encipherment', +- 'subjectAltName' => 'DNS:altnull.python.org' . "\0" . 'example.com, email:null@python.org' . "\0" . 'user@example.org, URI:http://null.python.org' . "\0" . 'http://example.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1 +-', ++ 'subjectAltName' => 'DNS:altnull.python.org' . "\0" . 'example.com, email:null@python.org' . "\0" . 'user@example.org, URI:http://null.python.org' . "\0" . 'http://example.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1%A', + ) +diff -ruN a/ext/openssl/tests/ecc.phpt b/ext/openssl/tests/ecc.phpt +--- a/ext/openssl/tests/ecc.phpt 2024-08-09 13:19:44.277565847 +0900 ++++ b/ext/openssl/tests/ecc.phpt 2024-08-09 13:20:33.126891132 +0900 +@@ -4,9 +4,11 @@ + + --FILE-- + "secp384r1", + "private_key_type" => OPENSSL_KEYTYPE_EC, ++ "config" => $config, + ); + echo "Testing openssl_pkey_new\n"; + $key1 = openssl_pkey_new($args); +@@ -15,6 +17,7 @@ + $argsFailed = array( + "curve_name" => "invalid_cuve_name", + "private_key_type" => OPENSSL_KEYTYPE_EC, ++ "config" => $config, + ); + + $keyFailed = openssl_pkey_new($argsFailed); +@@ -33,6 +36,16 @@ + // Compare array + var_dump($d1 === $d2); + ++// Check that the public key info is computed from the private key if it is missing. ++$d1_priv = $d1; ++unset($d1_priv["ec"]["x"]); ++unset($d1_priv["ec"]["y"]); ++ ++$key3 = openssl_pkey_new($d1_priv); ++var_dump($key3); ++$d3 = openssl_pkey_get_details($key3); ++var_dump($d1 === $d3); ++ + $dn = array( + "countryName" => "BR", + "stateOrProvinceName" => "Rio Grande do Sul", +@@ -91,6 +104,8 @@ + bool(true) + resource(%d) of type (OpenSSL key) + bool(true) ++resource(%d) of type (OpenSSL key) ++bool(true) + Testing openssl_csr_new with key generation + NULL + resource(%d) of type (OpenSSL key) +diff -ruN a/ext/openssl/tests/openssl_decrypt_basic.phpt b/ext/openssl/tests/openssl_decrypt_basic.phpt +--- a/ext/openssl/tests/openssl_decrypt_basic.phpt 2024-08-09 13:19:44.281566038 +0900 ++++ b/ext/openssl/tests/openssl_decrypt_basic.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -24,10 +24,15 @@ + $encrypted = openssl_encrypt($padded_data, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); + $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); + var_dump(rtrim($output)); +-// if we want to prefer variable length cipher setting +-$encrypted = openssl_encrypt($data, "bf-ecb", $password, OPENSSL_DONT_ZERO_PAD_KEY); +-$output = openssl_decrypt($encrypted, "bf-ecb", $password, OPENSSL_DONT_ZERO_PAD_KEY); +-var_dump($output); ++ ++if (in_array("bf-ecb", openssl_get_cipher_methods())) { ++ // if we want to prefer variable length cipher setting ++ $encrypted = openssl_encrypt($data, "bf-ecb", $password, OPENSSL_DONT_ZERO_PAD_KEY); ++ $output = openssl_decrypt($encrypted, "bf-ecb", $password, OPENSSL_DONT_ZERO_PAD_KEY); ++ var_dump($output === $data); ++} else { ++ var_dump(true); ++} + + // It's okay to pass $tag for a non-authenticated cipher. + // It will be populated with null in that case. +@@ -39,5 +44,5 @@ + string(45) "openssl_encrypt() and openssl_decrypt() tests" + string(45) "openssl_encrypt() and openssl_decrypt() tests" + string(45) "openssl_encrypt() and openssl_decrypt() tests" +-string(45) "openssl_encrypt() and openssl_decrypt() tests" ++bool(true) + NULL +diff -ruN a/ext/openssl/tests/openssl_dh_compute_key.phpt b/ext/openssl/tests/openssl_dh_compute_key.phpt +--- a/ext/openssl/tests/openssl_dh_compute_key.phpt 1970-01-01 09:00:00.000000000 +0900 ++++ b/ext/openssl/tests/openssl_dh_compute_key.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -0,0 +1,29 @@ ++--TEST-- ++openssl_dh_compute_key() ++--FILE-- ++ ++--EXPECT-- ++b0049944fa5d36f364dd02e675dde50f8c2d67481c5cf0fe2f248d383eec1d38c23d5ed2644fbef2676bcd6ce148361ca82619c8f93e10506cb89d0a1bdaa0f0bc6f68cef0f7cb6d97d43e8dda3c7a5c5a98ebd2342a605ce530fd46a0602d28d4afc48e92088d0bc42194ca8682a85317f812d81b86cd284eed405df2f76aae84ccd560856e8a3d0ce4f591394bca02eb8a1984ebb41bb19714fb8b579bcafd36a9051d51d075f66229893289d8a0c918bfd222f17803cc532d2cf93bb2a567953323ca409beb3237faae9c6fdfc671594324953badd07dd4770ee09fd19f90045654c5709e92aa614b83594c2f62a8bc3c7e786e54bc1259a0a737c70dd4cc +diff -ruN a/ext/openssl/tests/openssl_error_string_basic.phpt b/ext/openssl/tests/openssl_error_string_basic.phpt +--- a/ext/openssl/tests/openssl_error_string_basic.phpt 2024-08-09 13:19:44.278565895 +0900 ++++ b/ext/openssl/tests/openssl_error_string_basic.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -1,7 +1,10 @@ + --TEST-- +-openssl_error_string() tests ++openssl_error_string() tests (OpenSSL < 3.0) + --SKIPIF-- +- ++= 0x30000000) die('skip For OpenSSL < 3.0'); ++?> + --FILE-- + + --EXPECTF-- +diff -ruN a/ext/openssl/tests/openssl_pkcs12_read_basic.phpt b/ext/openssl/tests/openssl_pkcs12_read_basic.phpt +--- a/ext/openssl/tests/openssl_pkcs12_read_basic.phpt 2024-08-09 13:19:44.277565847 +0900 ++++ b/ext/openssl/tests/openssl_pkcs12_read_basic.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -4,10 +4,12 @@ + + --FILE-- + $extracert)); + + var_dump(openssl_pkcs12_read("", $certs, "")); + var_dump(openssl_pkcs12_read($p12, $certs, "")); +@@ -73,24 +75,26 @@ + ["extracerts"]=> + array(1) { + [0]=> +- string(1111) "-----BEGIN CERTIFICATE----- +-MIIDBjCCAe4CCQDaL5/+UVeXuTANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB +-VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 +-cyBQdHkgTHRkMB4XDTE1MDYxMDEyNDAwNVoXDTE2MDYwOTEyNDAwNVowRTELMAkG +-A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 +-IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +-AL/IF7bW0vpEg5A054SDqTi5pkSeie6nyIT77qCAVI5PMlhNjxuqDIlLpCWonvKb +-LMRtp7t24BsQBRgQgps8mtfRr0gV1qq9HMfDj2bZdGcTShZN/M/BFATwxaNRTHl9 +-ey8zxGcLd4aFFBlVhXHYdBXg/PG/oxJMAFuMwa+KxSP6Mqp1FlOZtvUUieQcToMf +-Mh8Lbr4g/yHFj5lgWIJ2fmJjHJZ4wf9QBeGUrVqqxzSDEL9f0PGy+grqSHoIzLr3 +-+uhvhoI85nCyZs9+lrELuQKqbiZ8Q6Vmj6JGt3miNBFVTbBpP9GK8sVuVQwgqd8p +-C3e8hHqv7vwF+s0zjiZ+rCcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAdpTtiyDJ +-0wLB18iunXCMUJpjc/HVYEp5P9vl2E/bcZfGns/8KxNHoe9mgJycr3mwjCjMjVx2 +-L/9q/8XoT02aBncwAx4oZ2H0qfjZppaUSnSc1Uv+dsldDC2mZvJgwXN7jtQmU5P3 +-cspFHuJoYK8AqYJqlO6E4L9uRF7dLEliUnrBpF4BxziwskTquRX+zgD+fmk0L5O8 +-qqvm8btWCxfng+qD7UHFWbUQ2IegZ3VrBWJ2XsxOvokMM4HoHVb0BZgq8Dvu0XJ9 +-EriEQkcydtrRKtlcWHLKcJuNUnkw2qfj+F8mmdaZib8Apa1UCkt0ZlpyYO3V2ejY +-WIjafwJYrv6f5g== ++ string(1249) "-----BEGIN CERTIFICATE----- ++MIIDbDCCAtWgAwIBAgIJAK7FVsxyN1CiMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYD ++VQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTATBgNVBAcTDFBv ++cnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5nZWxvMR8wHQYJ ++KoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0MB4XDTA4MDYzMDEwMjg0M1oXDTA4 ++MDczMDEwMjg0M1owgYExCzAJBgNVBAYTAkJSMRowGAYDVQQIExFSaW8gR3JhbmRl ++IGRvIFN1bDEVMBMGA1UEBxMMUG9ydG8gQWxlZ3JlMR4wHAYDVQQDExVIZW5yaXF1 ++ZSBkbyBOLiBBbmdlbG8xHzAdBgkqhkiG9w0BCQEWEGhuYW5nZWxvQHBocC5uZXQw ++gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMteno+QK1ulX4/WDAVBYfoTPRTz ++e4SZLwgael4jwWTytj+8c5nNllrFELD6WjJzfjaoIMhCF4w4I2bkWR6/PTqrvnv+ ++iiiItHfKvJgYqIobUhkiKmWa2wL3mgqvNRIqTrTC4jWZuCkxQ/ksqL9O/F6zk+aR ++S1d+KbPaqCR5Rw+lAgMBAAGjgekwgeYwHQYDVR0OBBYEFNt+QHK9XDWF7CkpgRLo ++Ymhqtz99MIG2BgNVHSMEga4wgauAFNt+QHK9XDWF7CkpgRLoYmhqtz99oYGHpIGE ++MIGBMQswCQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTAT ++BgNVBAcTDFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5n ++ZWxvMR8wHQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0ggkArsVWzHI3UKIw ++DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCP1GUnStC0TBqngr3Kx+zS ++UW8KutKO0ORc5R8aV/x9LlaJrzPyQJgiPpu5hXogLSKRIHxQS3X2+Y0VvIpW72LW ++PVKPhYlNtO3oKnfoJGKin0eEhXRZMjfEW/kznY+ZZmNifV2r8s+KhNAqI4PbClvn ++4vh8xF/9+eVEj+hM+0OflA== + -----END CERTIFICATE----- + " + } +diff -ruN a/ext/openssl/tests/openssl_pkcs7_decrypt_basic.phpt b/ext/openssl/tests/openssl_pkcs7_decrypt_basic.phpt +--- a/ext/openssl/tests/openssl_pkcs7_decrypt_basic.phpt 2024-08-09 13:19:44.272565609 +0900 ++++ b/ext/openssl/tests/openssl_pkcs7_decrypt_basic.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -19,8 +19,9 @@ + $headers = array("test@test", "testing openssl_pkcs7_encrypt()"); + $wrong = "wrong"; + $empty = ""; ++$cipher = OPENSSL_CIPHER_AES_128_CBC; + +-openssl_pkcs7_encrypt($infile, $encrypted, $single_cert, $headers); ++openssl_pkcs7_encrypt($infile, $encrypted, $single_cert, $headers, 0, $cipher); + var_dump(openssl_pkcs7_decrypt($encrypted, $outfile, $single_cert, $privkey)); + var_dump(openssl_pkcs7_decrypt($encrypted, $outfile, openssl_x509_read($single_cert), $privkey)); + var_dump(openssl_pkcs7_decrypt($encrypted, $outfile, $single_cert, $wrong)); +diff -ruN a/ext/openssl/tests/openssl_pkcs7_encrypt_basic.phpt b/ext/openssl/tests/openssl_pkcs7_encrypt_basic.phpt +--- a/ext/openssl/tests/openssl_pkcs7_encrypt_basic.phpt 2024-08-09 13:19:44.280565990 +0900 ++++ b/ext/openssl/tests/openssl_pkcs7_encrypt_basic.phpt 2024-08-09 13:20:33.120890846 +0900 +@@ -20,21 +20,20 @@ + $empty_headers = array(); + $wrong = "wrong"; + $empty = ""; ++$cipher = OPENSSL_CIPHER_AES_128_CBC; + +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, openssl_x509_read($single_cert), $headers)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, openssl_x509_read($single_cert), $headers, 0, $cipher)); + var_dump(openssl_pkcs7_decrypt($outfile, $outfile2, $single_cert, $privkey)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $assoc_headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $empty_headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $wrong)); +-var_dump(openssl_pkcs7_encrypt($wrong, $outfile, $single_cert, $headers)); +-var_dump(openssl_pkcs7_encrypt($empty, $outfile, $single_cert, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $empty, $single_cert, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $wrong, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $empty, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $empty)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, $multi_certs, $headers)); +-var_dump(openssl_pkcs7_encrypt($infile, $outfile, array_map('openssl_x509_read', $multi_certs) , $headers)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $assoc_headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $single_cert, $empty_headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($wrong, $outfile, $single_cert, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($empty, $outfile, $single_cert, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $empty, $single_cert, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $wrong, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $empty, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, $multi_certs, $headers, 0, $cipher)); ++var_dump(openssl_pkcs7_encrypt($infile, $outfile, array_map('openssl_x509_read', $multi_certs), $headers, 0, $cipher)); + + if (file_exists($outfile)) { + echo "true\n"; +@@ -51,17 +50,11 @@ + bool(true) + bool(true) + bool(true) +- +-Warning: openssl_pkcs7_encrypt() expects parameter 4 to be array, string given in %s on line %d +-bool(false) + bool(false) + bool(false) + bool(false) + bool(false) + bool(false) +- +-Warning: openssl_pkcs7_encrypt() expects parameter 4 to be array, string given in %s on line %d +-bool(false) + bool(true) + bool(true) + true +diff -ruN a/ext/openssl/tests/openssl_pkey_export_basic.phpt b/ext/openssl/tests/openssl_pkey_export_basic.phpt +--- a/ext/openssl/tests/openssl_pkey_export_basic.phpt 2024-08-09 13:19:44.278565895 +0900 ++++ b/ext/openssl/tests/openssl_pkey_export_basic.phpt 2024-08-09 13:20:33.125891084 +0900 +@@ -46,7 +46,11 @@ + --EXPECTF-- + resource(%d) of type (OpenSSL key) + bool(true) +------BEGIN EC PRIVATE KEY-----%a-----END EC PRIVATE KEY----- ++-----BEGIN PRIVATE KEY----- ++MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs+Sqh7IzteDBiS5K ++PfTvuWuyt9YkrkuoyiW/6bag6NmhRANCAAQ+riFshYe8HnWt1avx6OuNajipU1ZW ++6BgW0+D/EtDDSYeQg9ngO8qyo5M6cyh7ORtKZVUy7DP1+W+eocaZC+a6 ++-----END PRIVATE KEY----- + bool(true) + bool(true) + resource(%d) of type (OpenSSL key) +diff -ruN a/ext/openssl/tests/openssl_seal_basic.phpt b/ext/openssl/tests/openssl_seal_basic.phpt +--- a/ext/openssl/tests/openssl_seal_basic.phpt 2024-08-09 13:19:44.278565895 +0900 ++++ b/ext/openssl/tests/openssl_seal_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -9,23 +9,24 @@ + $b = array(1); + $c = array(1); + $d = array(1); ++$method = "AES-128-ECB"; + +-var_dump(openssl_seal($a, $b, $c, $d)); +-var_dump(openssl_seal($a, $a, $a, array())); +-var_dump(openssl_seal($c, $c, $c, 1)); +-var_dump(openssl_seal($b, $b, $b, "")); ++var_dump(openssl_seal($a, $b, $c, $d, $method)); ++var_dump(openssl_seal($a, $a, $a, array(), $method)); ++var_dump(openssl_seal($c, $c, $c, 1, $method)); ++var_dump(openssl_seal($b, $b, $b, "", $method)); + + // tests with cert + $data = "openssl_open() test"; + $pub_key = "file://" . __DIR__ . "/public.key"; + $wrong = "wrong"; + +-var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key))); // no output +-var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key, $pub_key))); // no output +-var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key, $wrong))); +-var_dump(openssl_seal($data, $sealed, $ekeys, $pub_key)); +-var_dump(openssl_seal($data, $sealed, $ekeys, array())); +-var_dump(openssl_seal($data, $sealed, $ekeys, array($wrong))); ++var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key), $method)); // no output ++var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key, $pub_key), $method)); // no output ++var_dump(openssl_seal($data, $sealed, $ekeys, array($pub_key, $wrong), $method)); ++var_dump(openssl_seal($data, $sealed, $ekeys, $pub_key, $method)); ++var_dump(openssl_seal($data, $sealed, $ekeys, array(), $method)); ++var_dump(openssl_seal($data, $sealed, $ekeys, array($wrong), $method)); + + echo "Done\n"; + ?> +@@ -41,8 +42,8 @@ + + Warning: openssl_seal() expects parameter 1 to be string, array given in %s on line %d + NULL +-int(19) +-int(19) ++int(32) ++int(32) + + Warning: openssl_seal(): not a public key (2th member of pubkeys) in %s on line %d + bool(false) +diff -ruN a/ext/openssl/tests/openssl_spki_export_basic.phpt b/ext/openssl/tests/openssl_spki_export_basic.phpt +--- a/ext/openssl/tests/openssl_spki_export_basic.phpt 2024-08-09 13:19:44.275565752 +0900 ++++ b/ext/openssl/tests/openssl_spki_export_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -19,14 +19,12 @@ + + /* array of available hashings to test */ + $algo = array( +- OPENSSL_ALGO_MD4, + OPENSSL_ALGO_MD5, + OPENSSL_ALGO_SHA1, + OPENSSL_ALGO_SHA224, + OPENSSL_ALGO_SHA256, + OPENSSL_ALGO_SHA384, + OPENSSL_ALGO_SHA512, +- OPENSSL_ALGO_RMD160 + ); + + /* loop over key sizes for test */ +@@ -53,8 +51,6 @@ + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +-\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +-\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- + \-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +diff -ruN a/ext/openssl/tests/openssl_spki_export_challenge_basic.phpt b/ext/openssl/tests/openssl_spki_export_challenge_basic.phpt +--- a/ext/openssl/tests/openssl_spki_export_challenge_basic.phpt 2024-08-09 13:19:44.283566133 +0900 ++++ b/ext/openssl/tests/openssl_spki_export_challenge_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -21,14 +21,12 @@ + + /* array of available hashings to test */ + $algo = array( +- OPENSSL_ALGO_MD4, + OPENSSL_ALGO_MD5, + OPENSSL_ALGO_SHA1, + OPENSSL_ALGO_SHA224, + OPENSSL_ALGO_SHA256, + OPENSSL_ALGO_SHA384, + OPENSSL_ALGO_SHA512, +- OPENSSL_ALGO_RMD160 + ); + + /* loop over key sizes for test */ +@@ -56,18 +54,6 @@ + string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" + bool\(false\) + string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" +-bool\(false\) +-string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" + bool\(false\) + string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\" + bool\(false\) +diff -ruN a/ext/openssl/tests/openssl_spki_new_basic.phpt b/ext/openssl/tests/openssl_spki_new_basic.phpt +--- a/ext/openssl/tests/openssl_spki_new_basic.phpt 2024-08-09 13:19:44.273565657 +0900 ++++ b/ext/openssl/tests/openssl_spki_new_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -18,14 +18,12 @@ + + /* array of available hashings to test */ + $algo = array( +- OPENSSL_ALGO_MD4, + OPENSSL_ALGO_MD5, + OPENSSL_ALGO_SHA1, + OPENSSL_ALGO_SHA224, + OPENSSL_ALGO_SHA256, + OPENSSL_ALGO_SHA384, + OPENSSL_ALGO_SHA512, +- OPENSSL_ALGO_RMD160 + ); + + /* loop over key sizes for test */ +@@ -53,21 +51,15 @@ + string(478) "%s" + string(478) "%s" + string(478) "%s" +-string(478) "%s" +-string(474) "%s" +-string(830) "%s" + string(830) "%s" + string(830) "%s" + string(830) "%s" + string(830) "%s" + string(830) "%s" + string(830) "%s" +-string(826) "%s" +-string(1510) "%s" + string(1510) "%s" + string(1510) "%s" + string(1510) "%s" + string(1510) "%s" + string(1510) "%s" + string(1510) "%s" +-string(1506) "%s" +diff -ruN a/ext/openssl/tests/openssl_spki_verify_basic.phpt b/ext/openssl/tests/openssl_spki_verify_basic.phpt +--- a/ext/openssl/tests/openssl_spki_verify_basic.phpt 2024-08-09 13:19:44.274565705 +0900 ++++ b/ext/openssl/tests/openssl_spki_verify_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -25,7 +25,6 @@ + OPENSSL_ALGO_SHA256, + OPENSSL_ALGO_SHA384, + OPENSSL_ALGO_SHA512, +- OPENSSL_ALGO_RMD160 + ); + + /* loop over key sizes for test */ +@@ -53,12 +52,6 @@ + bool(true) + bool(false) + bool(true) +-bool(false) +-bool(true) +-bool(false) +-bool(true) +-bool(false) +-bool(true) + bool(false) + bool(true) + bool(false) +diff -ruN a/ext/openssl/tests/openssl_x509_parse_basic.phpt b/ext/openssl/tests/openssl_x509_parse_basic.phpt +--- a/ext/openssl/tests/openssl_x509_parse_basic.phpt 2024-08-09 13:19:44.274565705 +0900 ++++ b/ext/openssl/tests/openssl_x509_parse_basic.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -153,10 +153,9 @@ + ["subjectKeyIdentifier"]=> + string(59) "DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D" + ["authorityKeyIdentifier"]=> +- string(202) "keyid:DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D ++ string(%d) "keyid:DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D + DirName:/C=BR/ST=Rio Grande do Sul/L=Porto Alegre/CN=Henrique do N. Angelo/emailAddress=hnangelo@php.net +-serial:AE:C5:56:CC:72:37:50:A2 +-" ++serial:AE:C5:56:CC:72:37:50:A2%A" + ["basicConstraints"]=> + string(7) "CA:TRUE" + } +@@ -301,10 +300,9 @@ + ["subjectKeyIdentifier"]=> + string(59) "DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D" + ["authorityKeyIdentifier"]=> +- string(202) "keyid:DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D ++ string(%d) "keyid:DB:7E:40:72:BD:5C:35:85:EC:29:29:81:12:E8:62:68:6A:B7:3F:7D + DirName:/C=BR/ST=Rio Grande do Sul/L=Porto Alegre/CN=Henrique do N. Angelo/emailAddress=hnangelo@php.net +-serial:AE:C5:56:CC:72:37:50:A2 +-" ++serial:AE:C5:56:CC:72:37:50:A2%A" + ["basicConstraints"]=> + string(7) "CA:TRUE" + } +diff -ruN a/ext/openssl/tests/session_meta_capture.phpt b/ext/openssl/tests/session_meta_capture.phpt +--- a/ext/openssl/tests/session_meta_capture.phpt 2024-08-09 13:19:44.281566038 +0900 ++++ b/ext/openssl/tests/session_meta_capture.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -15,7 +15,7 @@ + $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $serverCtx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -37,7 +37,7 @@ + 'cafile' => '%s', + 'peer_name' => '%s', + 'capture_session_meta' => true, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/stream_crypto_flags_001.phpt b/ext/openssl/tests/stream_crypto_flags_001.phpt +--- a/ext/openssl/tests/stream_crypto_flags_001.phpt 2024-08-09 13:19:44.280565990 +0900 ++++ b/ext/openssl/tests/stream_crypto_flags_001.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -15,7 +15,7 @@ + $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $serverCtx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -35,7 +35,7 @@ + 'verify_peer' => true, + 'cafile' => '%s', + 'peer_name' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/stream_crypto_flags_002.phpt b/ext/openssl/tests/stream_crypto_flags_002.phpt +--- a/ext/openssl/tests/stream_crypto_flags_002.phpt 2024-08-09 13:19:44.280565990 +0900 ++++ b/ext/openssl/tests/stream_crypto_flags_002.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -15,7 +15,7 @@ + $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $serverCtx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -36,7 +36,7 @@ + 'verify_peer' => true, + 'cafile' => '%s', + 'peer_name' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/stream_crypto_flags_003.phpt b/ext/openssl/tests/stream_crypto_flags_003.phpt +--- a/ext/openssl/tests/stream_crypto_flags_003.phpt 2024-08-09 13:19:44.280565990 +0900 ++++ b/ext/openssl/tests/stream_crypto_flags_003.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -19,7 +19,7 @@ + + // Only accept TLSv1.0 and TLSv1.2 connections + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -40,7 +40,7 @@ + 'verify_peer' => true, + 'cafile' => '%s', + 'peer_name' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/stream_crypto_flags_004.phpt b/ext/openssl/tests/stream_crypto_flags_004.phpt +--- a/ext/openssl/tests/stream_crypto_flags_004.phpt 2024-08-09 13:19:44.277565847 +0900 ++++ b/ext/openssl/tests/stream_crypto_flags_004.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -16,7 +16,7 @@ + $serverCtx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_SERVER, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -37,7 +37,7 @@ + 'verify_peer' => true, + 'cafile' => '%s', + 'peer_name' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/stream_security_level.phpt b/ext/openssl/tests/stream_security_level.phpt +--- a/ext/openssl/tests/stream_security_level.phpt 2024-08-09 13:19:44.273565657 +0900 ++++ b/ext/openssl/tests/stream_security_level.phpt 2024-08-09 14:03:22.716631665 +0900 +@@ -24,7 +24,7 @@ + 'local_cert' => '%s', + // Make sure the server side starts up successfully if the default security level is + // higher. We want to test the error at the client side. +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); +@@ -66,7 +66,7 @@ + ?> + --EXPECTF-- + Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: +-error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in %s : eval()'d code on line %d ++error:%s:SSL routines:%S:certificate verify failed in %s : eval()'d code on line %d + + Warning: stream_socket_client(): Failed to enable crypto in %s : eval()'d code on line %d + +diff -ruN a/ext/openssl/tests/tls_min_v1.0_max_v1.1_wrapper.phpt b/ext/openssl/tests/tls_min_v1.0_max_v1.1_wrapper.phpt +--- a/ext/openssl/tests/tls_min_v1.0_max_v1.1_wrapper.phpt 2024-08-09 13:19:44.272565609 +0900 ++++ b/ext/openssl/tests/tls_min_v1.0_max_v1.1_wrapper.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -15,7 +15,7 @@ + 'local_cert' => '%s', + 'min_proto_version' => STREAM_CRYPTO_PROTO_TLSv1_0, + 'max_proto_version' => STREAM_CRYPTO_PROTO_TLSv1_1, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +@@ -32,7 +32,7 @@ + $ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/tlsv1.0_wrapper.phpt b/ext/openssl/tests/tlsv1.0_wrapper.phpt +--- a/ext/openssl/tests/tlsv1.0_wrapper.phpt 2024-08-09 13:19:44.282566085 +0900 ++++ b/ext/openssl/tests/tlsv1.0_wrapper.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -13,7 +13,7 @@ + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; + $ctx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server('tlsv1.0://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +@@ -30,7 +30,7 @@ + $ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/tlsv1.1_wrapper.phpt b/ext/openssl/tests/tlsv1.1_wrapper.phpt +--- a/ext/openssl/tests/tlsv1.1_wrapper.phpt 2024-08-09 13:19:44.279565943 +0900 ++++ b/ext/openssl/tests/tlsv1.1_wrapper.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -13,7 +13,7 @@ + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; + $ctx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +@@ -30,7 +30,7 @@ + $ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/tls_wrapper.phpt b/ext/openssl/tests/tls_wrapper.phpt +--- a/ext/openssl/tests/tls_wrapper.phpt 2024-08-09 13:19:44.275565752 +0900 ++++ b/ext/openssl/tests/tls_wrapper.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -14,7 +14,7 @@ + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; + $ctx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +@@ -31,7 +31,7 @@ + $ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/tests/tls_wrapper_with_tls_v1.3.phpt b/ext/openssl/tests/tls_wrapper_with_tls_v1.3.phpt +--- a/ext/openssl/tests/tls_wrapper_with_tls_v1.3.phpt 2024-08-09 13:19:44.277565847 +0900 ++++ b/ext/openssl/tests/tls_wrapper_with_tls_v1.3.phpt 2024-08-09 13:20:33.110890370 +0900 +@@ -14,7 +14,7 @@ + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; + $ctx = stream_context_create(['ssl' => [ + 'local_cert' => '%s', +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +@@ -31,7 +31,7 @@ + $ctx = stream_context_create(['ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, +- 'security_level' => 1, ++ 'security_level' => 0, + ]]); + + phpt_wait(); +diff -ruN a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c +--- a/ext/openssl/xp_ssl.c 2024-08-09 13:19:44.271565562 +0900 ++++ b/ext/openssl/xp_ssl.c 2024-08-09 14:01:30.805168218 +0900 +@@ -1200,11 +1200,7 @@ + + static int php_openssl_set_server_dh_param(php_stream * stream, SSL_CTX *ctx) /* {{{ */ + { +- DH *dh; +- BIO* bio; +- zval *zdhpath; +- +- zdhpath = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", "dh_param"); ++ zval *zdhpath = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", "dh_param"); + if (zdhpath == NULL) { + #if 0 + /* Coming in OpenSSL 1.1 ... eventually we'll want to enable this +@@ -1219,14 +1215,29 @@ + return FAILURE; + } + +- bio = BIO_new_file(Z_STRVAL_P(zdhpath), PHP_OPENSSL_BIO_MODE_R(PKCS7_BINARY)); ++ BIO *bio = BIO_new_file(Z_STRVAL_P(zdhpath), PHP_OPENSSL_BIO_MODE_R(PKCS7_BINARY)); + + if (bio == NULL) { + php_error_docref(NULL, E_WARNING, "invalid dh_param"); + return FAILURE; + } + +- dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); ++#if PHP_OPENSSL_API_VERSION >= 0x30000 ++ EVP_PKEY *pkey = PEM_read_bio_Parameters(bio, NULL); ++ BIO_free(bio); ++ ++ if (pkey == NULL) { ++ php_error_docref(NULL, E_WARNING, "Failed reading DH params"); ++ return FAILURE; ++ } ++ ++ if (SSL_CTX_set0_tmp_dh_pkey(ctx, pkey) < 0) { ++ php_error_docref(NULL, E_WARNING, "Failed assigning DH params"); ++ EVP_PKEY_free(pkey); ++ return FAILURE; ++ } ++#else ++ DH *dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (dh == NULL) { +@@ -1241,6 +1252,7 @@ + } + + DH_free(dh); ++#endif + + return SUCCESS; + } diff --git a/php-imap-annotation+status-current.diff b/php-imap-annotation+status-current.diff index acc6291..25b4bd0 100644 --- a/php-imap-annotation+status-current.diff +++ b/php-imap-annotation+status-current.diff @@ -110,7 +110,7 @@ diff -Naurp php-5.3.4RC1/ext/imap/php_imap.c php-5.3.4RC1.oden/ext/imap/php_imap + long ret; + + // TODO: Use zend_parse_parameters here -+ if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &streamind, &mailbox, &entry, &attr, &value) == FAILURE) { ++ if (ZEND_NUM_ARGS() != 5 || zend_parse_parameters(5 TSRMLS_CC, "zzzzz", &streamind, &mailbox, &entry, &attr, &value) == FAILURE) { + ZEND_WRONG_PARAM_COUNT(); + } + @@ -158,7 +158,7 @@ diff -Naurp php-5.3.4RC1/ext/imap/php_imap.c php-5.3.4RC1.oden/ext/imap/php_imap + pils *imap_le_struct; + long ret; + -+ if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &streamind, &mailbox, &entry, &attr) == FAILURE) { ++ if(ZEND_NUM_ARGS() != 4 || zend_parse_parameters(4 TSRMLS_CC, "zzzz", &streamind, &mailbox, &entry, &attr) == FAILURE) { + ZEND_WRONG_PARAM_COUNT(); + } @@ -226,7 +226,7 @@ diff -Naurp php-5.3.4RC1/ext/imap/php_imap.c php-5.3.4RC1.oden/ext/imap/php_imap + pils *imap_le_struct; + long flags = 0L; + -+ if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &streamind, &pflags) == FAILURE) { ++ if (ZEND_NUM_ARGS() != 2 || zend_parse_parameters(2, "zz", &streamind, &pflags) == FAILURE) { + ZEND_WRONG_PARAM_COUNT(); + } + diff --git a/php-imap-myrights.diff b/php-imap-myrights.diff index efec577..72603ec 100644 --- a/php-imap-myrights.diff +++ b/php-imap-myrights.diff @@ -54,7 +54,7 @@ diff -Naurp php-5.3.4RC1/ext/imap/php_imap.c php-5.3.4RC1.oden/ext/imap/php_imap + zval **streamind, **mailbox; + pils *imap_le_struct; + -+ if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &streamind, &mailbox) == FAILURE) { ++ if(ZEND_NUM_ARGS() != 2 || zend_parse_parameters(2 TSRMLS_CC, "zz", &streamind, &mailbox) == FAILURE) { + ZEND_WRONG_PARAM_COUNT(); + } + diff --git a/php-not-use-libgd-const.patch b/php-not-use-libgd-const.patch new file mode 100644 index 0000000..e1af337 --- /dev/null +++ b/php-not-use-libgd-const.patch @@ -0,0 +1,47 @@ +diff -ruN a/ext/gd/gd.c b/ext/gd/gd.c +--- a/ext/gd/gd.c 2021-09-21 20:23:13.000000000 +0900 ++++ b/ext/gd/gd.c 2021-09-25 12:14:22.927843511 +0900 +@@ -97,6 +97,11 @@ + + #include "gd_ctx.c" + ++/* don't used libgd constants, not used, so going to be removed */ ++#define PHP_GD_FLIP_HORIZONTAL 1 ++#define PHP_GD_FLIP_VERTICAL 2 ++#define PHP_GD_FLIP_BOTH 3 ++ + /* as it is not really public, duplicate declaration here to avoid + pointless warnings */ + int overflow2(int a, int b); +@@ -1137,9 +1142,9 @@ + /* GD2 image format types */ + REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_CS | CONST_PERSISTENT); +- REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", GD_FLIP_HORINZONTAL, CONST_CS | CONST_PERSISTENT); +- REGISTER_LONG_CONSTANT("IMG_FLIP_VERTICAL", GD_FLIP_VERTICAL, CONST_CS | CONST_PERSISTENT); +- REGISTER_LONG_CONSTANT("IMG_FLIP_BOTH", GD_FLIP_BOTH, CONST_CS | CONST_PERSISTENT); ++ REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", PHP_GD_FLIP_HORIZONTAL, CONST_CS | CONST_PERSISTENT); ++ REGISTER_LONG_CONSTANT("IMG_FLIP_VERTICAL", PHP_GD_FLIP_VERTICAL, CONST_CS | CONST_PERSISTENT); ++ REGISTER_LONG_CONSTANT("IMG_FLIP_BOTH", PHP_GD_FLIP_BOTH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_EFFECT_REPLACE", gdEffectReplace, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_EFFECT_ALPHABLEND", gdEffectAlphaBlend, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_EFFECT_NORMAL", gdEffectNormal, CONST_CS | CONST_PERSISTENT); +@@ -4696,15 +4701,15 @@ + } + + switch (mode) { +- case GD_FLIP_VERTICAL: ++ case PHP_GD_FLIP_VERTICAL: + gdImageFlipVertical(im); + break; + +- case GD_FLIP_HORINZONTAL: ++ case PHP_GD_FLIP_HORIZONTAL: + gdImageFlipHorizontal(im); + break; + +- case GD_FLIP_BOTH: ++ case PHP_GD_FLIP_BOTH: + gdImageFlipBoth(im); + break; + diff --git a/php-shared.diff b/php-shared.diff index 70bbc18..5bccf0f 100644 --- a/php-shared.diff +++ b/php-shared.diff @@ -1,17 +1,17 @@ ---- php-7.2.0/Makefile.global.shared.droplet 2017-11-28 10:22:51.000000000 +0100 -+++ php-7.2.0/Makefile.global 2017-11-29 00:28:39.001984696 +0100 +--- php-7.2.0/build/Makefile.global.shared.droplet 2017-11-28 10:22:51.000000000 +0100 ++++ php-7.2.0/build/Makefile.global 2017-11-29 00:28:39.001984696 +0100 @@ -15,8 +15,12 @@ build-modules: $(PHP_MODULES) $(PHP_ZEND build-binaries: $(PHP_BINARIES) -libphp$(PHP_MAJOR_VERSION).la: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) -- $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ +- $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ +libphp$(PHP_MAJOR_VERSION)_common.la: $(PHP_GLOBAL_OBJS) -+ $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -version-info 8:0:3 -rpath $(phptempdir) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -version-info 8:0:3 -rpath $(phptempdir) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ + -@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1 + +libphp$(PHP_MAJOR_VERSION).la: libphp$(PHP_MAJOR_VERSION)_common.la $(PHP_SAPI_OBJS) -+ $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) libphp$(PHP_MAJOR_VERSION)_common.la $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ ++ $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) libphp$(PHP_MAJOR_VERSION)_common.la $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ -@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1 libs/libphp$(PHP_MAJOR_VERSION).bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) @@ -35,8 +35,8 @@ BUILD_CGI="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_CGI_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ;; *) -- BUILD_CGI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" -+ BUILD_CGI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" +- BUILD_CGI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ++ BUILD_CGI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_CGI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CGI_PATH)" ;; esac @@ -56,8 +56,8 @@ BUILD_CLI="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_CLI_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ;; *) -- BUILD_CLI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" -+ BUILD_CLI="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" +- BUILD_CLI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ++ BUILD_CLI="\$(LIBTOOL) --mode=link --tag=CC \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) libphp\$(PHP_MAJOR_VERSION)_common.la \$(PHP_BINARY_OBJS) \$(PHP_CLI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_CLI_PATH)" ;; esac diff --git a/php-umask.diff b/php-umask.diff index 5936a43..80d9c71 100644 --- a/php-umask.diff +++ b/php-umask.diff @@ -1,6 +1,7 @@ ---- php-7.0.1/sapi/apache2handler/sapi_apache2.c.umask.droplet 2015-12-16 11:41:54.000000000 +0100 -+++ php-7.0.1/sapi/apache2handler/sapi_apache2.c 2015-12-29 00:40:11.502348482 +0100 -@@ -475,6 +475,19 @@ static apr_status_t php_server_context_c +diff -up php-7.4.1/sapi/apache2handler/sapi_apache2.c.umask.droplet php-7.4.1/sapi/apache2handler/sapi_apache2.c +--- php-7.4.1/sapi/apache2handler/sapi_apache2.c.umask.droplet 2019-12-17 17:35:58.000000000 +0100 ++++ php-7.4.1/sapi/apache2handler/sapi_apache2.c 2020-01-08 22:26:12.858208748 +0100 +@@ -499,6 +499,19 @@ static apr_status_t php_server_context_c return APR_SUCCESS; } @@ -20,16 +21,17 @@ static int php_apache_request_ctor(request_rec *r, php_struct *ctx) { char *content_length; -@@ -669,6 +682,8 @@ zend_first_try { +@@ -694,6 +707,9 @@ zend_first_try { + highlight_file((char *)r->filename, &syntax_highlighter_ini); } else { zend_file_handle zfd; - ++ + php_save_umask(); + - zfd.type = ZEND_HANDLE_FILENAME; - zfd.filename = (char *) r->filename; - zfd.free_filename = 0; -@@ -680,6 +695,8 @@ zend_first_try { + zend_stream_init_filename(&zfd, (char *) r->filename); + + if (!parent_req) { +@@ -702,6 +718,8 @@ zend_first_try { zend_execute_scripts(ZEND_INCLUDE, NULL, 1, &zfd); } diff --git a/php5-apache2-filters.diff b/php5-apache2-filters.diff index 67c7355..2789878 100644 --- a/php5-apache2-filters.diff +++ b/php5-apache2-filters.diff @@ -1,6 +1,6 @@ --- php-7.0.1/sapi/apache2handler/php_functions.c.apache2-filters.droplet 2015-12-16 11:41:55.000000000 +0100 +++ php-7.0.1/sapi/apache2handler/php_functions.c 2015-12-29 00:12:07.202603653 +0100 -@@ -216,6 +216,65 @@ PHP_FUNCTION(apache_response_headers) +@@ -216,6 +216,63 @@ PHP_FUNCTION(apache_response_headers) } /* }}} */ @@ -38,19 +38,17 @@ +{ + php_struct *ctx; + int arg_count = ZEND_NUM_ARGS(); -+ zval **filter_name; ++ char *filter_name; + ap_filter_rec_t* ap_filter; + -+ if (arg_count != 1 /*|| -+ zend_get_parameters_ex(arg_count, &filter_name) == FAILURE*/) { ++ if (arg_count != 1 || ++ zend_parse_parameters(arg_count TSRMLS_CC, "s", &filter_name) == FAILURE) { + WRONG_PARAM_COUNT; + } + + ctx = SG(server_context); + -+ convert_to_string_ex(filter_name); -+ -+ ap_filter = ap_get_output_filter_handle(Z_STRVAL_P(*filter_name)); ++ ap_filter = ap_get_output_filter_handle(filter_name); + + /* requested output filter was not found */ + if(ap_filter == NULL) { diff --git a/php7.spec b/php7.spec new file mode 100644 index 0000000..237b8c8 --- /dev/null +++ b/php7.spec @@ -0,0 +1,2178 @@ +%define _build_pkgcheck_set %{nil} +%define _build_pkgcheck_srpm %{nil} + +# LTO causes a build failure because something forces a linking step of +# libphp7_common to barf because libtool foolishly takes -flto out of +# compiler flags +#define _disable_lto 1 + +%define build_test 0 +%{?_with_test: %{expand: %%global build_test 1}} +%{?_without_test: %{expand: %%global build_test 0}} + +%define build_libmagic 0 +%{?_with_libmagic: %{expand: %%global build_libmagic 1}} +%{?_without_libmagic: %{expand: %%global build_libmagic 0}} + +%define php7_common_major 5 +%define libname %mklibname php7_common %{php7_common_major} + +%global __requires_exclude '.*/bin/awk|.*/bin/gawk' + +# API/ABI check +%define apiver 20190902 +%define zendver 20190902 +%define pdover 20170320 + +Summary: The PHP7 scripting language +Name: php +Version: 7.4.33 +Release: 12 +Source0: http://ch1.php.net/distributions/php-%{version}.tar.gz +Source1: macros.php +Group: Development/PHP +License: PHP License +URL: http://www.php.net +Source2: maxlifetime +Source3: php.crond +Source4: php-fpm.service +Source5: php-fpm.sysconf +Source6: php-fpm.logrotate +# S7 comes from ext/fileinfo/create_data_file.php but could be removed someday +Source7: create_data_file.php +Source9: php-fpm-tmpfiles.conf +Source10: php.ini +Patch0: php-7.3.4-libtool-2.4.6.patch +Patch1: php-shared.diff +Patch3: php-7.4.1-missing-symbols.patch +Patch4: https://src.fedoraproject.org/rpms/php/raw/master/f/php-7.4.0-phpize.patch +Patch5: php-phpbuilddir.diff +# http://www.outoforder.cc/projects/apache/mod_transform/ +# http://www.outoforder.cc/projects/apache/mod_transform/patches/php7-apache2-filters.patch +Patch6: php5-apache2-filters.diff +Patch8: php-xmlrpc_epi.patch +Patch10: php-7.3.0rc1-compile.patch +Patch11: php-5.3.8-bdb-5.2.diff +Patch12: php-5.5.6-db-6.0.patch +Patch13: php-7.0.1-clang-warnings.patch +Patch14: php-7.2.0-visibility.patch +##################################################################### +# Stolen from PLD +Patch20: php-mail.diff +Patch22: php-dba-link.patch +Patch23: php-zlib-for-getimagesize.patch +# for kolab2 +# P50 was rediffed from PLD (php-5.3.3-8.src.rpm) which merges the annotation and status-current patches +Patch27: php-imap-annotation+status-current.diff +# P51 was taken from http://kolab.org/cgi-bin/viewcvs-kolab.cgi/server/php/patches/php-5.3.2/ +Patch28: php-imap-myrights.diff +Patch29: php-5.3.x-fpm-0.6.5-shared.diff +Patch30: php-5.3.x-fpm-0.6.5-mdv_conf.diff +##################################################################### +# stolen from debian +Patch50: php-session.save_path.diff +##################################################################### +# Stolen from fedora +Patch102: php-install.diff +Patch105: php-umask.diff +# Fixes for extension modules +Patch113: php-libc-client.diff +Patch114: php-no_pam_in_c-client.diff +# Fix bugs +Patch121: php-bug43221.diff +Patch122: php-not-use-libgd-const.patch +# Sauce fixes +Patch127: php-7.4.30-svace-fixes.patch +Patch128: 0001-Revert-Throw-notice-on-array-access-on-illegal-type.patch +Patch200: fix-include-e2k.patch +# fix for openssl3, rediff from https://git.remirepo.net/cgit/rpms/scl-php74/php.git/plain/php-7.4.26-openssl3.patch +Patch201: php-7.4.33-openssl3.patch +Patch202: CVE-2022-4900.patch +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: bison +BuildRequires: byacc +BuildRequires: file +BuildRequires: flex +BuildRequires: lemon +BuildRequires: libtool +BuildRequires: openssl +BuildRequires: systemd +BuildRequires: re2c >= 0.13.4 + +BuildRequires: pkgconfig(enchant) +BuildRequires: pkgconfig(expat) +BuildRequires: pkgconfig(freetype2) +BuildRequires: pkgconfig(libargon2) +BuildRequires: pkgconfig(libcurl) +BuildRequires: pkgconfig(libpcre) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libsodium) +BuildRequires: pkgconfig(libwebp) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(libxslt) +BuildRequires: pkgconfig(libzip) +BuildRequires: pkgconfig(ncurses) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(uuid) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xpm) +BuildRequires: pkgconfig(libxcrypt) +BuildRequires: pkgconfig(libpcre2-posix) +BuildRequires: pkgconfig(libpcre2-8) +BuildRequires: pkgconfig(libpcre2-16) +BuildRequires: pkgconfig(libpcre2-32) +BuildRequires: pkgconfig(xmlrpc) + +BuildRequires: apache-devel >= 2.2.0 +BuildRequires: aspell-devel +BuildRequires: bzip2-devel +BuildRequires: c-client-devel >= 2007 +BuildRequires: db-devel +BuildRequires: elfutils-devel +BuildRequires: freetds-devel >= 0.63 +BuildRequires: gdbm-devel +BuildRequires: gd-devel >= 2.0.33 +BuildRequires: gettext-devel +BuildRequires: gmp-devel +BuildRequires: gpm-devel +BuildRequires: icu-devel >= 49.0 +BuildRequires: jpeg-devel +BuildRequires: openldap-devel +BuildRequires: sasl-devel +BuildRequires: libtool-devel +BuildRequires: mysql-devel >= 4.1.7 +BuildRequires: lm_sensors-devel +BuildRequires: net-snmp-devel +BuildRequires: net-snmp-mibs +BuildRequires: onig-devel >= 5.9.2 +BuildRequires: pam-devel +BuildRequires: postgresql-devel +BuildRequires: readline-devel +BuildRequires: recode-devel +BuildRequires: tidy-devel +BuildRequires: unixODBC-devel >= 2.2.1 +BuildRequires: xmlrpc-epi-devel +%if %{build_libmagic} +BuildRequires: magic-devel +%endif +Epoch: 3 + +# stupid postgresql... stupid build system... +# this is needed due to the postgresql packaging and due to bugs like this: +# https://qa.mandriva.com/show_bug.cgi?id=52527 +%define postgresql_version %(pg_config &>/dev/null && pg_config 2>/dev/null | grep "^VERSION" | awk '{ print $4 }' 2>/dev/null || echo 0) + +%description +PHP7 is an HTML-embeddable scripting language. PHP7 offers built-in database +integration for several commercial and non-commercial database management +systems, so writing a database-enabled script with PHP7 is fairly simple. The +most common use of PHP7 coding is probably as a replacement for CGI scripts. + +%package cli +Summary: PHP7 CLI interface +Group: Development/Other +Requires: %{libname} >= %{EVRD} +Requires: %{name}-ctype >= %{EVRD} +Requires: %{name}-filter >= %{EVRD} +Requires: %{name}-ftp >= %{EVRD} +Requires: %{name}-gettext >= %{EVRD} +Requires: %{name}-ini >= %{version} +Requires: %{name}-json >= %{EVRD} +Requires: %{name}-openssl >= %{EVRD} +Requires: %{name}-posix >= %{EVRD} +Requires: %{name}-session >= %{EVRD} +# Suggests: %{name}-suhosin >= 0.9.33 +Requires: %{name}-sysvsem >= %{EVRD} +Requires: %{name}-sysvshm >= %{EVRD} +Requires: %{name}-timezonedb >= 3:2009.10 +Requires: %{name}-tokenizer >= %{EVRD} +Requires: %{name}-xmlreader >= %{EVRD} +Requires: %{name}-xmlwriter >= %{EVRD} +Requires: %{name}-zlib >= %{EVRD} +Requires: %{name}-xml >= %{EVRD} +Provides: %{name} = %{EVRD} +Provides: /usr/bin/php + +%description cli +PHP7 is an HTML-embeddable scripting language. PHP7 offers built-in database +integration for several commercial and non-commercial database management +systems, so writing a database-enabled script with PHP7 is fairly simple. The +most common use of PHP7 coding is probably as a replacement for CGI scripts. + +This package contains a command-line (CLI) version of php. You must also +install libphp7_common. If you need apache module support, you also need to +install the apache-mod_php package. + +%package dbg +Summary: Debugging version of the PHP7 CLI interface +Group: Development/Other +Requires: %{libname} >= %{EVRD} +Requires: %{name}-ctype >= %{EVRD} +Requires: %{name}-filter >= %{EVRD} +Requires: %{name}-ftp >= %{EVRD} +Requires: %{name}-gettext >= %{EVRD} +Requires: %{name}-ini >= %{version} +Requires: %{name}-json >= %{EVRD} +Requires: %{name}-openssl >= %{EVRD} +Requires: %{name}-posix >= %{EVRD} +Requires: %{name}-session >= %{EVRD} +# Suggests: %{name}-suhosin >= 0.9.33 +Requires: %{name}-sysvsem >= %{EVRD} +Requires: %{name}-sysvshm >= %{EVRD} +Requires: %{name}-timezonedb >= 3:2009.10 +Requires: %{name}-tokenizer >= %{EVRD} +Requires: %{name}-xmlreader >= %{EVRD} +Requires: %{name}-xmlwriter >= %{EVRD} +Requires: %{name}-zlib >= %{EVRD} +Requires: %{name}-xml >= %{EVRD} +Provides: %{name} = %{EVRD} + +%description dbg +PHP7 is an HTML-embeddable scripting language. PHP7 offers built-in database +integration for several commercial and non-commercial database management +systems, so writing a database-enabled script with PHP7 is fairly simple. The +most common use of PHP7 coding is probably as a replacement for CGI scripts. + +This package contains a debugging version of php. You must also +install libphp7_common. If you need apache module support, you also need to +install the apache-mod_php package. + +%package cgi +Summary: PHP7 CGI interface +Group: Development/Other +Requires: %{libname} >= %{EVRD} +Requires: %{name}-ctype >= %{EVRD} +Requires: %{name}-filter >= %{EVRD} +Requires: %{name}-ftp >= %{EVRD} +Requires: %{name}-gettext >= %{EVRD} +Requires: %{name}-ini >= %{version} +Requires: %{name}-json >= %{EVRD} +Requires: %{name}-openssl >= %{EVRD} +Requires: %{name}-posix >= %{EVRD} +Requires: %{name}-session >= %{EVRD} +# Suggests: %{name}-suhosin >= 0.9.33 +Requires: %{name}-sysvsem >= %{EVRD} +Requires: %{name}-sysvshm >= %{EVRD} +Requires: %{name}-timezonedb >= 3:2009.10 +Requires: %{name}-tokenizer >= %{EVRD} +Requires: %{name}-xmlreader >= %{EVRD} +Requires: %{name}-xmlwriter >= %{EVRD} +Requires: %{name}-zlib >= %{EVRD} +Requires: %{name}-xml >= %{EVRD} +Provides: %{name} = %{EVRD} +Provides: %{name}-fcgi = %{EVRD} +Obsoletes: %{name}-fcgi < %{EVRD} + +%description cgi +PHP7 is an HTML-embeddable scripting language. PHP7 offers built-in database +integration for several commercial and non-commercial database management +systems, so writing a database-enabled script with PHP7 is fairly simple. The +most common use of PHP7 coding is probably as a replacement for CGI scripts. + +This package contains a standalone (CGI) version of php with FastCGI support. +You must also install libphp7_common. If you need apache module support, you +also need to install the apache-mod_php package. + +%package -n %{libname} +Summary: Shared library for PHP7 +Group: Development/Other +Provides: %{name}-pcre = %{EVRD} +Provides: %{name}-simplexml = %{EVRD} +Provides: php(api) = %{apiver} +Provides: php(zend-abi) = %{zendver} +Requires: systemd-units +Requires(post): systemd-units +Requires(preun): systemd-units +Requires(postun): systemd-units + +%description -n %{libname} +This package provides the common files to run with different implementations of +PHP7. You need this package if you install the php standalone package or a +webserver with php support (ie: apache-mod_php). + +%package devel +Summary: Development package for PHP7 +Group: Development/C +Requires: %{libname} >= %{EVRD} +Requires: autoconf automake libtool +Requires: bison +Requires: byacc +Requires: chrpath +Requires: dos2unix +Requires: flex +Requires: openssl +Requires: re2c >= 0.9.11 +Requires: tcl +Requires: pam-devel +Requires: pkgconfig(libpcre) +Requires: pkgconfig(libxml-2.0) +Requires: pkgconfig(libxslt) +Requires: pkgconfig(openssl) + + +%description devel +The php-devel package lets you compile dynamic extensions to PHP7. Included +here is the source for the php extensions. Instead of recompiling the whole php +binary to add support for, say, oracle, install this package and use the new +self-contained extensions support. For more information, read the file +SELF-CONTAINED-EXTENSIONS. + +%package openssl +Summary: OpenSSL extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description openssl +This is a dynamic shared object (DSO) for PHP that will add OpenSSL support. + +%package zlib +Summary: Zlib extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description zlib +This is a dynamic shared object (DSO) for PHP that will add zlib compression +support to PHP. + +%package doc +Summary: Documentation for PHP +Group: Development/PHP + +%description doc +Documentation for php. + +%package bcmath +Summary: The bcmath module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description bcmath +This is a dynamic shared object (DSO) for PHP that will add bc style precision +math functions support. + +For arbitrary precision mathematics PHP offers the Binary Calculator which +supports numbers of any size and precision, represented as strings. + +%package bz2 +Summary: Bzip2 extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description bz2 +This is a dynamic shared object (DSO) for PHP that will add bzip2 compression +support to PHP. + +The bzip2 functions are used to transparently read and write bzip2 (.bz2) +compressed files. + +%package calendar +Summary: Calendar extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description calendar +This is a dynamic shared object (DSO) for PHP that will add calendar support. + +The calendar extension presents a series of functions to simplify converting +between different calendar formats. The intermediary or standard it is based on +is the Julian Day Count. The Julian Day Count is a count of days starting from +January 1st, 4713 B.C. To convert between calendar systems, you must first +convert to Julian Day Count, then to the calendar system of your choice. Julian +Day Count is very different from the Julian Calendar! For more information on +Julian Day Count, visit http://www.hermetic.ch/cal_stud/jdn.htm. For more +information on calendar systems visit +http://www.boogle.com/info/cal-overview.html. Excerpts from this page are +included in these instructions, and are in quotes. + +%package ctype +Summary: Ctype extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description ctype +This is a dynamic shared object (DSO) for PHP that will add ctype support. + +The functions provided by this extension check whether a character or string +falls into a certain character class according to the current locale (see also +setlocale()). + +%package curl +Summary: Curl extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description curl +This is a dynamic shared object (DSO) for PHP that will add curl support. + +PHP supports libcurl, a library created by Daniel Stenberg, that allows you to +connect and communicate to many different types of servers with many different +types of protocols. libcurl currently supports the http, https, ftp, gopher, +telnet, dict, file, and ldap protocols. libcurl also supports HTTPS +certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with +PHP's ftp extension), HTTP form based upload, proxies, cookies, and +user+password authentication. + +%package dba +Summary: DBA extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description dba +This is a dynamic shared object (DSO) for PHP that will add flat-file databases +(DBA) support. + +These functions build the foundation for accessing Berkeley DB style databases. + +This is a general abstraction layer for several file-based databases. As such, +functionality is limited to a common subset of features supported by modern +databases such as Sleepycat Software's DB2. (This is not to be confused with +IBM's DB2 software, which is supported through the ODBC functions.) + +%package dom +Summary: Dom extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description dom +This is a dynamic shared object (DSO) for PHP that will add dom support. + +The DOM extension is the replacement for the DOM XML extension from PHP 4. The +extension still contains many old functions, but they should no longer be used. +In particular, functions that are not object-oriented should be avoided. + +The extension allows you to operate on an XML document with the DOM API. + +%package enchant +Summary: Libenchant binder, support near all spelling tools +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description enchant +Enchant is a binder for libenchant. Libenchant provides a common API for many +spell libraries: + + - aspell/pspell (intended to replace ispell) + - hspell (hebrew) + - ispell + - myspell (OpenOffice project, mozilla) + - uspell (primarily Yiddish, Hebrew, and Eastern European languages) + A plugin system allows to add custom spell support. + see www.abisource.com/enchant/ + +%package sodium +Summary: Wrapper for the Sodium cryptographic library +Provides: php-pecl(libsodium) = %{version} +Provides: php-pecl(libsodium)%{?_isa} = %{version} + +%description sodium +The php-sodium package provides a simple, +low-level PHP extension for the libsodium cryptographic library. + +%package exif +Summary: EXIF extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +Requires: %{name}-mbstring >= %{EVRD} + +%description exif +This is a dynamic shared object (DSO) for PHP that will add EXIF tags support +in image files. + +With the exif extension you are able to work with image meta data. For example, +you may use exif functions to read meta data of pictures taken from digital +cameras by working with information stored in the headers of the JPEG and TIFF +images. + +%package fileinfo +Summary: Fileinfo extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description fileinfo +This extension allows retrieval of information regarding vast majority of file. +This information may include dimensions, quality, length etc... + +Additionally it can also be used to retrieve the mime type for a particular +file and for text files proper language encoding. + +%package filter +Summary: Extension for safely dealing with input parameters +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description filter +The Input Filter extension is meant to address this issue by implementing a set +of filters and mechanisms that users can use to safely access their input data. + +%package ftp +Summary: FTP extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description ftp +This is a dynamic shared object (DSO) for PHP that will add FTP support. + +The functions in this extension implement client access to file servers +speaking the File Transfer Protocol (FTP) as defined in +http://www.faqs.org/rfcs/rfc959. This extension is meant for detailed access to +an FTP server providing a wide range of control to the executing script. If you +only wish to read from or write to a file on an FTP server, consider using the +ftp:// wrapper with the filesystem functions which provide a simpler and more +intuitive interface. + +%package gd +Summary: GD extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description gd +This is a dynamic shared object (DSO) for PHP that will add GD support, +allowing you to create and manipulate images with PHP using the gd library. + +PHP is not limited to creating just HTML output. It can also be used to create +and manipulate image files in a variety of different image formats, including +gif, png, jpg, wbmp, and xpm. Even more convenient, PHP can output image +streams directly to a browser. You will need to compile PHP with the GD library +of image functions for this to work. GD and PHP may also require other +libraries, depending on which image formats you want to work with. + +You can use the image functions in PHP to get the size of JPEG, GIF, PNG, SWF, +TIFF and JPEG2000 images. + +%package gettext +Summary: Gettext extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description gettext +This is a dynamic shared object (DSO) for PHP that will add gettext support. + +The gettext functions implement an NLS (Native Language Support) API which can +be used to internationalize your PHP applications. Please see the gettext +documentation for your system for a thorough explanation of these functions or +view the docs at http://www.gnu.org/software/gettext/manual/gettext.html. + +%package gmp +Summary: Gmp extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description gmp +This is a dynamic shared object (DSO) for PHP that will add arbitrary length +number support using the GNU MP library. + +%package hash +Summary: HASH Message Digest Framework +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description hash +Native implementations of common message digest algorithms using a generic +factory method. + +Message Digest (hash) engine. Allows direct or incremental processing of +arbitrary length messages using a variety of hashing algorithms. + +%package iconv +Summary: Iconv extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description iconv +This is a dynamic shared object (DSO) for PHP that will add iconv support. + +This module contains an interface to iconv character set conversion facility. +With this module, you can turn a string represented by a local character set +into the one represented by another character set, which may be the Unicode +character set. Supported character sets depend on the iconv implementation of +your system. Note that the iconv function on some systems may not work as you +expect. In such case, it'd be a good idea to install the GNU libiconv library. +It will most likely end up with more consistent results. + +%package imap +Summary: IMAP extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description imap +This is a dynamic shared object (DSO) for PHP that will add IMAP support. + +These functions are not limited to the IMAP protocol, despite their name. The +underlying c-client library also supports NNTP, POP3 and local mailbox access +methods. + +%package intl +Summary: Internationalization extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description intl +This is a dynamic shared object (DSO) for PHP that will add +Internationalization support. + +Internationalization extension implements ICU library functionality in PHP. + +%package json +Summary: JavaScript Object Notation +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description json +Support for JSON (JavaScript Object Notation) serialization. + +%package ldap +Summary: LDAP extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description ldap +This is a dynamic shared object (DSO) for PHP that will add LDAP support. + +LDAP is the Lightweight Directory Access Protocol, and is a protocol used to +access "Directory Servers". The Directory is a special kind of database that +holds information in a tree structure. + +The concept is similar to your hard disk directory structure, except that in +this context, the root directory is "The world" and the first level +subdirectories are "countries". Lower levels of the directory structure contain +entries for companies, organisations or places, while yet lower still we find +directory entries for people, and perhaps equipment or documents. + +%package mbstring +Summary: MBstring extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +# To make it easier to find for e.g. Roundcube requesting php-multibyte +Provides: %{name}-multibyte = %{EVRD} + +%description mbstring +This is a dynamic shared object (DSO) for PHP that will add multibyte string +support. + +mbstring provides multibyte specific string functions that help you deal with +multibyte encodings in PHP. In addition to that, mbstring handles character +encoding conversion between the possible encoding pairs. mbstring is designed +to handle Unicode-based encodings such as UTF-8 and UCS-2 and many single-byte +encodings for convenience. + +%package mysqli +Summary: MySQL database module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +# mysqlnd must be loaded before mysqli (undefined symbol: mysqlnd_global_stats) +Requires: %{name}-mysqlnd = %{EVRD} +Provides: %{name}-mysql = %{EVRD} +Obsoletes: %{name}-mysql < %{EVRD} + +%description mysqli +This is a dynamic shared object (DSO) for PHP that will add MySQL database +support. + +The mysqli extension allows you to access the functionality provided by MySQL +4.1 and above. It is an improved version of the older PHP MySQL driver, +offering various benefits. The developers of the PHP programming language +recommend using MySQLi when dealing with MySQL server versions 4.1.3 and newer +(takes advantage of new functionality) + +More information about the MySQL Database server can be found at +http://www.mysql.com/ + +Documentation for MySQL can be found at http://dev.mysql.com/doc/. + +Documentation for MySQLi can be found at http://www.php.net/manual/en/mysqli.overview.php. + +%package mysqlnd +Summary: MySQL native database module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description mysqlnd +This is a dynamic shared object (DSO) for PHP that will add MySQL native +database support. + +These functions allow you to access MySQL database servers. More information +about MySQL can be found at http://www.mysql.com/. + +Documentation for MySQL can be found at http://dev.mysql.com/doc/. + +%package odbc +Summary: ODBC extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description odbc +This is a dynamic shared object (DSO) for PHP that will add ODBC support. + +In addition to normal ODBC support, the Unified ODBC functions in PHP allow you +to access several databases that have borrowed the semantics of the ODBC API to +implement their own API. Instead of maintaining multiple database drivers that +were all nearly identical, these drivers have been unified into a single set of +ODBC functions. + +%package opcache +Summary: Opcode cache for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description opcache +Opcode cache for PHP + +%package pcntl +Summary: Process Control extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description pcntl +This is a dynamic shared object (DSO) for PHP that will add process spawning +and control support. It supports functions like fork(), waitpid(), signal() +etc. + +Process Control support in PHP implements the Unix style of process creation, +program execution, signal handling and process termination. Process Control +should not be enabled within a webserver environment and unexpected results may +happen if any Process Control functions are used within a webserver +environment. + +%package pdo +Summary: PHP Data Objects Interface +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +Provides: %{name}-pdo-abi = %{pdover} +Provides: php(pdo-abi) = %{pdover} + +%description pdo +PDO provides a uniform data access interface, sporting advanced features such +as prepared statements and bound parameters. PDO drivers are dynamically +loadable and may be developed independently from the core, but still accessed +using the same API. + +Read the documentation at http://www.php.net/pdo for more information. + +%package pdo_dblib +Summary: Sybase Interface driver for PDO +Group: Development/PHP +Requires: freetds >= 0.63 +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} + +%description pdo_dblib +PDO_DBLIB is a driver that implements the PHP Data Objects (PDO) interface to +enable access from PHP to Microsoft SQL Server and Sybase databases through the +FreeTDS libary. + +%package pdo_mysql +Summary: MySQL Interface driver for PDO +Group: Development/PHP +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} + +%description pdo_mysql +PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to +enable access from PHP to MySQL 3.x and 4.x databases. + +PDO_MYSQL will take advantage of native prepared statement support present in +MySQL 4.1 and higher. If you're using an older version of the mysql client +libraries, PDO will emulate them for you. + +%package pdo_odbc +Summary: ODBC v3 Interface driver for PDO +Group: Development/PHP +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} + +%description pdo_odbc +PDO_ODBC is a driver that implements the PHP Data Objects (PDO) interface to +enable access from PHP to databases through ODBC drivers or through the IBM DB2 +Call Level Interface (DB2 CLI) library. PDO_ODBC currently supports three +different "flavours" of database drivers: + + o ibm-db2 - Supports access to IBM DB2 Universal Database, Cloudscape, and + Apache Derby servers through the free DB2 client. + + o unixODBC - Supports access to database servers through the unixODBC driver + manager and the database's own ODBC drivers. + + o generic - Offers a compile option for ODBC driver managers that are not + explicitly supported by PDO_ODBC. + +%package pdo_pgsql +Summary: PostgreSQL interface driver for PDO +Group: Development/PHP +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} +Requires: postgresql-libs >= %{postgresql_version} + +%description pdo_pgsql +PDO_PGSQL is a driver that implements the PHP Data Objects (PDO) interface to +enable access from PHP to PostgreSQL databases. + +%package pdo_sqlite +Summary: SQLite v3 Interface driver for PDO +Group: Development/PHP +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} + +%description pdo_sqlite +PDO_SQLITE is a driver that implements the PHP Data Objects (PDO) interface to +enable access to SQLite 3 databases. + +This extension provides an SQLite v3 driver for PDO. SQLite V3 is NOT +compatible with the bundled SQLite 2 in PHP 7, but is a significant step +forwards, featuring complete utf-8 support, native support for blobs, native +support for prepared statements with bound parameters and improved concurrency. + +%package pgsql +Summary: PostgreSQL database module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +Requires: postgresql-libs >= %{postgresql_version} + +%description pgsql +This is a dynamic shared object (DSO) for PHP that will add PostgreSQL database +support. + +PostgreSQL database is Open Source product and available without cost. +Postgres, developed originally in the UC Berkeley Computer Science Department, +pioneered many of the object-relational concepts now becoming available in some +commercial databases. It provides SQL92/SQL99 language support, transactions, +referential integrity, stored procedures and type extensibility. PostgreSQL is +an open source descendant of this original Berkeley code. + +%package phar +Summary: Allows running of complete applications out of .phar files +Group: Development/PHP +Requires: %{libname} >= %{EVRD} +Requires: %{name}-bz2 + +%description phar +This is the extension version of PEAR's PHP_Archive package. Support for +zlib, bz2 and crc32 is achieved without any dependency other than the external +zlib or bz2 extension. + +.phar files can be read using the phar stream, or with the Phar class. If the +SPL extension is available, a Phar object can be used as an array to iterate +over a phar's contents or to read files directly from the phar. + +Phar archives can be created using the streams API or with the Phar class, if +the phar.readonly ini variable is set to false. + +Full support for MD5 and SHA1 signatures is possible. Signatures can be +required if the ini variable phar.require_hash is set to true. When PECL +extension hash is avaiable then SHA-256 and SHA-512 signatures are supported as +well. + +%package posix +Summary: POSIX extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description posix +This is a dynamic shared object (DSO) for PHP that will add POSIX functions +support to PHP. + +This module contains an interface to those functions defined in the IEEE 1003.1 +(POSIX.1) standards document which are not accessible through other means. +POSIX.1 for example defined the open(), read(), write() and close() functions, +too, which traditionally have been part of PHP 3 for a long time. Some more +system specific functions have not been available before, though, and this +module tries to remedy this by providing easy access to these functions. + +%package pspell +Summary: Pspell extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description pspell +This is a dynamic shared object (DSO) for PHP that will add pspell support to +PHP. + +These functions allow you to check the spelling of a word and offer +suggestions. + +%package readline +Summary: Readline extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description readline +This PHP module adds support for readline functions (only for cli and cgi +SAPIs). + +The readline() functions implement an interface to the GNU Readline library. +These are functions that provide editable command lines. An example being the +way Bash allows you to use the arrow keys to insert characters or scroll +through command history. Because of the interactive nature of this library, it +will be of little use for writing Web applications, but may be useful when +writing scripts used from a command line. + +%package recode +Summary: Recode extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description recode +This is a dynamic shared object (DSO) for PHP that will add recode support +using the recode library. + +This module contains an interface to the GNU Recode library. The GNU Recode +library converts files between various coded character sets and surface +encodings. When this cannot be achieved exactly, it may get rid of the +offending characters or fall back on approximations. The library recognises or +produces nearly 150 different character sets and is able to convert files +between almost any pair. Most RFC 1345 character sets are supported. + +%package session +Summary: Session extension module for PHP +Group: Development/PHP +Requires(pre): user(apache) +Requires(pre): group(apache) +Requires: %{libname} >= %{EVRD} + +%description session +This is a dynamic shared object (DSO) for PHP that will add session support. + +Session support in PHP consists of a way to preserve certain data across +subsequent accesses. This enables you to build more customized applications and +increase the appeal of your web site. + +A visitor accessing your web site is assigned a unique id, the so-called +session id. This is either stored in a cookie on the user side or is propagated +in the URL. + +%package shmop +Summary: Shared Memory Operations extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description shmop +This is a dynamic shared object (DSO) for PHP that will add Shared Memory +Operations support. + +Shmop is an easy to use set of functions that allows PHP to read, write, create +and delete Unix shared memory segments. + +%package snmp +Summary: NET-SNMP extension module for PHP +Group: Development/PHP +Requires: net-snmp-mibs +Requires: %{libname} >= %{EVRD} + +%description snmp +This is a dynamic shared object (DSO) for PHP that will add SNMP support using +the NET-SNMP libraries. + +In order to use the SNMP functions you need to install the NET-SNMP package. + +%package soap +Summary: Soap extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description soap +This is a dynamic shared object (DSO) for PHP that will add soap support. + +The SOAP extension can be used to write SOAP Servers and Clients. It supports +subsets of SOAP 1.1, SOAP 1.2 and WSDL 1.1 specifications. + +%package sockets +Summary: Sockets extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description sockets +This is a dynamic shared object (DSO) for PHP that will add sockets support. + +The socket extension implements a low-level interface to the socket +communication functions based on the popular BSD sockets, providing the +possibility to act as a socket server as well as a client. + +%package sqlite3 +Summary: SQLite database bindings for PHP +Group: Development/PHP +Requires: %{name}-pdo >= %{EVRD} +Requires: %{libname} >= %{EVRD} +Obsoletes: %name-sqlite < %{EVRD} + +%description sqlite3 +This is an extension for the SQLite Embeddable SQL Database Engine. SQLite is a +C library that implements an embeddable SQL database engine. Programs that link +with the SQLite library can have SQL database access without running a separate +RDBMS process. + +SQLite is not a client library used to connect to a big database server. SQLite +is the server. The SQLite library reads and writes directly to and from the +database files on disk. + +%package sysvmsg +Summary: SysV msg extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description sysvmsg +This is a dynamic shared object (DSO) for PHP that will add SysV message queues +support. + +%package sysvsem +Summary: SysV sem extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description sysvsem +This is a dynamic shared object (DSO) for PHP that will add SysV semaphores +support. + +%package sysvshm +Summary: SysV shm extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description sysvshm +This is a dynamic shared object (DSO) for PHP that will add SysV Shared Memory +support. + +%package tidy +Summary: Tidy HTML Repairing and Parsing for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description tidy +Tidy is a binding for the Tidy HTML clean and repair utility which allows you +to not only clean and otherwise manipluate HTML documents, but also traverse +the document tree using the Zend Engine 2 OO semantics. + +%package tokenizer +Summary: Tokenizer extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description tokenizer +This is a dynamic shared object (DSO) for PHP that will add Tokenizer support. + +The tokenizer functions provide an interface to the PHP tokenizer embedded in +the Zend Engine. Using these functions you may write your own PHP source +analyzing or modification tools without having to deal with the language +specification at the lexical level. + +%package xml +Summary: XML extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description xml +This is a dynamic shared object (DSO) for PHP that will add XML support. This +extension lets you create XML parsers and then define handlers for different +XML events. + +%package xmlreader +Summary: Xmlreader extension module for PHP +Group: Development/PHP +Requires: %{name}-dom +Requires: %{libname} >= %{EVRD} + +%description xmlreader +XMLReader represents a reader that provides non-cached, forward-only access to +XML data. It is based upon the xmlTextReader api from libxml + +%package xmlrpc +Summary: Xmlrpc extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description xmlrpc +This is a dynamic shared object (DSO) for PHP that will add XMLRPC support. + +These functions can be used to write XML-RPC servers and clients. You can find +more information about XML-RPC at http://www.xmlrpc.com/, and more +documentation on this extension and its functions at +http://xmlrpc-epi.sourceforge.net/. + +%package xmlwriter +Summary: Provides fast, non-cached, forward-only means to write XML data +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description xmlwriter +This extension wraps the libxml xmlWriter API. Represents a writer that +provides a non-cached, forward-only means of generating streams or files +containing XML data. + +%package xsl +Summary: Xsl extension module for PHP +Group: Development/PHP +Requires: %{libname} >= %{EVRD} + +%description xsl +This is a dynamic shared object (DSO) for PHP that will add xsl support. + +The XSL extension implements the XSL standard, performing XSLT transformations +using the libxslt library + +%package zip +Summary: A zip management extension for PHP +Group: Development/PHP + +%description zip +This is a dynamic shared object (DSO) for PHP that will add zip support to +create and read zip files using the libzip library. + +%package fpm +Summary: PHP7 FastCGI Process Manager +Group: Development/Other +Requires: %{libname} >= %{EVRD} +Requires: %{name}-ctype >= %{EVRD} +Requires: %{name}-filter >= %{EVRD} +#Requires: %{name}-ftp >= %{EVRD} +Requires: %{name}-gettext >= %{EVRD} +Requires: %{name}-ini >= %{version} +Requires: %{name}-json >= %{EVRD} +Requires: %{name}-openssl >= %{EVRD} +Requires: %{name}-posix >= %{EVRD} +Requires: %{name}-session >= %{EVRD} +# Suggests: %{name}-suhosin >= 0.9.33 +Requires: %{name}-sysvsem >= %{EVRD} +Requires: %{name}-sysvshm >= %{EVRD} +Requires: %{name}-timezonedb >= 3:2009.10 +Requires: %{name}-tokenizer >= %{EVRD} +Requires: %{name}-xmlreader >= %{EVRD} +Requires: %{name}-xmlwriter >= %{EVRD} +Requires: %{name}-zlib >= %{EVRD} +Requires: %{name}-xml >= %{EVRD} +Requires(pre): user(apache) +Requires(pre): group(apache) +%if %{mdvver} >= 202310 +Requires(post): /usr/bin/systemd-tmpfiles +%else +Requires(post): /bin/systemd-tmpfiles +%endif +Provides: %{name} = %{EVRD} + +%description fpm +PHP7 is an HTML-embeddable scripting language. PHP7 offers built-in database +integration for several commercial and non-commercial database management +systems, so writing a database-enabled script with PHP7 is fairly simple. The +most common use of PHP7 coding is probably as a replacement for CGI scripts. + +This package contains the FastCGI Process Manager. You must also install +libphp7_common. + +%package -n apache-mod_php +Summary: The PHP HTML-embedded scripting language for use with apache +Group: System/Servers +Requires: %{libname} = %{EVRD} +Requires: apache-base >= 2.4.0 +Requires: apache-modules >= 2.4.0 +Requires: apache-mpm >= 2.4.0 +Requires: %{name}-ctype = %{EVRD} +Requires: %{name}-filter = %{EVRD} +#Requires: %{name}-ftp = %{EVRD} +Requires: %{name}-gettext = %{EVRD} +Requires: %{name}-ini >= %{version} +Requires: %{name}-json = %{EVRD} +Requires: %{name}-openssl = %{EVRD} +Requires: %{name}-pcre = %{EVRD} +Requires: %{name}-posix = %{EVRD} +Requires: %{name}-session = %{EVRD} +Requires: %{name}-sysvsem = %{EVRD} +Requires: %{name}-tokenizer = %{EVRD} +Requires: %{name}-xmlreader = %{EVRD} +Requires: %{name}-xmlwriter = %{EVRD} +Requires: %{name}-zlib = %{EVRD} +Requires: %{name}-xml = %{EVRD} +Requires: %{name}-timezonedb >= 3:2009.10 +# Suggests: %{name}-suhosin >= 0.9.29 +Conflicts: %{name}-suhosin < 0.9.29 +Conflicts: apache-mpm-worker >= 2.4.0 +# mod_php with the event mpm is not an recommended by php devs, but +# is (at least somewhat) working. Let's not do a hard conflict. +# Conflicts: apache-mpm-event >= 2.4.0 +Provides: mod_php = %{EVRD} +BuildRequires: dos2unix + +%description -n apache-mod_php +PHP7 is an HTML-embedded scripting language. PHP7 attempts to make it easy for +developers to write dynamically generated web pages. PHP7 also offers built-in +database integration for several commercial and non-commercial database +management systems, so writing a database-enabled web page with PHP7 is fairly +simple. The most common use of PHP coding is probably as a replacement for CGI +scripts. The %{name} module enables the apache web server to understand +and process the embedded PHP language in web pages. + +This package contains PHP version 7. You'll also need to install the apache web +server. + + +%package -n php-ini +Summary: INI files for PHP +Group: Development/Other + +%description -n php-ini +The php-ini package contains the ini file required for PHP. + + +%prep +export LC_ALL=en_US.utf-8 +export LANG=en_US.utf-8 +export LANGUAGE=en_US.utf-8 +export LANGUAGES=en_US.utf-8 +%setup -qn %{name}-%{version} + +# Safety check for API version change. +vapi=`sed -n '/#define PHP_API_VERSION/{s/.* //;p}' main/php.h` +if test "x${vapi}" != "x%{apiver}"; then + : Error: Upstream API version is now ${vapi}, expecting %{apiver}. + : Update the apiver macro and rebuild. + exit 1 +fi + +vzend=`sed -n '/#define ZEND_MODULE_API_NO/{s/^[^0-9]*//;p;}' Zend/zend_modules.h` +if test "x${vzend}" != "x%{zendver}"; then + : Error: Upstream Zend ABI version is now ${vzend}, expecting %{zendver}. + : Update the zendver macro and rebuild. + exit 1 +fi + +# Safety check for PDO ABI version change +vpdo=`sed -n '/#define PDO_DRIVER_API/{s/.*[ ]//;p}' ext/pdo/php_pdo_driver.h` +if test "x${vpdo}" != "x%{pdover}"; then + : Error: Upstream PDO ABI version is now ${vpdo}, expecting %{pdover}. + : Update the pdover macro and rebuild. + exit 1 +fi + +%if %{build_libmagic} +if ! [ -f %{_datadir}/misc/magic.mgc ]; then + echo "ERROR: the %{_datadir}/misc/magic.mgc file is needed" + exit 1 +fi +%endif + +# the ".droplet" suffix is here to nuke the backups later..., we don't want those in php-devel +# (same goes for the more common "~" suffix) + +%patch0 -p1 -b .libtool246~ +%patch1 -p1 -b .shared.droplet +%patch3 -p1 -b .missingsym~ +%patch4 -p1 -b .phpize~ +%patch5 -p1 -b .phpbuilddir.droplet +%patch6 -p1 -b .apache2-filters.droplet +%patch8 -p1 -b .xmlrpc_epi_header +%patch10 -p1 -b .compile~ +%patch11 -p1 -b .bdb-5.2.droplet +%patch12 -p1 -b .db60~ +%patch13 -p1 -b .clangwarn~ +%patch14 -p1 -b .0014~ + +##################################################################### +# Stolen from PLD +# FIXME needs porting +#patch20 -p1 -b .mail.droplet +%patch22 -p1 -b .dba-link.droplet +%patch23 -p1 -b .zlib-for-getimagesize.droplet +# for kolab2 +# FIXME needs porting +#patch27 -p1 -b .imap-annotation.droplet +#patch28 -p1 -b .imap-myrights.droplet +# fpm stuff +%patch29 -p1 -b .shared-fpm.droplet +%patch30 -p1 -b .fpmmdv.droplet + +##################################################################### +# stolen from debian +%patch50 -p1 -b .session.save_path.droplet + +##################################################################### +# Stolen from fedora +%patch102 -p1 -b .install.droplet +%patch105 -p1 -b .umask.droplet +%patch113 -p1 -b .libc-client-php.droplet +%patch114 -p1 -b .no_pam_in_c-client.droplet + +# upstream fixes +%patch121 -p0 -b .bug43221.droplet +%patch122 -p1 + +%patch127 -p1 +%patch128 -p1 + +%ifarch %{e2k} +%patch200 -p1 +%endif +%patch201 -p1 +%patch202 -p1 + +cp %{SOURCE2} maxlifetime +cp %{SOURCE3} php.crond +cp %{SOURCE4} php-fpm.service +cp %{SOURCE5} php-fpm.sysconf +cp %{SOURCE6} php-fpm.logrotate +cp %{SOURCE7} create_data_file.php + +# lib64 hack +perl -p -i -e "s|/usr/lib|%{_libdir}|" php.crond + +# nuke bogus checks becuase i fixed this years ago in our recode package +rm -f ext/recode/config9.m4 + +# Change perms otherwise rpm would get fooled while finding requires +find -name "*.inc" | xargs chmod 644 +find -name "*.php*" | xargs chmod 644 +find -name "*README*" | xargs chmod 644 + +# php7_module -> php_module to ease upgrades +find -type f |xargs sed -i -e 's,php7_module,php_module,g' +sed -i -e 's,APLOG_USE_MODULE(php7,APLOG_USE_MODULE(php,g' sapi/apache2handler/* + +mkdir -p php-devel/extensions +mkdir -p php-devel/sapi + +# Install test files in php-devel +cp -a tests php-devel + +cp -dpR ext/* php-devel/extensions/ +rm -f php-devel/extensions/informix/stub.c +rm -f php-devel/extensions/standard/.deps +rm -f php-devel/extensions/skeleton/EXPERIMENTAL + +# SAPI +cp -dpR sapi/* php-devel/sapi/ +rm -f php-devel/sapi/thttpd/stub.c +rm -f php-devel/sapi/cgi/php.sym +rm -f php-devel/sapi/fastcgi/php.sym +rm -f php-devel/sapi/pi3web/php.sym + +# cleanup +find php-devel -name "*.droplet" -o -name "*~" | xargs rm -f + +# don't ship MS Windows source +rm -rf php-devel/extensions/com_dotnet + +# likewise with these: +find php-devel -name "*.dsp" | xargs rm -f +find php-devel -name "*.mak" | xargs rm -f +find php-devel -name "*.w32" | xargs rm + +# maek sure using system libs +rm -rf ext/pcre/pcrelib +rm -rf ext/pdo_sqlite/sqlite +rm -rf ext/xmlrpc/libxmlrpc + +# Included ltmain.sh is obsolete and breaks lto +rm -f ltmain.sh +libtoolize --force +aclocal + +%build +%config_update +%serverbuild + +cp -f %{_datadir}/libtool/build-aux/config.* . + +# it does not work with -fPIE and someone added that to the serverbuild macro... +CFLAGS=`echo $CFLAGS|sed -e 's|-fPIE||g'` +CXXFLAGS=`echo $CXXFLAGS|sed -e 's|-fPIE||g'` + +#export CFLAGS="`echo ${CFLAGS} | sed s/O2/O0/` -fPIC -L%{_libdir} -fno-strict-aliasing" +export CFLAGS="${CFLAGS} -fPIC -L%{_libdir} -fno-strict-aliasing -Wno-incompatible-pointer-types" +export CXXFLAGS="${CFLAGS}" +export RPM_OPT_FLAGS="${CFLAGS}" + +cat > php-devel/buildext < ext/fileinfo/data_file.c +rm -rf ext/fileinfo/.libs ext/fileinfo/*.lo ext/fileinfo/*.la modules/fileinfo.so modules/fileinfo.la +cp -p ext/fileinfo/data_file.c php-devel/extensions/fileinfo/data_file.c +%make CXX=%{__cxx} PHPDBG_EXTRA_LIBS="-lreadline" +%endif + +# make php-cgi +cp -af php_config.h.cgi main/php_config.h +make -f Makefile.cgi sapi/cgi/php-cgi CXX=%{__cxx} PHPDBG_EXTRA_LIBS="-lreadline" +cp -af php_config.h.apxs main/php_config.h + +# make php-fpm +cp -af php_config.h.fpm main/php_config.h +make -f Makefile.fpm sapi/fpm/php-fpm CXX=%{__cxx} PHPDBG_EXTRA_LIBS="-lreadline" +cp -af php_config.h.apxs main/php_config.h + +# make apache-mod_php +mkdir mod_php +cd mod_php +cp -dpR ../php-devel/sapi/apache2handler/* . +cp ../main/internal_functions.c . +cp ../ext/date/lib/timelib_config.h . +mv mod_php7.c mod_php.c +find . -type f |xargs dos2unix +apxs \ + `apr-1-config --link-ld --libs` \ + `xml2-config --cflags` \ + -I. -I.. -I../main -I../Zend -I../TSRM \ + -L../libs -lphp7_common \ + -c mod_php.c sapi_apache2.c apache_config.c \ + php_functions.c internal_functions.c + +%install + +install -d %{buildroot}%{_libdir} +install -d %{buildroot}%{_bindir} +install -d %{buildroot}%{_sysconfdir}/php.d +install -d %{buildroot}%{_libdir}/php/extensions +install -d %{buildroot}%{_usrsrc}/php-devel +install -d %{buildroot}%{_mandir}/man1 +install -d %{buildroot}%{_sysconfdir}/cron.d +install -d %{buildroot}/var/lib/php + +make -f Makefile.apxs install \ + PHPDBG_EXTRA_LIBS="-lreadline" \ + INSTALL_ROOT=%{buildroot} \ + INSTALL_IT="\$(LIBTOOL) --mode=install install libphp7_common.la %{buildroot}%{_libdir}/" + +# borked autopoo +rm -f %{buildroot}%{_bindir}/php %{buildroot}%{_bindir}/php-cgi +./libtool --silent --mode=install install sapi/cli/php %{buildroot}%{_bindir}/php +./libtool --silent --mode=install install sapi/cgi/php-cgi %{buildroot}%{_bindir}/php-cgi + +# compat php-fcgi symink +ln -s php-cgi %{buildroot}%{_bindir}/php-fcgi + +cp -dpR php-devel/* %{buildroot}%{_usrsrc}/php-devel/ +install -m0644 run-tests*.php %{buildroot}%{_usrsrc}/php-devel/ +install -m0644 main/internal_functions.c %{buildroot}%{_usrsrc}/php-devel/ + +install -m0644 sapi/cli/php.1 %{buildroot}%{_mandir}/man1/ +install -m0644 scripts/man1/phpize.1 %{buildroot}%{_mandir}/man1/ +install -m0644 scripts/man1/php-config.1 %{buildroot}%{_mandir}/man1/ + +# fpm +install -d %{buildroot}%{_unitdir} +install -d %{buildroot}%{_sysconfdir}/logrotate.d +install -d %{buildroot}%{_sysconfdir}/sysconfig +install -d %{buildroot}%{_sysconfdir}/php-fpm.d +install -d %{buildroot}%{_sbindir} +install -d %{buildroot}%{_mandir}/man8 +install -d %{buildroot}/var/lib/php-fpm +install -d %{buildroot}/var/log/php-fpm +install -d %{buildroot}/run/php-fpm +install -D -p -m 0644 %{SOURCE9} %{buildroot}%{_tmpfilesdir}/php-fpm.conf +# a small bug here... +echo "; place your config here" > %{buildroot}%{_sysconfdir}/php-fpm.d/default.conf + +./libtool --silent --mode=install install sapi/fpm/php-fpm %{buildroot}%{_sbindir}/php-fpm +install -m0644 sapi/fpm/php-fpm.8 %{buildroot}%{_mandir}/man8/ +install -m0644 sapi/fpm/php-fpm.conf %{buildroot}%{_sysconfdir}/ +install -m0644 php-fpm.service %{buildroot}%{_unitdir}/ +install -m0644 php-fpm.sysconf %{buildroot}%{_sysconfdir}/sysconfig/php-fpm +install -m0644 php-fpm.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/php-fpm + +perl -pi -e "s|^pid.*|pid = /run/php-fpm/php-fpm.pid|g" %{buildroot}%{_sysconfdir}/php-fpm.conf + +ln -snf extensions %{buildroot}%{_usrsrc}/php-devel/ext + +# extensions +echo "extension = openssl.so" > %{buildroot}%{_sysconfdir}/php.d/21_openssl.ini +echo "extension = zlib.so" > %{buildroot}%{_sysconfdir}/php.d/21_zlib.ini +echo "extension = bcmath.so" > %{buildroot}%{_sysconfdir}/php.d/66_bcmath.ini +echo "extension = bz2.so" > %{buildroot}%{_sysconfdir}/php.d/10_bz2.ini +echo "extension = calendar.so" > %{buildroot}%{_sysconfdir}/php.d/11_calendar.ini +echo "extension = ctype.so" > %{buildroot}%{_sysconfdir}/php.d/12_ctype.ini +echo "extension = curl.so" > %{buildroot}%{_sysconfdir}/php.d/13_curl.ini +echo "extension = dba.so" > %{buildroot}%{_sysconfdir}/php.d/14_dba.ini +echo "extension = dom.so" > %{buildroot}%{_sysconfdir}/php.d/18_dom.ini +echo "extension = exif.so" > %{buildroot}%{_sysconfdir}/php.d/19_exif.ini +echo "extension = filter.so" > %{buildroot}%{_sysconfdir}/php.d/81_filter.ini +echo "extension = ftp.so" > %{buildroot}%{_sysconfdir}/php.d/22_ftp.ini +echo "extension = gd.so" > %{buildroot}%{_sysconfdir}/php.d/23_gd.ini +echo "extension = gettext.so" > %{buildroot}%{_sysconfdir}/php.d/24_gettext.ini +echo "extension = gmp.so" > %{buildroot}%{_sysconfdir}/php.d/25_gmp.ini +#echo "extension = hash.so" > %{buildroot}%{_sysconfdir}/php.d/54_hash.ini +echo "extension = iconv.so" > %{buildroot}%{_sysconfdir}/php.d/26_iconv.ini +echo "extension = imap.so" > %{buildroot}%{_sysconfdir}/php.d/27_imap.ini +echo "extension = intl.so" > %{buildroot}%{_sysconfdir}/php.d/27_intl.ini +echo "extension = ldap.so" > %{buildroot}%{_sysconfdir}/php.d/28_ldap.ini +echo "extension = mbstring.so" > %{buildroot}%{_sysconfdir}/php.d/29_mbstring.ini +echo "extension = fileinfo.so" > %{buildroot}%{_sysconfdir}/php.d/32_fileinfo.ini +# mysqlnd must be loaded before mysqli (undefined symbol: mysqlnd_global_stats) +echo "extension = mysqlnd.so" > %{buildroot}%{_sysconfdir}/php.d/36_mysqlnd.ini +echo "extension = mysqli.so" > %{buildroot}%{_sysconfdir}/php.d/37_mysqli.ini +echo "extension = enchant.so" > %{buildroot}%{_sysconfdir}/php.d/38_enchant.ini +echo "extension = odbc.so" > %{buildroot}%{_sysconfdir}/php.d/39_odbc.ini +echo "extension = pcntl.so" > %{buildroot}%{_sysconfdir}/php.d/40_pcntl.ini +echo "extension = pdo.so" > %{buildroot}%{_sysconfdir}/php.d/70_pdo.ini +echo "extension = pdo_dblib.so" > %{buildroot}%{_sysconfdir}/php.d/71_pdo_dblib.ini +echo "extension = pdo_mysql.so" > %{buildroot}%{_sysconfdir}/php.d/73_pdo_mysql.ini +echo "extension = pdo_odbc.so" > %{buildroot}%{_sysconfdir}/php.d/75_pdo_odbc.ini +echo "extension = pdo_pgsql.so" > %{buildroot}%{_sysconfdir}/php.d/76_pdo_pgsql.ini +echo "extension = pdo_sqlite.so" > %{buildroot}%{_sysconfdir}/php.d/77_pdo_sqlite.ini +echo "extension = pgsql.so" > %{buildroot}%{_sysconfdir}/php.d/42_pgsql.ini +echo "extension = posix.so" > %{buildroot}%{_sysconfdir}/php.d/43_posix.ini +echo "extension = pspell.so" > %{buildroot}%{_sysconfdir}/php.d/44_pspell.ini +echo "extension = readline.so" > %{buildroot}%{_sysconfdir}/php.d/45_readline.ini +#echo "extension = recode.so" > %{buildroot}%{_sysconfdir}/php.d/46_recode.ini +echo "extension = session.so" > %{buildroot}%{_sysconfdir}/php.d/47_session.ini +echo "extension = shmop.so" > %{buildroot}%{_sysconfdir}/php.d/48_shmop.ini +echo "extension = snmp.so" > %{buildroot}%{_sysconfdir}/php.d/50_snmp.ini +echo "extension = soap.so" > %{buildroot}%{_sysconfdir}/php.d/51_soap.ini +echo "extension = sockets.so" > %{buildroot}%{_sysconfdir}/php.d/52_sockets.ini +echo "extension = sodium.so" > %{buildroot}%{_sysconfdir}/php.d/85_sodium.ini +echo "extension = sqlite3.so" > %{buildroot}%{_sysconfdir}/php.d/78_sqlite3.ini +echo "extension = sysvmsg.so" > %{buildroot}%{_sysconfdir}/php.d/56_sysvmsg.ini +echo "extension = sysvsem.so" > %{buildroot}%{_sysconfdir}/php.d/57_sysvsem.ini +echo "extension = sysvshm.so" > %{buildroot}%{_sysconfdir}/php.d/58_sysvshm.ini +echo "extension = tidy.so" > %{buildroot}%{_sysconfdir}/php.d/59_tidy.ini +echo "extension = tokenizer.so" > %{buildroot}%{_sysconfdir}/php.d/60_tokenizer.ini +echo "extension = xml.so" > %{buildroot}%{_sysconfdir}/php.d/62_xml.ini +echo "extension = xmlreader.so" > %{buildroot}%{_sysconfdir}/php.d/63_xmlreader.ini +echo "extension = xmlrpc.so" > %{buildroot}%{_sysconfdir}/php.d/62_xmlrpc.ini +echo "extension = xmlwriter.so" > %{buildroot}%{_sysconfdir}/php.d/64_xmlwriter.ini +echo "extension = xsl.so" > %{buildroot}%{_sysconfdir}/php.d/63_xsl.ini +echo "extension = json.so" > %{buildroot}%{_sysconfdir}/php.d/82_json.ini +echo "extension = zip.so" > %{buildroot}%{_sysconfdir}/php.d/83_zip.ini +echo "extension = phar.so" > %{buildroot}%{_sysconfdir}/php.d/84_phar.ini +cat >%{buildroot}%{_sysconfdir}/php.d/85_opcache.ini <<"EOF" +zend_extension = %{_libdir}/php/extensions/opcache.so +opcache.memory_consumption=128 +opcache.interned_strings_buffer=8 +opcache.max_accelerated_files=4000 +opcache.revalidate_freq=60 +opcache.fast_shutdown=1 +opcache.enable_cli=1 +EOF + +install -m0755 maxlifetime %{buildroot}%{_libdir}/php/maxlifetime +install -m0644 php.crond %{buildroot}%{_sysconfdir}/cron.d/php + +# mod_php +install -d %{buildroot}%{_libdir}/apache +install -d %{buildroot}%{_sysconfdir}/httpd/modules.d +install -m 755 mod_php/.libs/*.so %{buildroot}%{_libdir}/apache/ + +cat > %{buildroot}%{_sysconfdir}/httpd/modules.d/170_mod_php.conf << EOF +LoadModule php_module %{_libdir}/apache/mod_php.so + +AddType application/x-httpd-php .php +AddType application/x-httpd-php .phtml +AddType application/x-httpd-php-source .phps + +DirectoryIndex index.php index.phtml +EOF + +# phar fixes +if [ -L %{buildroot}%{_bindir}/phar ]; then + rm -f %{buildroot}%{_bindir}/phar + mv %{buildroot}%{_bindir}/phar.phar %{buildroot}%{_bindir}/phar +fi + +# inis +install -d -m 755 %{buildroot}%{_sysconfdir}/php.d +install -d -m 755 %{buildroot}%{_libdir}/php/extensions +install -d -m 755 %{buildroot}%{_datadir}/php + +sed -e 's,/usr/lib,%{_libdir},g' %{SOURCE10} >%{buildroot}%{_sysconfdir}/php.ini +cp %{buildroot}%{_sysconfdir}/php.ini %{buildroot}%{_sysconfdir}/php-cgi-fcgi.ini + +# house cleaning +rm -f %{buildroot}%{_bindir}/pear +rm -f %{buildroot}%{_libdir}/*.*a + +# don't pack useless stuff +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/bcmath +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/bz2 +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/calendar +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/ctype +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/curl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/dba +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/dom +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/enchant +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/ereg +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/exif +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/fileinfo +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/filter +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/ftp +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/gettext +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/gmp +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/hash +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/iconv +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/imap +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/intl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/json +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/ldap +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/libxml +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/mbstring +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/mysql +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/mysqli +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/mysqlnd +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/odbc +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/openssl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pcntl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pcre +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo_dblib +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo_mysql +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo_odbc +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo_pgsql +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pdo_sqlite +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pgsql +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/phar +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/posix +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/pspell +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/readline +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/recode +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/shmop +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/snmp +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/soap +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sockets +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/spl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sqlite +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sqlite3 +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/standard +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sysvmsg +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sysvsem +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/sysvshm +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/tidy +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/tokenizer +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/xml +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/xmlreader +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/xmlrpc +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/xmlwriter +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/xsl +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/zip +rm -rf %{buildroot}%{_usrsrc}/php-devel/extensions/zlib + +# php-devel.i586: E: zero-length /usr/src/php-devel/extensions/pdo_firebird/EXPERIMENTAL +find %{buildroot}%{_usrsrc}/php-devel -type f -size 0 -exec rm -f {} \; + +mkdir -p %{buildroot}%{_sysconfdir}/rpm/macros.d/ + +# Install the macros file: +sed -e "s/@PHP_APIVER@/%{apiver}/" \ + -e "s/@PHP_ZENDVER@/%{zendver}/g" \ + -e "s/@PHP_PDOVER@/%{pdover}/" \ + -e "s/@PHP_VERSION@/%{version}/" \ + < %{SOURCE1} > macros.php +%install_macro %{name} macros.php + +# update libtool.m4 file +cp -f %{_datadir}/aclocal/libtool.m4 %{buildroot}%{_libdir}/php/build +cat %{_datadir}/aclocal/ltoptions.m4 %{_datadir}/aclocal/ltversion.m4 \ + %{_datadir}/aclocal/ltsugar.m4 %{_datadir}/aclocal/lt~obsolete.m4 >> %{buildroot}%{_libdir}/php/build/libtool.m4 + +%if %{build_test} +# do a make test +export NO_INTERACTION=1 +export PHPRC="." +export REPORT_EXIT_STATUS=2 +export TEST_PHP_DETAILED=0 +export TEST_PHP_ERROR_STYLE=EMACS +export TEST_PHP_LOG_FORMAT=LEODC +export PHP_INI_SCAN_DIR=/dev/null + +# FAILING TESTS: +# unknown errors with ext/date/tests/oo_002.phpt probably because of php-5.2.5-systzdata.patch +# http://bugs.php.net/bug.php?id=22414 (claimed to be fixed in 2003, but seems not) +# unknown errors with ext/standard/tests/general_functions/phpinfo.phpt +# unknown errors with ext/standard/tests/strings/setlocale_* +disable_tests="ext/date/tests/oo_002.phpt \ +ext/standard/tests/file/bug22414.phpt \ +ext/standard/tests/general_functions/phpinfo.phpt \ +ext/standard/tests/strings/setlocale_basic1.phpt \ +ext/standard/tests/strings/setlocale_basic2.phpt \ +ext/standard/tests/strings/setlocale_basic3.phpt \ +ext/standard/tests/strings/setlocale_variation1.phpt \ +ext/standard/tests/strings/setlocale_variation3.phpt \ +ext/standard/tests/strings/setlocale_variation4.phpt \ +ext/standard/tests/strings/setlocale_variation5.phpt" + +[[ -n "$disable_tests" ]] && \ +for f in $disable_tests; do + [[ -f "$f" ]] && mv $f $f.disabled +done + +cat >php-test.ini <>php-test.ini + ;; + xsl.so) + # Unresolved symbols, need fixing + ;; +# ctype.so|dom.so|openssl.so|ftp.so|zlib.so|gettext.so|posix.so|session.so|hash.so|sysvsem.so|sysvshm.so|tokenizer.so|xml.so|xmlreader.so|xmlwriter.so|filter.so|json.so) + # Apparently loaded by default without a need to mention them in the ini file +# ;; + *) + echo extension=$B >>php-test.ini + ;; + esac +done +cat >>php-test.ini <