diff options
author | Eugene Lamskoy | 2022-02-03 20:42:36 +0200 |
---|---|---|
committer | Eugene Lamskoy | 2022-02-03 20:42:36 +0200 |
commit | 022812fa41ddc6e6a2c665f7961eade3c4ffe846 (patch) | |
tree | 59120ae4cfd6726ad5a461347728101f0b540f58 | |
parent | cdeefa925911841f044d9f551f03694877f25b9a (diff) | |
download | aur-022812fa41ddc6e6a2c665f7961eade3c4ffe846.tar.gz |
new version
-rw-r--r-- | .SRCINFO | 508 | ||||
-rw-r--r-- | PKGBUILD | 1732 | ||||
-rw-r--r-- | apache.conf | 13 | ||||
-rw-r--r-- | apache.patch | 20 | ||||
-rw-r--r-- | debian-php-7.1.33.patch | 1890 | ||||
-rw-r--r-- | enchant-2.patch | 84 | ||||
-rw-r--r-- | fpm-numeric-uid-gid.patch | 52 | ||||
-rw-r--r-- | fpm-reload-sighup.patch | 57 | ||||
-rw-r--r-- | freetype2.patch | 100 | ||||
-rw-r--r-- | mysql-socket-php7.1.patch | 26 | ||||
-rw-r--r-- | pear-config-patcher.php | 42 | ||||
-rw-r--r-- | php-apache.conf | 13 | ||||
-rw-r--r-- | php-enchant-depr.patch | 38 | ||||
-rw-r--r-- | php-enchant-php5.3.patch | 23 | ||||
-rw-r--r-- | php-fpm.install | 31 | ||||
-rw-r--r-- | php-fpm.patch | 76 | ||||
-rw-r--r-- | php-fpm.tmpfiles | 1 | ||||
-rw-r--r-- | php-freetype-2.9.1.patch | 50 | ||||
-rw-r--r-- | php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch | 303 | ||||
-rw-r--r-- | php-icu-1101-Simplify-namespace-access.patch | 307 | ||||
-rw-r--r-- | php-icu-php5.5.patch | 40 | ||||
-rw-r--r-- | php-makefile-patcher.php | 47 | ||||
-rw-r--r-- | php-phpinfo.patch | 22 | ||||
-rw-r--r-- | php.ini.patch | 89 | ||||
-rw-r--r-- | php71-phar-names.patch | 17 | ||||
-rw-r--r-- | recode-php5.3.patch | 10 | ||||
-rw-r--r-- | timezonedb-guess.patch | 27 | ||||
-rw-r--r-- | timezonedb-php7.1.patch | 650 |
28 files changed, 4823 insertions, 1445 deletions
@@ -1,175 +1,435 @@ +# Generated by makepkg 6.0.1 +# Thu Feb 3 18:42:06 UTC 2022 pkgbase = php71 - pkgdesc = A general-purpose scripting language that is especially suited to web development (old stable 7.0 series) + pkgdesc = PHP 7.1.33 compiled as to not conflict with mainline php pkgver = 7.1.33 - pkgrel = 1 + pkgrel = 7 url = http://www.php.net - arch = i686 arch = x86_64 license = PHP + checkdepends = procps-ng + checkdepends = smtp-forwarder + makedepends = acl + makedepends = libtool + makedepends = autoconf + makedepends = automake + makedepends = patchelf + makedepends = gawk + makedepends = sed + makedepends = bash + makedepends = python + makedepends = libxml2 + makedepends = pam + makedepends = krb5 + makedepends = zlib + makedepends = libedit + makedepends = smtp-forwarder + makedepends = pcre makedepends = apache - makedepends = aspell - makedepends = db - makedepends = enchant - makedepends = gd - makedepends = gmp - makedepends = icu - makedepends = libmcrypt + makedepends = ncurses + makedepends = libxcrypt + makedepends = systemd + makedepends = systemd-libs + makedepends = coreutils + makedepends = findutils makedepends = libxslt - makedepends = libzip - makedepends = net-snmp + makedepends = openssl + makedepends = e2fsprogs + makedepends = db makedepends = postgresql-libs + makedepends = unixodbc + makedepends = libfbclient + makedepends = libfbclient + makedepends = freetds makedepends = sqlite - makedepends = systemd + makedepends = libvpx + makedepends = gd makedepends = tidy - makedepends = unixodbc + makedepends = gmp + makedepends = libzip + makedepends = recode + makedepends = aspell + makedepends = enchant + makedepends = libvoikko + makedepends = hspell + makedepends = hunspell + makedepends = nuspell + makedepends = aspell + makedepends = icu makedepends = curl - makedepends = libtool - makedepends = postfix - makedepends = freetds - makedepends = pcre + makedepends = net-snmp + makedepends = libsasl + makedepends = libldap makedepends = c-client - makedepends = tidyhtml + makedepends = pam + makedepends = libmcrypt + options = !lto + source = pear-config-patcher.php + source = php-makefile-patcher.php + source = php-apache.conf source = https://php.net/distributions/php-7.1.33.tar.xz - source = https://php.net/distributions/php-7.1.33.tar.xz.asc - source = apache.patch - source = apache.conf - source = enchant-2.patch - source = freetype2.patch - source = php-fpm.patch - source = php-fpm.tmpfiles - source = php.ini.patch - source = php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch - source = php-icu-1101-Simplify-namespace-access.patch - validpgpkeys = A917B1ECDA84AEC2B568FED6F50ABC807BD5DCD0 - validpgpkeys = 528995BFEDFBA7191D46839EF9BA0ADA31CBD89E - validpgpkeys = 1729F83938DA44E27BA0F4D3DBDB397470D12172 - sha512sums = ed37a79e3402c767f20e55c1cbe27957cc78240eafc719fffccd7d29ae10a45112aa0f29082f56133cd9c25f2750e9e57246d95b4f38d766f49bd29d1397eb1d - sha512sums = 022d1fc374dce70209a266b512fbfd2b817a160475d298c970abbd7d9a79be36eb995a9519bbf142f4878df74b29c006c76b589114ebc455de0f3cd07b84f375 - sha512sums = f5e5431993c2e0c1806c4edf392030d0b605f4b3c4cebec036e810ff771b2327983f347221735673506e2c91ce2e18ad37ab7600261b684fe29491206171b4f3 - sha512sums = 30cdc281c6e288cf8a0bf58a0ad74ad5b4e8205d2b0b6ab465fad97d810f7bfae4581ad836712998e834d2e90d38cacd22f19bb01e77fc4c9d200d95613fc669 - sha512sums = 2d5f3aa71ce7d8da43f0f683f81b06258e3a0d95df4807a8acac91ff89fbe60484ef97856a908bce625b1610d0004767a6a8c622246086afe2f2d464977088b5 - sha512sums = a664b69aea8c21c50c852f918515d9fe1a931d7f88ec77ec86a20810266515745430d89513ee2e0bb301a29f1fc7ab0d2634076830b4da8ea1e47467fb658678 - sha512sums = a23e13180449ace0cfe07e19043615ca7e1dbf254fd24f2446cd2d824728430258ec4140325508169480eaec950ad4737b673417bd70e0f9d4538f1ab3b98816 - sha512sums = 48a97ab0cedd92539b8fe4c82e59312b563a73a8ca537b5a1b2091bfd287f255e94a32c2e5398ccfa7248ef322275a15a4edb817bad6ccf430c79d2f9c5cf0e9 - sha512sums = b6ff1c8575c7564ede17ec8c959141a065a9c4e3cba059a1138b9ecc85f23632d7e5980d65742f7fc1ce404ce613f7abb2f5f7a45039d606c9c590ccf3a2301d - sha512sums = 70c859feff58650ff4a291b1725bce8f290ac6d92cacc4420d3ead5cbbdbcf567cd0ed4d79fdd8b0435cf6833f7b50fff798b2fae274c5fb1bb37a0984a45f9d - sha512sums = 33d40f3ae500cf583519ecfa271e36d727c38ff4ea9547d3d2c4d51c9fadd317ed614a048077ebdb116e3c84c11db95e6455cdfc80d092d217d070c98af56525 + source = php71-phar-names.patch + source = fpm-numeric-uid-gid.patch + source = fpm-reload-sighup.patch + source = mysql-socket-php7.1.patch + source = php-enchant-php5.3.patch + source = php-enchant-depr.patch + source = php-freetype-2.9.1.patch + source = php-icu-php5.5.patch + source = recode-php5.3.patch + source = debian-php-7.1.33.patch + source = php-phpinfo.patch + source = timezonedb-guess.patch + source = timezonedb-php7.1.patch + sha256sums = 0b7e98dca9c996ec10cb9b3f6296bb7547c68797fd5f35006fdfd3e97700672d + sha256sums = ba72fc64f77822755a469314160d5889d5298f4eb5758dd7939dac9b811afe52 + sha256sums = 6d0ad9becb5470ce8e5929d7d45660b0f32579038978496317544c5310281a91 + sha256sums = bd7c0a9bd5433289ee01fd440af3715309faf583f75832b64fe169c100d52968 + sha256sums = ee6529d441b2446d784e80aba23aa956541e541bd73ad54aee480d4a1a6117ca + sha256sums = d175f0c14fdb22855090c93f76e18f04320d7bf15afc057ffde947f9bb361242 + sha256sums = f5ae925036744a5e88cea2698879aea0498e1e23aee7801923d90f16be383908 + sha256sums = 0a3a6e8ff04ff1e0869befcf2c7bca4e886d94065da6d7a10b809a4750b961a0 + sha256sums = 52c5a93fb03fa8f3f99438eb803b3182766ee04e0e6b76f00b0bc848d03ff6a6 + sha256sums = 3049b76460c65a70017ba2aac8f8c45725df2bbea458a96ec7164db63639e87f + sha256sums = e07ebf146cea8e734c7704ba94f18279642df2b2f09d868781746d165041b8d5 + sha256sums = ed3184d5a6f7a3bf35ee32169f8dc3b6cba09c38f60e868e24652fe9a7dd844d + sha256sums = c9f3b0dff07a7e9688f60b92a2a15817bd7cd59a8c5278cae629d856be66de5c + sha256sums = 884b78ca63db5d8998e2e414b3e9e2a215e95890cf4a460fd7206aa9dd3db6ec + sha256sums = 558e780e93dfa861a366c49b4d156d8fc43f17898f001ae6033ec63c33d5d41c + sha256sums = 40bcc1e5058602302198d0925e431495391d8469499593af477f59d84d32f764 + sha256sums = 68350399aa196592e1d328deb48068c4b011b6f95cdd90299602c48c82af379d pkgname = php71 - pkgdesc = A general-purpose scripting language that is especially suited to web development - depends = libxml2 - depends = curl - depends = libzip + pkgdesc = PHP. A general-purpose scripting language that is especially suited to web development + depends = zlib depends = pcre - provides = php=7.1.33 + depends = libedit backup = etc/php71/php.ini -pkgname = php71-cgi - pkgdesc = CGI and FCGI SAPI for PHP - depends = php71 - provides = php-cgi=7.1.33 +pkgname = php71-cli + pkgdesc = cli (command-line executable) version for php71 + depends = php71=7.1.33 + depends = libxml2 + depends = pcre2 + depends = libedit + backup = etc/php71/php.ini -pkgname = php71-apache - pkgdesc = Apache SAPI for PHP - depends = php71 - depends = apache - backup = etc/httpd/conf/extra/php71_module.conf +pkgname = php71-cgi + pkgdesc = CGI and FCGI SAPI for php71 + depends = php71=7.1.33 + depends = libxml2 + depends = pcre2 + depends = libedit + backup = etc/php71/php.ini pkgname = php71-fpm - pkgdesc = FastCGI Process Manager for PHP - depends = php71 - depends = systemd + pkgdesc = FastCGI Process Manager for php71 + install = php-fpm.install + depends = php71=7.1.33 + depends = systemd-libs + depends = acl + depends = libxml2 + depends = pcre2 + depends = libedit options = !emptydirs backup = etc/php71/php-fpm.conf - backup = etc/php71/php-fpm.d/php-fpm.conf + backup = etc/php71/php-fpm.d/www.conf + backup = etc/php71/php.ini pkgname = php71-embed - pkgdesc = Embedded PHP SAPI library - depends = php71 - provides = php71-embed=7.1.33 + pkgdesc = Embedded PHP SAPI library for php71 + depends = php71=7.1.33 + depends = ncurses + depends = systemd-libs + depends = libxcrypt + depends = acl + depends = ncurses + depends = libxml2 + depends = pcre2 + depends = libedit options = !emptydirs + backup = etc/php71/php.ini + +pkgname = php71-apache + pkgdesc = Apache SAPI for php71 + depends = php71=7.1.33 + depends = apache + depends = libxml2 + depends = pcre2 + depends = libedit + depends = libxcrypt + depends = ncurses + backup = etc/httpd/conf/extra/ + backup = etc/php71/php.ini + +pkgname = php71-pear + pkgdesc = PHP Extension and Application Repository (PEAR) for php71 + depends = php71=7.1.33 + depends = php71-xml=7.1.33 + depends = php71-cli=7.1.33 + depends = php71-phar=7.1.33 + +pkgname = php71-pecl + pkgdesc = PHP Extension Community Library (PECL) for php71 + depends = php71-pear=7.1.33 pkgname = php71-phpdbg - pkgdesc = Interactive PHP debugger - depends = php71 - provides = php71-phpdbg=7.1.33 + pkgdesc = Interactive PHP debugger for php71 () + depends = php71=7.1.33 + depends = libxml2 + depends = pcre2 + depends = libedit options = !emptydirs + backup = etc/php71/php.ini + +pkgname = php71-xml + pkgdesc = xml modules for php71 + depends = php71=7.1.33 + depends = libxml2 + +pkgname = php71-xsl + pkgdesc = xsl module for php71 + depends = php71-xml=7.1.33 + depends = php71-dom=7.1.33 + depends = libxslt + +pkgname = php71-xmlreader + pkgdesc = xmlreader module for php71 + depends = php71-xml=7.1.33 + +pkgname = php71-xmlwriter + pkgdesc = xmlwriter module for php71 + depends = php71-xml=7.1.33 + +pkgname = php71-wddx + pkgdesc = wddx module for php71 + depends = php71-xml=7.1.33 + +pkgname = php71-dom + pkgdesc = dom module for php71 + depends = php71-xml=7.1.33 + +pkgname = php71-simplexml + pkgdesc = simplexml module for php71 + depends = php71-xml=7.1.33 + +pkgname = php71-pdo + pkgdesc = pdo module for php71 + depends = php71=7.1.33 + +pkgname = php71-mysql + pkgdesc = MySQL modules for php71 + depends = php71=7.1.33 + depends = php71-pdo=7.1.33 + +pkgname = php71-phar + pkgdesc = phar module for php71 + depends = php71=7.1.33 + +pkgname = php71-pcntl + pkgdesc = pcntl module for php71 + depends = php71=7.1.33 + +pkgname = php71-posix + pkgdesc = posix module for php71 + depends = php71=7.1.33 + +pkgname = php71-shmop + pkgdesc = shmop module for php71 + depends = php71=7.1.33 + +pkgname = php71-sockets + pkgdesc = sockets module for php71 + depends = php71=7.1.33 + +pkgname = php71-sysvmsg + pkgdesc = sysvmsg module for php71 + depends = php71=7.1.33 + +pkgname = php71-sysvsem + pkgdesc = sysvsem module for php71 + depends = php71=7.1.33 + +pkgname = php71-sysvshm + pkgdesc = sysvshm module for php71 + depends = php71=7.1.33 + +pkgname = php71-tokenizer + pkgdesc = tokenizer module for php71 + depends = php71=7.1.33 + +pkgname = php71-dba + pkgdesc = dba module for php71 + depends = php71=7.1.33 + depends = db + +pkgname = php71-pgsql + pkgdesc = PostgreSQL modules for php71 + depends = php71=7.1.33 + depends = postgresql-libs + depends = php71-pdo=7.1.33 + +pkgname = php71-odbc + pkgdesc = ODBC modules for php71 + depends = php71=7.1.33 + depends = unixodbc + depends = php71-pdo=7.1.33 + +pkgname = php71-firebird + pkgdesc = pdo_firebird module for php71 + depends = php71=7.1.33 + depends = libfbclient + depends = php71-pdo=7.1.33 + +pkgname = php71-interbase + pkgdesc = interbase module for php71 + depends = php71=7.1.33 + depends = libfbclient pkgname = php71-dblib - pkgdesc = dblib module for PHP - depends = php71 - provides = php71-dblib=7.1.33 + pkgdesc = pdo_dblib module for php71 + depends = php71=7.1.33 + depends = freetds -pkgname = php71-enchant - pkgdesc = enchant module for PHP - depends = php71 - depends = enchant - provides = php71-enchant=7.1.33 +pkgname = php71-sqlite + pkgdesc = sqlite module for php71 + depends = php71=7.1.33 + depends = sqlite + depends = php71-pdo=7.1.33 pkgname = php71-gd - pkgdesc = gd module for PHP - depends = php71 + pkgdesc = gd module for php71 + depends = php71=7.1.33 depends = gd - provides = php71-gd=7.1.33 + depends = libvpx -pkgname = php71-imap - pkgdesc = imap module for PHP - depends = php71 - depends = c-client - provides = php71-imap=7.1.33 +pkgname = php71-exif + pkgdesc = exif module for php71 + depends = php71=7.1.33 -pkgname = php71-intl - pkgdesc = intl module for PHP - depends = php71 - depends = icu - provides = php71-intl=7.1.33 +pkgname = php71-tidy + pkgdesc = tidy module for php71 + depends = php71=7.1.33 + depends = tidy -pkgname = php71-mcrypt - pkgdesc = mcrypt module for PHP - depends = php71 - depends = libmcrypt - depends = libltdl - provides = php71-mcrypt=7.1.33 +pkgname = php71-iconv + pkgdesc = iconv module for php71 + depends = php71=7.1.33 -pkgname = php71-odbc - pkgdesc = ODBC modules for PHP - depends = php71 - depends = unixodbc - provides = php71-odbc=7.1.33 +pkgname = php71-xmlrpc + pkgdesc = xmlrpc module for php71 + depends = php71=7.1.33 + depends = libxml2 -pkgname = php71-pgsql - pkgdesc = PostgreSQL modules for PHP +pkgname = php71-bcmath + pkgdesc = bcmath module for php71 depends = php71 - depends = postgresql-libs - provides = php71-pgsql=7.1.33 + +pkgname = php71-gmp + pkgdesc = gmp module for php71 + depends = php71=7.1.33 + depends = gmp + +pkgname = php71-zip + pkgdesc = zip module for php71 + depends = php71=7.1.33 + depends = libzip + +pkgname = php71-bz2 + pkgdesc = bz2 module for php71 + depends = php71=7.1.33 + depends = bzip2 + +pkgname = php71-json + pkgdesc = json module for php71 + depends = php71=7.1.33 + +pkgname = php71-fileinfo + pkgdesc = fileinfo module for php71 + depends = php71=7.1.33 + +pkgname = php71-ctype + pkgdesc = ctype module for php71 + depends = php71=7.1.33 + +pkgname = php71-recode + pkgdesc = recode module for php71 + depends = php71=7.1.33 + depends = recode + +pkgname = php71-mbstring + pkgdesc = mbstring module for php71 + depends = php71=7.1.33 pkgname = php71-pspell - pkgdesc = pspell module for PHP - depends = php71 + pkgdesc = pspell module for php71 + depends = php71=7.1.33 depends = aspell - provides = php71-pspell=7.1.33 + +pkgname = php71-enchant + pkgdesc = enchant module for php71 + depends = php71=7.1.33 + depends = enchant + depends = libvoikko + depends = hspell + depends = hunspell + depends = nuspell + depends = aspell + +pkgname = php71-intl + pkgdesc = intl module for php71 + depends = php71=7.1.33 + depends = icu + +pkgname = php71-calendar + pkgdesc = calendar module for php71 + depends = php71=7.1.33 + +pkgname = php71-gettext + pkgdesc = gettext module for php71 + depends = php71=7.1.33 + +pkgname = php71-soap + pkgdesc = soap module for php71 + depends = php71=7.1.33 + depends = libxml2 + +pkgname = php71-ftp + pkgdesc = FTP module for php71 + depends = php71=7.1.33 + depends = openssl + +pkgname = php71-curl + pkgdesc = curl module for php71 + depends = php71=7.1.33 + depends = curl pkgname = php71-snmp - pkgdesc = snmp module for PHP - depends = php71 + pkgdesc = snmp module for php71 + depends = php71=7.1.33 depends = net-snmp - provides = php71-snmp=7.1.33 + depends = openssl -pkgname = php71-sqlite - pkgdesc = sqlite module for PHP - depends = php71 - depends = sqlite - provides = php71-sqlite=7.1.33 +pkgname = php71-ldap + pkgdesc = ldap module for php71 + depends = php71=7.1.33 + depends = libldap + depends = libsasl -pkgname = php71-tidy - pkgdesc = tidy module for PHP - depends = php71 - depends = tidyhtml - provides = php71-tidy=7.1.33 +pkgname = php71-imap + pkgdesc = imap module for php71 + depends = php71=7.1.33 + depends = pam + depends = krb5 + depends = c-client + depends = libxcrypt + depends = openssl -pkgname = php71-xsl - pkgdesc = xsl module for PHP - depends = php71 - depends = libxslt - provides = php71-xsl=7.1.33 +pkgname = php71-mcrypt + pkgdesc = mcrypt module for php71 + depends = php71=7.1.33 + depends = libmcrypt +pkgname = php71-opcache + pkgdesc = opcache zend module for php71 + depends = php71=7.1.33 @@ -1,434 +1,1510 @@ -# Maintainer: William Gathoye <william + aur at gathoye dot be> -# Maintainer: Maxwell Pray a.k.a. Synthead <synthead at gmail dot com> -# Contributor: Pierre Schmitz <pierre at archlinux dot de> -# Credit goes also to the maintainers and contributors of other PHP versions in -# AUR or official Arch Linux repositories. Specific patches might include code -# from other open source projects. In that case, credit is attributed in the -# specific commit. - -pkgbase=php71 -_pkgbase=${pkgbase%71} +############################################################################### +# Generated by arch-phpbs: https://github.com/lamskoy/arch-phpbs +# +# My packages on AUR: php81 php74 php72 php55 php54 +# Co-maintaining on AUR: php73 php71 php70 +# +# Thanks to: +# +# AUR php70 and php71 Co-maintainer: William Gathoye <william@gathoye.be> +# AUR php74 Co-maintainer: Tomasz Gruszka <tompear79@gmail.com> +# AUR php73 Co-maintainer: Matt Harrison <matt@harrison.us.com> +# AUR php73 Contirubutor: Pierre Schmitz <pierre@archlinux.de> +# AUR php55 Original maintainer: Raphaƫl Doursenaud <rdoursenaud@gmail.com> +############################################################################### +_phpbase="71" +_suffix="" +pkgver="7.1.33" +pkgrel="7" +pkgbase="php71" +pkgdesc="PHP 7.1.33 compiled as to not conflict with mainline php" +_cppflags=" -DU_USING_ICU_NAMESPACE=1 -DU_DEFINE_FALSE_AND_TRUE=1 " +_build_apache_cfg="etc/httpd/conf/extra" +_build_bundled_gd="0" +_build_conf_d="etc/php71/conf.d" +_build_fpm_name="php-fpm71" +_build_fpm_service_name="php71-fpm" +_build_icu_src_dir="icu/source" +_build_ini_per_sapi="0" +_build_mysql_socket="/run/mysqld/mysqld.sock" +_build_openssl_v10_patch="0" +_build_openssl_v11_patch="0" +_build_per_sapi="0" +_build_phpdbg="1" +_build_sapi_ini_apache="etc/php71" +_build_sapi_ini_cgi="etc/php71" +_build_sapi_ini_cli="etc/php71" +_build_sapi_ini_embed="etc/php71" +_build_sapi_ini_fpm="etc/php71" +_build_sapi_ini_phpdbg="etc/php71" +_build_shared_gd="1" +_build_shared_json="1" +_build_shared_libedit="0" +_build_shared_mysqlnd="1" +_build_shared_openssl="0" +_build_shared_pdo="1" +_build_system_timezonedb="1" +_build_update_sqlite="0" +_build_uses_argon="0" +_build_uses_lmdb="0" +_build_with_custom_icu="0" +_pkgver_icu="64-1" +_priority_default="20" +_priority_dom="16" +_priority_json="15" +_priority_mysqlnd="10" +_priority_opcache="10" +_priority_openssl="05" +_priority_pdo="10" +_priority_xml="15" +_suffix="" +_suffix_so="7" pkgname=( - "${pkgbase}" - "${pkgbase}-cgi" - "${pkgbase}-apache" - "${pkgbase}-fpm" - "${pkgbase}-embed" - "${pkgbase}-phpdbg" - "${pkgbase}-dblib" - "${pkgbase}-enchant" - "${pkgbase}-gd" - "${pkgbase}-imap" - "${pkgbase}-intl" - "${pkgbase}-mcrypt" - "${pkgbase}-odbc" - "${pkgbase}-pgsql" - "${pkgbase}-pspell" - "${pkgbase}-snmp" - "${pkgbase}-sqlite" - "${pkgbase}-tidy" - "${pkgbase}-xsl" + "php71" + "php71-cli" + "php71-cgi" + "php71-fpm" + "php71-embed" + "php71-apache" + "php71-pear" + "php71-pecl" + "php71-phpdbg" + "php71-xml" + "php71-xsl" + "php71-xmlreader" + "php71-xmlwriter" + "php71-wddx" + "php71-dom" + "php71-simplexml" + "php71-pdo" + "php71-mysql" + "php71-phar" + "php71-pcntl" + "php71-posix" + "php71-shmop" + "php71-sockets" + "php71-sysvmsg" + "php71-sysvsem" + "php71-sysvshm" + "php71-tokenizer" + "php71-dba" + "php71-pgsql" + "php71-odbc" + "php71-firebird" + "php71-interbase" + "php71-dblib" + "php71-sqlite" + "php71-gd" + "php71-exif" + "php71-tidy" + "php71-iconv" + "php71-xmlrpc" + "php71-bcmath" + "php71-gmp" + "php71-zip" + "php71-bz2" + "php71-json" + "php71-fileinfo" + "php71-ctype" + "php71-recode" + "php71-mbstring" + "php71-pspell" + "php71-enchant" + "php71-intl" + "php71-calendar" + "php71-gettext" + "php71-soap" + "php71-ftp" + "php71-curl" + "php71-snmp" + "php71-ldap" + "php71-imap" + "php71-mcrypt" + "php71-opcache" +) +source=( + "pear-config-patcher.php" + "php-makefile-patcher.php" + "php-apache.conf" + "https://php.net/distributions/php-${pkgver}.tar.xz" + "php71-phar-names.patch" + "fpm-numeric-uid-gid.patch" + "fpm-reload-sighup.patch" + "mysql-socket-php7.1.patch" + "php-enchant-php5.3.patch" + "php-enchant-depr.patch" + "php-freetype-2.9.1.patch" + "php-icu-php5.5.patch" + "recode-php5.3.patch" + "debian-php-7.1.33.patch" + "php-phpinfo.patch" + "timezonedb-guess.patch" + "timezonedb-php7.1.patch" +) +depends=( +) +checkdepends=( ) -pkgver=7.1.33 -_pkgver=${pkgbase//php} -pkgrel=1 -pkgdesc='A general-purpose scripting language that is especially suited to web development (old stable 7.0 series)' -arch=('i686' 'x86_64') -url='http://www.php.net' -license=('PHP') - makedepends=( - 'apache' 'aspell' 'db' 'enchant' 'gd' 'gmp' 'icu' 'libmcrypt' 'libxslt' - 'libzip' 'net-snmp' 'postgresql-libs' 'sqlite' 'systemd' 'tidy' 'unixodbc' - 'curl' 'libtool' 'postfix' 'freetds' 'pcre' 'c-client' 'tidyhtml' + "acl" + "libtool" + "autoconf" + "automake" + "patchelf" + "gawk" + "sed" + "bash" + "python" + "libxml2" + "pam" + "krb5" + "zlib" + "libedit" + "smtp-forwarder" + "pcre" + "apache" + "ncurses" + "libxcrypt" + "systemd" + "systemd-libs" + "coreutils" + "findutils" + "libxslt" + "openssl" + "e2fsprogs" + "db" + "postgresql-libs" + "unixodbc" + "libfbclient" + "libfbclient" + "freetds" + "sqlite" + "libvpx" + "gd" + "tidy" + "gmp" + "libzip" + "recode" + "aspell" + "enchant" + "libvoikko" + "hspell" + "hunspell" + "nuspell" + "aspell" + "icu" + "curl" + "net-snmp" + "libsasl" + "libldap" + "c-client" + "pam" + "libmcrypt" ) - -source=( - "https://php.net/distributions/${_pkgbase}-${pkgver}.tar.xz"{,.asc} - 'apache.patch' - 'apache.conf' - 'enchant-2.patch' - 'freetype2.patch' - 'php-fpm.patch' - 'php-fpm.tmpfiles' - 'php.ini.patch' - 'php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch' - 'php-icu-1101-Simplify-namespace-access.patch' +arch=( ) -sha512sums=( - 'ed37a79e3402c767f20e55c1cbe27957cc78240eafc719fffccd7d29ae10a45112aa0f29082f56133cd9c25f2750e9e57246d95b4f38d766f49bd29d1397eb1d' - '022d1fc374dce70209a266b512fbfd2b817a160475d298c970abbd7d9a79be36eb995a9519bbf142f4878df74b29c006c76b589114ebc455de0f3cd07b84f375' - 'f5e5431993c2e0c1806c4edf392030d0b605f4b3c4cebec036e810ff771b2327983f347221735673506e2c91ce2e18ad37ab7600261b684fe29491206171b4f3' - '30cdc281c6e288cf8a0bf58a0ad74ad5b4e8205d2b0b6ab465fad97d810f7bfae4581ad836712998e834d2e90d38cacd22f19bb01e77fc4c9d200d95613fc669' - '2d5f3aa71ce7d8da43f0f683f81b06258e3a0d95df4807a8acac91ff89fbe60484ef97856a908bce625b1610d0004767a6a8c622246086afe2f2d464977088b5' - 'a664b69aea8c21c50c852f918515d9fe1a931d7f88ec77ec86a20810266515745430d89513ee2e0bb301a29f1fc7ab0d2634076830b4da8ea1e47467fb658678' - 'a23e13180449ace0cfe07e19043615ca7e1dbf254fd24f2446cd2d824728430258ec4140325508169480eaec950ad4737b673417bd70e0f9d4538f1ab3b98816' - '48a97ab0cedd92539b8fe4c82e59312b563a73a8ca537b5a1b2091bfd287f255e94a32c2e5398ccfa7248ef322275a15a4edb817bad6ccf430c79d2f9c5cf0e9' - 'b6ff1c8575c7564ede17ec8c959141a065a9c4e3cba059a1138b9ecc85f23632d7e5980d65742f7fc1ce404ce613f7abb2f5f7a45039d606c9c590ccf3a2301d' - '70c859feff58650ff4a291b1725bce8f290ac6d92cacc4420d3ead5cbbdbcf567cd0ed4d79fdd8b0435cf6833f7b50fff798b2fae274c5fb1bb37a0984a45f9d' - '33d40f3ae500cf583519ecfa271e36d727c38ff4ea9547d3d2c4d51c9fadd317ed614a048077ebdb116e3c84c11db95e6455cdfc80d092d217d070c98af56525' +_patches=( + "php71-phar-names.patch" + "fpm-numeric-uid-gid.patch" + "fpm-reload-sighup.patch" + "mysql-socket-php7.1.patch" + "php-enchant-php5.3.patch" + "php-enchant-depr.patch" + "php-freetype-2.9.1.patch" + "php-icu-php5.5.patch" + "recode-php5.3.patch" + "debian-php-7.1.33.patch" + "php-phpinfo.patch" + "timezonedb-guess.patch" + "timezonedb-php7.1.patch" ) - -validpgpkeys=( - # PGP keys from PHP maintainer (upstream) - # src.: https://secure.php.net/downloads.php#gpg-7.1 - # pub 4096R/7BD5DCD0 2016-05-07 - # Key fingerprint = A917 B1EC DA84 AEC2 B568 FED6 F50A BC80 7BD5 DCD0 - # uid Davey Shafik <davey@php.net> - # - # pub 2048R/31CBD89E 2016-12-08 - # Key fingerprint = 5289 95BF EDFB A719 1D46 839E F9BA 0ADA 31CB D89E - # uid Joe Watkins <krakjoe@php.net> - # - # pub 4096R/70D12172 2017-04-14 [expires: 2024-04-21] - # Key fingerprint = 1729 F839 38DA 44E2 7BA0 F4D3 DBDB 3974 70D1 2172 - # uid Sara Golemon <pollita@php.net> - # - # If you trust them, you can import them with - # gpg --recv-keys A917B1ECDA84AEC2B568FED6F50ABC807BD5DCD0 528995BFEDFBA7191D46839EF9BA0ADA31CBD89E 1729F83938DA44E27BA0F4D3DBDB397470D12172 - # Receiving GPG keys might fail with the following error message: - # gpg: keyserver receive failed: Connection refused - # If this happens, just check your DNS or use another one. - 'A917B1ECDA84AEC2B568FED6F50ABC807BD5DCD0' - '528995BFEDFBA7191D46839EF9BA0ADA31CBD89E' - '1729F83938DA44E27BA0F4D3DBDB397470D12172' +_sapi_depends=( + "libxml2" + "pcre2" + "libedit" +) +_ext_depends_snmp=( + "php71=7.1.33" + "net-snmp" + "openssl" +) +_ext_depends_ftp=( + "php71=7.1.33" + "openssl" +) +_ext_depends_intl=( + "php71=7.1.33" + "icu" ) +_ext_depends_imap=( + "php71=7.1.33" + "pam" + "krb5" + "c-client" + "libxcrypt" + "openssl" +) +_ext_depends_gd=( + "php71=7.1.33" + "gd" + "libvpx" +) +_ext_depends_mysql=( + "php71=7.1.33" + "php71-pdo=7.1.33" +) +_ext_depends_dba=( + "php71=7.1.33" + "db" +) +_ext_depends_odbc=( + "php71=7.1.33" + "unixodbc" + "php71-pdo=7.1.33" +) +_ext_depends_pgsql=( + "php71=7.1.33" + "postgresql-libs" + "php71-pdo=7.1.33" +) +_ext_depends_firebird=( + "php71=7.1.33" + "libfbclient" + "php71-pdo=7.1.33" +) +_ext_depends_sqlite=( + "php71=7.1.33" + "sqlite" + "php71-pdo=7.1.33" +) +_ext_depends_mbstring=( + "php71=7.1.33" +) +_ext_depends_openssl=( + "php71=7.1.33" + "krb5" + "e2fsprogs" + "openssl" +) +_phpconfig="\ + --prefix=/usr \ + --sbindir=/usr/bin \ + --localstatedir=/var \ + --with-layout=GNU \ + --disable-debug \ + --mandir=/usr/share/man \ + --srcdir=../php-${pkgver} \ + --libdir=/usr/lib/php${_phpbase}${_suffix} \ + --datadir=/usr/share/php${_phpbase}${_suffix} \ + --program-suffix=${_phpbase}${_suffix} \ + --with-config-file-scan-dir=/${_build_conf_d} + --enable-filter \ + --with-pear \ + --enable-session \ + --with-mhash=/usr \ + --with-kerberos \ + --with-mysql-sock=${_build_mysql_socket} \ + --enable-mysqlnd-compression-support \ + --datarootdir=/usr/share/php${_phpbase}${_suffix} \ + --with-zlib \ + --enable-libxml \ + --with-pcre-regex=/usr \ + --disable-rpath \ + --config-cache \ + --with-system-tzdata \ + --with-openssl=/usr \ + --enable-phpdbg-readline \ + --with-libedit" +_phpextensions="\ + --enable-xml=shared \ + --with-xsl=shared \ + --enable-xmlreader=shared \ + --enable-xmlwriter=shared \ + --enable-wddx=shared \ + --enable-dom=shared \ + --enable-simplexml=shared \ + --enable-pdo=shared \ + --enable-mysqlnd=shared \ + --with-mysqli=shared,mysqlnd \ + --with-pdo-mysql=shared,mysqlnd \ + --enable-phar=shared \ + --enable-pcntl=shared \ + --enable-posix=shared \ + --enable-shmop=shared \ + --enable-sockets=shared \ + --enable-sysvmsg=shared \ + --enable-sysvsem=shared \ + --enable-sysvshm=shared \ + --enable-tokenizer=shared + --enable-dba=shared \ + --with-db4=/usr \ + --without-gdbm \ + --with-cdb \ + --with-pgsql=shared,/usr \ + --with-pdo-pgsql=shared,/usr \ + --with-unixODBC=shared,/usr \ + --with-pdo-odbc=shared,unixODBC,/usr \ + --with-pdo-firebird=shared,/usr \ + --with-interbase=shared,/usr \ + --with-pdo-dblib=shared,/usr \ + --with-pdo-sqlite=shared,/usr \ + --with-sqlite3=shared,/usr \ + --with-gd=shared,/usr \ + --enable-gd-native-ttf \ + --with-vpx-dir=/usr + --with-webp-dir=/usr \ + --with-jpeg-dir=/usr \ + --with-png-dir=/usr \ + --with-xpm-dir=/usr \ + --with-freetype-dir=/usr \ + --enable-exif=shared \ + --with-tidy=shared,/usr \ + --with-iconv=shared \ + --with-xmlrpc=shared \ + --enable-bcmath=shared \ + --with-gmp=shared,/usr \ + --enable-zip=shared \ + --with-libzip=/usr \ + --with-bz2=shared,/usr \ + --enable-json=shared \ + --enable-fileinfo=shared \ + --enable-ctype=shared \ + --with-recode=shared \ + --enable-mbstring=shared \ + --enable-mbregex \ + --enable-mbregex-backtrack \ + --with-pspell=shared,/usr \ + --with-enchant=shared,/usr \ + --enable-intl=shared \ + --enable-calendar=shared \ + --with-gettext=shared,/usr \ + --enable-soap=shared \ + --enable-ftp=shared \ + --with-curl=shared,/usr \ + --with-snmp=shared,/usr \ + --with-ldap=shared,/usr \ + --with-ldap-sasl=/usr \ + --with-imap=shared,/usr \ + --with-imap-ssl=yes \ + --with-mcrypt=shared \ + --enable-opcache \ + --enable-huge-code-pages" +_phpextensions_fpm="\ + --with-fpm-user=http \ + --with-fpm-group=http \ + --with-fpm-systemd \ + --with-fpm-acl" + + +options=('!lto') +arch=("$CARCH") +checkdepends=('procps-ng' 'smtp-forwarder') +license=('PHP') +url='http://www.php.net' + +################################################################################ +# Prepare it +################################################################################ prepare() { - cd ${_pkgbase}-${pkgver} + pushd "php-${pkgver}" + + echo "[SED] scripts/phpize.in" + sed -E "s|(includedir[\t ]*=.*/php)|\1${_phpbase}${_suffix}|g" \ + -i scripts/phpize.in + + echo "[SED] scripts/phpize.m4" + sed -e "s|\[php-config\]|\[php-config${_phpbase}${_suffix}\]|g" \ + -e "s|\(PHP_ARG_WITH(\[php-config\)${_phpbase}${_suffix}\]|\1]|g" \ + -e "s|php-config, no|php-config${_phpbase}${_suffix}, no|g" \ + -i "scripts/phpize.m4" + + echo "[SED] scripts/Makefile.frag" + sed -E "s|(phpincludedir[\t ]*=.*/php)|\1${_phpbase}${_suffix}|g" \ + -i scripts/Makefile.frag + + echo "[SED] scripts/php-config.in" + sed -E "s|(include_dir[\t ]*=.*php)|\1${_phpbase}${_suffix}|g" \ + -i scripts/php-config.in + + echo "[SED] sapi/apache2handler/config.m4" + sed -e '/APACHE_THREADED_MPM=/d' \ + -i sapi/apache2handler/config.m4 + + echo "[SED] sapi/fpm/Makefile.frag" + # sed -e 's#php-fpm\$(program_suffix)#php\$(program_suffix)-fpm#' + sed -e 's/.conf.default/.conf/g' \ + -i sapi/fpm/Makefile.frag + + echo "[SED] sapi/fpm/php-fpm.service.in" + sed -E "s|ExecStart[\s]?=[\s]?@([a-zA-Z_]+)@/php-fpm|ExecStart=@\1@/${_build_fpm_name}|g; \ + s|PIDFile[\s]?=[\s]?@([a-zA-Z_]+)@/run/php-fpm.pid|PIDFile=/run/${_build_fpm_service_name}/php-fpm.pid|g" \ + -i sapi/fpm/php-fpm.service.in + + local _check_files=("sapi/fpm/www.conf.in" "sapi/fpm/php-fpm.conf.in"); + for file_conf in "${_check_files[@]}"; do + if [[ ! -f $file_conf ]]; then + continue; + fi + echo "[SED] ${file_conf}" + sed -e "s#^listen =.*#listen = /run/${_build_fpm_service_name}/php-fpm.sock#" \ + -e "s#run/php-fpm.pid#/run/${_build_fpm_service_name}/php-fpm.pid#" \ + -e 's#^;*[ \t]*listen.owner =#listen.owner =#' \ + -e 's#^;*[ \t]*listen.group =#listen.group =#' \ + -e 's#^;*[ \t]*error_log =.*#error_log = syslog#' \ + -e 's#^;*[ \t]*chdir =.*#;chdir = /srv/http#' \ + -i "${file_conf}" + done + + echo "[SED] php.ini-production" + sed -e 's#^;*[ \t]*extension_dir[\t ]*=.*/.*$#extension_dir = "___EXTENSIONDIR___"#' \ + -e "s#___EXTENSIONDIR___#/usr/lib/${pkgbase}/modules#g" \ + -e "s#^;*[ \t]*extension=#;extension=#g" \ + -e "s#^;*[ \t]*session.save_path[\t ]*=.*#session.save_path=___SESSIONS___#g" \ + -e "s#___SESSIONS___#/var/lib/${pkgbase}/sessions#g" \ + -i php.ini-production + + for patch_name in "${_patches[@]}"; do + echo "[PATCH] Applying source patch ${patch_name}"; + patch -p1 -i "../${patch_name}" + done - patch -p0 -i ../apache.patch - patch -p0 -i ../enchant-2.patch - patch -p0 -i ../freetype2.patch - patch -p0 -i ../php-fpm.patch - patch -p1 -i ../php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch - patch -p1 -i ../php-icu-1101-Simplify-namespace-access.patch - patch -p0 -i ../php.ini.patch + if ((_phpbase <= 53)); then + PHP_AUTOCONF="/usr/bin/autoconf-2.13" ./buildconf --force + else + ./buildconf --force + fi + rm -f tests/output/stream_isatty_*.phpt + rm -f Zend/tests/arginfo_zpp_mismatch*.phpt + rm -f Zend/tests/bug79919.phpt + popd } +_build_sapi() { + _sapi="${1}" + _commands="${2}" + if (( _sapi == "cli" )); then + if [[ ! -d "build-${_sapi}" ]]; then + mkdir "build-${_sapi}" + fi + pushd "build-${_sapi}" + if [[ -L configure ]]; then + rm configure + fi + ln -s "../php-${pkgver}/configure" + popd + else + cp -Ta "build-cli" "build-${_sapi}" + fi + + pushd "build-${_sapi}" + ./configure ${_phpconfig} ${_commands} + + if (($_sapi != "cli")); then + make clean + fi + if ((! _build_with_custom_icu)); then + sed -i -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' \ + -e 's|^runpath_var=LD_RUN_PATH|runpath_var=LIBTOOL_IS_BROKED|g' \ + libtool + fi + make + popd +} + +################################################################################ +# BUILD them all +################################################################################ build() { - local phpConfig="\ - --srcdir=../${_pkgbase}-${pkgver} \ - --config-cache \ - --prefix=/usr \ - --sbindir=/usr/bin \ - --sysconfdir=/etc/${pkgbase} \ - --localstatedir=/var \ - --libdir=/usr/lib/${pkgbase} \ - --datarootdir=/usr/share/${pkgbase} \ - --datadir=/usr/share/${pkgbase} \ - --program-suffix=${pkgbase#php} \ - --with-layout=GNU \ - --with-config-file-path=/etc/${pkgbase} \ - --with-config-file-scan-dir=/etc/${pkgbase}/conf.d \ - --disable-rpath \ - --without-pear \ - " + export EXTENSION_DIR="/usr/lib/${pkgbase}/modules" + if ((_build_openssl_v10_patch)); then + export PHP_OPENSSL_DIR="/usr/lib/openssl-1.0" + fi + if [[ ! -z "${_cppflags}" ]]; then + CPPFLAGS+=" $_cppflags " + fi + if ((_build_with_custom_icu )); then + local _php5_icu_first="${srcdir}/${_build_icu_src_dir}/php${_phpbase}${suffix}-icu${_pkgver_icu}" + LDFLAGS+="-Wl,-rpath=$ORIGIN/usr/lib/${pkgbase}/icu${_pkgver_icu}/lib" + _phpextensions+=" --with-icu-dir=${_php5_icu_first} " + if [[ ! -d $_php5_icu_first ]]; then + mkdir -p "${_php5_icu_first}" + fi + pushd "${_build_icu_src_dir}" + ./configure --prefix="${_php5_icu_first}" \ + --sysconfdir="${_php5_icu_first}/etc" \ + --mandir="${_php5_icu_first}/share/man" \ + --sbindir="${_php5_icu_first}/bin" \ + --libdir="${_php5_icu_first}/lib" \ + --includedir="${_php5_icu_first}/include" \ + --disable-tests \ + --disable-debug + make -j$(nproc) + make install + ./configure --prefix="/usr/lib/${pkgbase}/icu${_pkgver_icu}" \ + --sysconfdir="/usr/lib/${pkgbase}/icu${_pkgver_icu}/etc" \ + --mandir="/usr/lib/${pkgbase}/icu${_pkgver_icu}/share/man" \ + --sbindir="/usr/lib/${pkgbase}/icu${_pkgver_icu}/bin" \ + --libdir="/usr/lib/${pkgbase}/icu${_pkgver_icu}/lib" \ + --includedir="/usr/lib/${pkgbase}/icu${_pkgver_icu}/include" \ + --disable-tests \ + --disable-debug + make -j$(nproc) + popd + fi - local phpExtensions="\ - --enable-bcmath=shared \ - --enable-calendar=shared \ - --enable-dba=shared \ - --enable-exif=shared \ - --enable-ftp=shared \ - --enable-gd-native-ttf \ - --enable-intl=shared \ - --enable-mbstring \ - --enable-shmop=shared \ - --enable-soap=shared \ - --enable-sockets=shared \ - --enable-sysvmsg=shared \ - --enable-sysvsem=shared \ - --enable-sysvshm=shared \ - --enable-zip=shared \ - --with-bz2=shared \ - --with-curl=shared \ - --with-db4=/usr \ - --with-enchant=shared,/usr \ - --with-freetype-dir=/usr \ - --with-gd=shared,/usr \ - --with-gdbm \ - --with-gettext=shared \ - --with-gmp=shared \ - --with-iconv=shared \ - --with-imap-ssl \ - --with-imap=shared \ - --with-kerberos=/usr \ - --with-ldap=shared \ - --with-ldap-sasl \ - --with-libzip \ - --with-mcrypt=shared \ - --with-mhash \ - --with-mysql-sock=/run/mysqld/mysqld.sock \ - --with-mysqli=shared,mysqlnd \ - --with-openssl \ - --with-pcre-regex=/usr \ - --with-pdo-dblib=shared,/usr \ - --with-pdo-mysql=shared,mysqlnd \ - --with-pdo-odbc=shared,unixODBC,/usr \ - --with-pdo-pgsql=shared \ - --with-pdo-sqlite=shared,/usr \ - --with-pgsql=shared \ - --with-pspell=shared \ - --with-readline \ - --with-snmp=shared \ - --with-sqlite3=shared,/usr \ - --with-tidy=shared \ - --with-unixODBC=shared,/usr \ - --with-xmlrpc=shared \ - --with-xsl=shared \ - --with-zlib \ - --enable-pcntl \ + if ((_build_ini_per_sapi || _build_per_sapi)); then + + # CLI + _cli_addons='' + if (( ! _build_per_sapi )); then + # CGI enabled here only for tests passing, then overriden later by cgi build + _cli_addons+=" --enable-cgi " + fi + _build_sapi "cli" "\ + --sysconfdir=/${_build_sapi_ini_cli} \ + --with-config-file-path=/${_build_sapi_ini_cli} \ + --enable-cli \ + ${_phpextensions} \ + ${_cli_addons} \ + --disable-fpm \ + --disable-embed \ + --disable-phpdbg \ + " + + # phpdbg + if ((_build_phpdbg)); then + _sapi="phpdbg" + _build_sapi "phpdbg" "\ + --sysconfdir=/${_build_sapi_ini_phpdbg} \ + --with-config-file-path=/${_build_sapi_ini_phpdbg} \ + --disable-all \ + --enable-phpdbg \ + --disable-cgi \ + --disable-cli \ + --disable-fpm \ + --disable-embed \ " + fi - EXTENSION_DIR=/usr/lib/${pkgbase}/modules - export EXTENSION_DIR + # embed + _build_sapi "embed" "\ + --sysconfdir=/${_build_sapi_ini_embed} \ + --with-config-file-path=/${_build_sapi_ini_embed} \ + --disable-all \ + --enable-embed=shared \ + --disable-cgi \ + --disable-cli \ + --disable-fpm \ + --disable-phpdbg \ + " - mkdir build - cd build - ln -s ../${_pkgbase}-${pkgver}/configure - ./configure ${phpConfig} \ + # cgi + _build_sapi "cgi" "\ + --sysconfdir=/${_build_sapi_ini_cgi} \ + --with-config-file-path=/${_build_sapi_ini_cgi} \ + --disable-all \ --enable-cgi \ + --disable-cli \ + --disable-fpm \ + --disable-embed \ + --disable-phpdbg \ + " + + # fpm + _build_sapi "fpm" "\ + --sysconfdir=/${_build_sapi_ini_fpm} \ + --with-config-file-path=/${_build_sapi_ini_fpm} \ + --disable-all \ --enable-fpm \ - --with-fpm-systemd \ - --with-fpm-acl \ - --with-fpm-user=http \ - --with-fpm-group=http \ + ${_phpextensions_fpm} \ + --disable-cli \ + --disable-cgi \ + --disable-embed \ + --disable-phpdbg \ + " + else + + # CLI + if ((_build_phpdbg)); then + _cli_addons+=" --enable-phpdbg " + fi + _build_sapi "cli" "\ + --sysconfdir=/${_build_sapi_ini_cli} \ + --with-config-file-path=/${_build_sapi_ini_cli} \ + --enable-cli \ + ${_phpextensions} \ + ${_cli_addons} \ + --enable-fpm \ + --enable-cgi \ --enable-embed=shared \ - ${phpExtensions} - make - cd ../ + --enable-fpm \ + ${_phpextensions_fpm} \ + " + fi # apache - # Reuse the previous configure step in order to save time - cp -a build build-apache - cd build-apache - ./configure ${phpConfig} \ + _build_sapi "apache" "\ + --disable-all \ + --disable-cli \ + --disable-cgi \ + --disable-fpm \ + --disable-embed \ + --disable-phpdbg \ --with-apxs2 \ - ${phpExtensions} - make - cd ../ + --sysconfdir=/${_build_sapi_ini_apache} \ + --with-config-file-path=/${_build_sapi_ini_apache} \ + " - # phpdbg - cp -a build build-phpdbg - cd build-phpdbg - ./configure ${phpConfig} \ - --enable-phpdbg \ - ${phpExtensions} - make } check() { - cd ${srcdir}/${_pkgbase}-${pkgver} - + pushd "build-cli" # Check if sendmail was configured correctly (FS#47600) - ${srcdir}/build/sapi/cli/php -n -r 'echo ini_get("sendmail_path");' | grep -q '/usr/bin/sendmail' - export REPORT_EXIT_STATUS=1 export NO_INTERACTION=1 export SKIP_ONLINE_TESTS=1 export SKIP_SLOW_TESTS=1 - - ${srcdir}/build/sapi/cli/php -n run-tests.php -n -P {tests,Zend} + export TESTS='tests Zend' + if ((_phpbase > 73)); then + export TEST_PHP_ARGS="-j$(nproc)" + fi + # Patch tests to run PHP modules in needed order + sapi/cli/php -n ../php-makefile-patcher.php Makefile + make test + popd } -package_php71() { - pkgdesc='A general-purpose scripting language that is especially suited to web development' - depends=('libxml2' 'curl' 'libzip' 'pcre') - provides=("${_pkgbase}=$pkgver") - backup=("etc/${pkgbase}/php.ini") - - cd build - make -j1 INSTALL_ROOT=${pkgdir} install-{modules,cli,build,headers,programs,pharcmd} - install -D -m644 ../${_pkgbase}-${pkgver}/php.ini-production ${pkgdir}/etc/${pkgbase}/php.ini - install -d -m755 ${pkgdir}/etc/${pkgbase}/conf.d/ +################################################################################ +# Custom code +################################################################################ +_install_module_ini() { + local extension=$(echo "${1}" | sed 's/\.so//') + local priority="${_priority_default}" + case "${extension}" in + "json") + priority="${_priority_json}" + ;; + "xml") + priority="${_priority_xml}" + ;; + "openssl") + priority="${_priority_openssl}" + ;; + "mysqlnd") + priority="${_priority_mysqlnd}" + ;; + "pdo") + priority="${_priority_pdo}" + ;; + "opcache") + priority="${_priority_opcache}" + ;; + "dom") + priority="${_priority_dom}" + ;; + esac + local extension_type="extension" + case "${extension}" in + "opcache" | "xdebug") + extension_type="zend_extension" + ;; + "recode") + extension_type=";extension" + ;; + esac - # Remove static modules - rm -f ${pkgdir}/usr/lib/${pkgbase}/modules/*.a + if [[ ! -d "${pkgdir}/${_build_conf_d}" ]]; then + mkdir -p "${pkgdir}/${_build_conf_d}" + fi + echo "${extension_type}=${extension}.so" > "${pkgdir}/${_build_conf_d}/${priority}-${extension}.ini" + chmod 0644 "$pkgdir/${_build_conf_d}/${priority}-${extension}.ini" + _last_priority=${priority} + _last_extension=${extension} +} - # Remove modules provided by sub packages - rm -f ${pkgdir}/usr/lib/${pkgbase}/modules/{enchant,gd,imap,intl,mcrypt,odbc,pdo_dblib,pdo_odbc,pgsql,pdo_pgsql,pspell,snmp,sqlite3,pdo_sqlite,tidy,xsl}.so +_install_module() { + if [[ -f "build-cli/modules/${1}.so" ]]; then + install -D -m755 "build-cli/modules/${1}.so" "${pkgdir}/usr/lib/${pkgbase}/modules/${1}.so"; + _install_module_ini "${1}" + else + echo "[DEBUG]: Install_module can't find ${1}.so, skipped" + fi +} - # Remove empty directory - rmdir ${pkgdir}/usr/include/php/include +############################################################################### +# PHP: SAPI's +############################################################################### - # Move include directory - mv ${pkgdir}/usr/include/php ${pkgdir}/usr/include/${pkgbase} +# Main package +package_php71() { + # Binary names + pkgdesc='PHP. A general-purpose scripting language that is especially suited to web development' + depends=('zlib' 'pcre' 'libedit') + if ((_build_with_custom_icu)); then + pushd "${_build_icu_src_dir}" + make DESTDIR="${pkgdir}" install + popd + pushd "${pkgdir}/usr/lib/${pkgbase}/icu${_pkgver_icu}" + rm -rf bin include share + popd + fi - # Fix phar symlink - rm ${pkgdir}/usr/bin/phar - ln -sf phar.${pkgbase/php/phar} ${pkgdir}/usr/bin/${pkgbase/php/phar} + # Install session dir + install -d -m1733 "${pkgdir}/var/lib/${pkgbase}/sessions" - # Rename executables - mv ${pkgdir}/usr/bin/phar.{phar,${pkgbase/php/phar}} + # conf.d dir with shared modules + install -d -m755 "${pkgdir}/${_build_conf_d}/" - # Rename man pages - mv ${pkgdir}/usr/share/man/man1/{phar,${pkgbase/php/phar}}.1 - mv ${pkgdir}/usr/share/man/man1/phar.{phar,${pkgbase/php/phar}}.1 + pushd "build-cli" + make -j1 INSTALL_ROOT=${pkgdir} install-{modules,build,headers,programs} + # Cleanup for CGI" + rm -rf "${pkgdir}/usr/bin/${pkgbase}-cgi" + popd - # Fix paths in executables - sed -i "/^includedir=/c \includedir=/usr/include/${pkgbase}" ${pkgdir}/usr/bin/${pkgbase/php/phpize} - sed -i "/^include_dir=/c \include_dir=/usr/include/${pkgbase}" ${pkgdir}/usr/bin/${pkgbase/php/php-config} + pushd "${pkgdir}/usr/lib/${pkgbase}/modules/" + # remove static modules + rm -f *.a + # remove modules provided by subpackages + rm -f {enchant,imap,intl,pspell,snmp,tidy,curl,ldap,bz2,bcmath,soap,zip,gmp,dba,opcache,json,gd,mcrypt,sodium,recode}.so + rm -f {pdo_dblib,mssql}.so + rm -f {dom,simplexml,xml,xmlreader,xmlwriter,xsl,wddx,xmlrpc}.so + rm -f {pgsql,pdo_pgsql}.so + rm -f {odbc,pdo_odbc}.so + rm -f {pdo_sqlite,sqlite3}.so + rm -f {pdo_firebird.so,interbase.so} + rm -f {mysqli,pdo_mysql,mysqlnd,mysql}.so + rm -f {openssl,ffi,pcntl,ftp,calendar,ctype,fileinfo,iconv,mbstring,exif,pdo,phar,posix,shmop}.so + rm -f {sockets,tokenizer,gettext,sysvmsg,sysvsem,sysvshm}.so + popd + pushd build-cli + if (( ! _build_ini_per_sapi )); then + backup=("${_build_sapi_ini_cli}/php.ini") + install -d -m755 "${pkgdir}/${_build_sapi_ini_cli}" + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_cli}/php.ini" + fi + popd +} - # Make phpize use php-config70 - sed -i "/^\[ --with-php-config=/c \[ --with-php-config=PATH Path to php-config [${pkgbase/php/php-config}]], ${pkgbase/php/php-config}, no)" ${pkgdir}/usr/lib/${pkgbase}/build/phpize.m4 +# Cli + phar +package_php71-cli() { + _sapi="cli" + pkgdesc="cli (command-line executable) version for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + depends+=("${_sapi_depends[@]}") + pushd "build-${_sapi}" + make -j1 INSTALL_ROOT="${pkgdir}" install-cli + make -j1 INSTALL_ROOT="${pkgdir}" install-pharcmd + if ((_build_ini_per_sapi)); then + backup=("${_build_sapi_ini_cli}/php.ini") + install -d -m755 "${pkgdir}/${_build_sapi_ini_cli}" + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_cli}/php.ini" + fi + # Cleanup for CGI + rm -rf "${pkgdir}/usr/bin/${pkgbase}-cgi" + popd } +# End cli +# CGI package_php71-cgi() { - pkgdesc='CGI and FCGI SAPI for PHP' - depends=("${pkgbase}") - provides=("${_pkgbase}-cgi=$pkgver") - - cd build - make INSTALL_ROOT=${pkgdir} install-cgi + _sapi="cgi" + pkgdesc="CGI and FCGI SAPI for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + depends+=("${_sapi_depends[@]}") + if ((_build_ini_per_sapi || _build_per_sapi)); then + pushd "build-${_sapi}" + else + pushd "build-cli" + fi + if ((_build_ini_per_sapi)); then + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_cgi}/php.ini" + backup=("${_build_sapi_ini_cgi}/php.ini") + fi + case "${_phpbase}" in + 53 | 54) + install -D -m755 sapi/cgi/php-cgi "${pkgdir}/usr/bin/${pkgbase}-cgi" + ;; + *) + make -j1 INSTALL_ROOT="${pkgdir}" install-cgi + ;; + esac + popd } +# CGI end +# Apache package_php71-apache() { - pkgdesc='Apache SAPI for PHP' - depends=("${pkgbase}" 'apache') - backup=("etc/httpd/conf/extra/${pkgbase}_module.conf") + _sapi="apache" + _build_mod_php_so="libphp${_suffix_so}.so" + _build_mod_php_module="php_module${_suffix_so}" + _build_build_php_script_name="php${_suffix_so}-script" + _apache_module_conf="${pkgbase}-module.conf" + pkgdesc="Apache SAPI for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'apache') + depends+=("${_sapi_depends[@]}") + depends+=('libxcrypt'); + depends+=('ncurses'); + backup=("${_build_apache_cfg}/${_apache_module_conf}") + echo "# End of LoadModule in httpd.conf - see ArchWiki Apache HTTP Server" + echo "LoadModule ${_build_mod_php_module} modules/lib${pkgbase}.so" + echo "AddHandler ${_build_php_script_name} .php" + echo "# End of Include List" + echo "Include conf/extra/${_apache_module_conf}" + + pushd "build-${_sapi}" + if ((_build_ini_per_sapi)); then + backup+=("${_build_sapi_ini_apache}/php.ini") + install -d -m755 "${pkgdir}/${_build_sapi_ini_apache}" + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_apache}/php.ini" + fi + install -D -m755 "libs/${_build_mod_php_so}" "${pkgdir}/usr/lib/httpd/modules/lib${pkgbase}.so" + patchelf --set-soname \ + "lib${pkgbase}.so" \ + "${pkgdir}/usr/lib/httpd/modules/lib${pkgbase}.so" + popd - install -D -m755 build-apache/libs/libphp7.so ${pkgdir}/usr/lib/httpd/modules/lib${pkgbase}.so - install -D -m644 apache.conf ${pkgdir}/etc/httpd/conf/extra/${pkgbase}_module.conf + install -D -m644 "php-apache.conf" "${pkgdir}/${_build_apache_cfg}/${_apache_module_conf}" + echo "[SED] ${pkgdir}/${_build_apache_cfg}/${_apache_module_conf}" + sed -e "s#@MODULE@#${_build_mod_php_module}#" \ + -i "${pkgdir}/${_build_apache_cfg}/${_apache_module_conf}" } +# Apache end +# FPM package_php71-fpm() { - pkgdesc='FastCGI Process Manager for PHP' - depends=("${pkgbase}" 'systemd') - backup=("etc/${pkgbase}/php-fpm.conf" "etc/${pkgbase}/php-fpm.d/php-fpm.conf") + _sapi="fpm" + install="php-fpm.install" + pkgdesc="FastCGI Process Manager for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'systemd-libs' 'acl') + depends+=("${_sapi_depends[@]}") + backup=("${_build_sapi_ini_fpm}/php-fpm.conf") + if ((_phpbase >= 70)); then + backup+=("${_build_sapi_ini_fpm}/php-fpm.d/www.conf") + fi options=('!emptydirs') - - cd build - make INSTALL_ROOT=${pkgdir} install-fpm - cd .. - install -D -m644 build/sapi/fpm/php-fpm.service ${pkgdir}/usr/lib/systemd/system/${pkgbase}-fpm.service - install -D -m644 php-fpm.tmpfiles ${pkgdir}/usr/lib/tmpfiles.d/${pkgbase}-fpm.conf + if ((_build_ini_per_sapi || _build_per_sapi)); then + pushd "build-${_sapi}" + else + pushd "build-cli" + fi + if ((_build_ini_per_sapi)); then + backup+=("${_build_sapi_ini_fpm}/php.ini") + install -d -m755 "${pkgdir}/${_build_sapi_ini_fpm}/" + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_fpm}/php.ini" + fi + make -j1 INSTALL_ROOT="${pkgdir}" install-fpm + install -D -m644 "sapi/fpm/php-fpm.service" "${pkgdir}/usr/lib/systemd/system/${_build_fpm_service_name}.service" + echo "d /run/${_build_fpm_service_name} 755 root root" > php-fpm.tmpfiles + install -D -m644 "php-fpm.tmpfiles" "${pkgdir}/usr/lib/tmpfiles.d/${_build_fpm_service_name}.conf" + popd } +# FPM end +# embed sapi package_php71-embed() { - pkgdesc='Embedded PHP SAPI library' - depends=("${pkgbase}") - provides=("${pkgbase}-embed=$pkgver") + _sapi="embed" + pkgdesc="Embedded PHP SAPI library for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'ncurses' 'systemd-libs' 'libxcrypt' 'acl' 'ncurses') + depends+=("${_sapi_depends[@]}") options=('!emptydirs') - - cd build - make INSTALL_ROOT=${pkgdir} PHP_SAPI=embed install-sapi - mv ${pkgdir}/usr/lib/libphp7.so ${pkgdir}/usr/lib/libphp-${_pkgver}.so + if ((_build_ini_per_sapi || _build_per_sapi)); then + pushd "build-${_sapi}" + else + pushd "build-cli" + fi + install -d -m755 "${pkgdir}/${_build_sapi_ini_embed}" + if ((_build_ini_per_sapi)); then + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_embed}/php.ini" + backup=("${_build_sapi_ini_embed}/php.ini") + fi + make -j1 INSTALL_ROOT="${pkgdir}" PHP_SAPI=embed install-sapi + mv "${pkgdir}/usr/lib/libphp${_suffix_so}.so" "${pkgdir}/usr/lib/lib${pkgbase}.so" + popd + patchelf --set-soname "lib${pkgbase}.so" "${pkgdir}/usr/lib/lib${pkgbase}.so" } +# embed sapi end +# phpdbg sapi package_php71-phpdbg() { - pkgdesc='Interactive PHP debugger' - depends=("${pkgbase}") - provides=("${pkgbase}-phpdbg=$pkgver") + _sapi="phpdbg" options=('!emptydirs') + pkgdesc="Interactive PHP debugger for ${pkgbase} ($_sapi)" + depends=("${pkgbase}=${pkgver}") + depends+=("${_sapi_depends[@]}") + if ((_build_ini_per_sapi || _build_per_sapi)); then + pushd "build-${_sapi}" + else + pushd "build-cli" + fi + if ((_build_ini_per_sapi)); then + backup=("${_build_sapi_ini_phpdbg}/php.ini") + install -d -m755 "${pkgdir}/${_build_sapi_ini_phpdbg}" + install -D -m644 "../php-${pkgver}/php.ini-production" "${pkgdir}/${_build_sapi_ini_phpdbg}/php.ini" + fi + make -j1 INSTALL_ROOT="${pkgdir}" "install-${_sapi}" + popd +} +# phpdbg sapi end + +############################################################################### +# PEAR + PECL +############################################################################### - cd build-phpdbg - make INSTALL_ROOT=${pkgdir} install-phpdbg +# PEAR +package_php71-pear() { + pkgdesc="PHP Extension and Application Repository (PEAR) for ${pkgbase}" + depends=( + "${pkgbase}=${pkgver}" + "php${_phpbase}-xml${_suffix}=${pkgver}" + "php${_phpbase}-cli${_suffix}=${pkgver}" + "php${_phpbase}-phar${_suffix}=${pkgver}" + ) + #backup=("${_build_sapi_ini_cli}/pear.conf") + install -d "${pkgdir}/usr/share/${pkgbase}/pear/htdocs" + install -d "${pkgdir}/usr/share/${pkgbase}/pear/data" + install -d "${pkgdir}/usr/share/${pkgbase}/pear/doc" + install -d "${pkgdir}/usr/share/${pkgbase}/pear/test" + install -d "${pkgdir}/usr/share/${pkgbase}/pear/cfg" + install -d "${pkgdir}/var/lib/${pkgbase}/pear/cache" + install -d "${pkgdir}/var/lib/${pkgbase}/pear/metadata" + install -d "${pkgdir}/var/lib/${pkgbase}/pear/download" + install -d "${pkgdir}/var/lib/${pkgbase}/pear/temp" + export PHP_PEAR_SYSCONF_DIR="${_build_sapi_ini_cli}" + pushd build-cli + + cp "${srcdir}/php-${pkgver}/pear/install-pear-nozlib.phar" "pear/install-pear-nozlib.phar" + + INSTALL_ROOT="${pkgdir}/" ./sapi/cli/php -n \ + -d extension=modules/xml.so \ + -d extension=modules/phar.so \ + -d date.timezone=UTC -d memory_limit=64M -d short_open_tag=0 -d safe_mode=0 \ + -d 'error_reporting=E_ALL&~E_DEPRECATED' -d detect_unicode=0 "pear/install-pear-nozlib.phar" \ + -ds "${_phpbase}${_suffix}" \ + --php "/usr/bin/${pkgbase}" \ + --bin "/usr/bin" \ + --man "/usr/share/man" \ + --dir "/usr/share/${pkgbase}/pear" \ + --data "/usr/share/${pkgbase}/pear/data" \ + --doc "/usr/share/${pkgbase}/pear/doc" \ + --test "/usr/share/${pkgbase}/pear/test" \ + --www "/usr/share/${pkgbase}/pear/htdocs" \ + --config "/usr/share/${pkgbase}/pear/cfg" \ + --force + # fix pear.conf with unserialize + # first arg: path to pear.conf + # second arg: PEAR base /var path + ./sapi/cli/php -n ../pear-config-patcher.php \ + "${pkgdir}/${_build_sapi_ini_cli}/pear.conf" \ + "/var/lib/${pkgbase}/pear" + popd + # remove unneeded files + rm -rf "${pkgdir}"/.{channels,depdb,depdblock,filemap,lock,registry} + #rename binaries + for i in pear peardev pecl; do + _target="${pkgbase/php/$i}" + # fix hardcoded paths + sed "s|PHP=php|PHP=\"/usr/bin/${pkgbase}\"|g; s|\"/usr/bin/php\"|\"/usr/bin/${pkgbase}\"|g; s| -n | |g" \ + -i "${pkgdir}/usr/bin/${i}" + if [[ "$i" == "pecl" ]]; then + echo "Moving ${pkgdir}/usr/bin/${i} => ${srcdir}/${pkgbase}-pecl-bin/" + mkdir -p "${srcdir}/${pkgbase}-pecl-bin/" + mv "${pkgdir}/usr/bin/pecl" "${srcdir}/${pkgbase}-pecl-bin/" + else + echo "Moving ${pkgdir}/usr/bin/${i} => ${pkgdir}/usr/bin/${_target}" + mv "${pkgdir}/usr/bin/${i}" "${pkgdir}/usr/bin/${_target}" + fi + done } +# PEAR end -package_php71-dblib() { - pkgdesc='dblib module for PHP' - depends=("${pkgbase}") - provides=("${pkgbase}-dblib=$pkgver") +# PECL +package_php71-pecl() { + pkgdesc="PHP Extension Community Library (PECL) for ${pkgbase}" + depends=("php${_phpbase}-pear${_suffix}=${pkgver}") + _target="${pkgbase/php/pecl}" + install -D -m755 "${srcdir}/${pkgbase}-pecl-bin/pecl" "${pkgdir}/usr/bin/${_target}" +} +# PECL end + +############################################################################### +# PHP Modules: First need +############################################################################### - install -D -m755 build/modules/pdo_dblib.so ${pkgdir}/usr/lib/${pkgbase}/modules/pdo_dblib.so +# OpenSSL +package_php71-openssl() { + pkgdesc="OpenSSL module for ${pkgbase}" + depends=("${_ext_depends_openssl[@]}") + _install_module openssl } -package_php71-enchant() { - pkgdesc='enchant module for PHP' - depends=("${pkgbase}" 'enchant') - provides=("${pkgbase}-enchant=$pkgver") +# Json +package_php71-json() { + pkgdesc="json module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module json +} - install -D -m755 build/modules/enchant.so ${pkgdir}/usr/lib/${pkgbase}/modules/enchant.so +# pdo +package_php71-pdo() { + pkgdesc="pdo module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module pdo } -package_php71-gd() { - pkgdesc='gd module for PHP' - depends=("${pkgbase}" 'gd') - provides=("${pkgbase}-gd=$pkgver") - install -D -m755 build/modules/gd.so ${pkgdir}/usr/lib/${pkgbase}/modules/gd.so +# mbstring +package_php71-mbstring() { + pkgdesc="mbstring module for ${pkgbase}" + depends=("${_ext_depends_mbstring[@]}") + _install_module mbstring } -package_php71-imap() { - pkgdesc='imap module for PHP' - depends=("${pkgbase}" 'c-client') - provides=("${pkgbase}-imap=$pkgver") - install -D -m755 build/modules/imap.so ${pkgdir}/usr/lib/${pkgbase}/modules/imap.so +# phar +package_php71-phar() { + pkgdesc="phar module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module phar } -package_php71-intl() { - pkgdesc='intl module for PHP' - depends=("${pkgbase}" 'icu') - provides=("${pkgbase}-intl=$pkgver") - install -D -m755 build/modules/intl.so ${pkgdir}/usr/lib/${pkgbase}/modules/intl.so +############################################################################### +# PHP modules: XML +############################################################################### + +# XML modules combined package +package_php71-xml() { + pkgdesc="xml modules for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libxml2') + _install_module xml } -package_php71-mcrypt() { - pkgdesc='mcrypt module for PHP' - depends=("${pkgbase}" 'libmcrypt' 'libltdl') - provides=("${pkgbase}-mcrypt=$pkgver") +package_php71-wddx() { + pkgdesc="wddx module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}") + _install_module wddx +} - install -D -m755 build/modules/mcrypt.so ${pkgdir}/usr/lib/${pkgbase}/modules/mcrypt.so +package_php71-simplexml() { + pkgdesc="simplexml module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}") + _install_module simplexml } -package_php71-odbc() { - pkgdesc='ODBC modules for PHP' - depends=("${pkgbase}" 'unixodbc') - provides=("${pkgbase}-odbc=$pkgver") +package_php71-dom() { + pkgdesc="dom module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}") + _install_module dom +} + +package_php71-xmlreader() { + pkgdesc="xmlreader module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}") + _install_module xmlreader +} - install -D -m755 build/modules/odbc.so ${pkgdir}/usr/lib/${pkgbase}/modules/odbc.so - install -D -m755 build/modules/pdo_odbc.so ${pkgdir}/usr/lib/${pkgbase}/modules/pdo_odbc.so +package_php71-xmlwriter() { + pkgdesc="xmlwriter module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}") + _install_module xmlwriter +} + +# Tidy +package_php71-tidy() { + pkgdesc="tidy module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'tidy') + _install_module tidy +} + +# XSL +package_php71-xsl() { + pkgdesc="xsl module for ${pkgbase}" + depends=("php${_phpbase}-xml${_suffix}=${pkgver}" "php${_phpbase}-dom${_suffix}=${pkgver}") + depends+=('libxslt') + _install_module xsl } +############################################################################### +# PHP modules: Databases +############################################################################### + +# MySQL +package_php71-mysql() { + pkgdesc="MySQL modules for ${pkgbase}" + depends=("${_ext_depends_mysql[@]}") + _install_module mysqlnd + _install_module mysql + _install_module mysqli + _install_module pdo_mysql +} + +# pdo_sqlite + sqlite3 +package_php71-sqlite() { + pkgdesc="sqlite module for ${pkgbase}" + depends=("${_ext_depends_sqlite[@]}") + _install_module sqlite3 + _install_module pdo_sqlite +} + +# ODBC +package_php71-odbc() { + pkgdesc="ODBC modules for ${pkgbase}" + depends=("${_ext_depends_odbc[@]}") + _install_module odbc + _install_module pdo_odbc +} + +# PostgreSQL package_php71-pgsql() { - pkgdesc='PostgreSQL modules for PHP' - depends=("${pkgbase}" 'postgresql-libs') - provides=("${pkgbase}-pgsql=$pkgver") + pkgdesc="PostgreSQL modules for ${pkgbase}" + depends=("${_ext_depends_pgsql[@]}") + _install_module pgsql + _install_module pdo_pgsql +} + +# interbase +package_php71-interbase() { + pkgdesc="interbase module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" "libfbclient") + _install_module interbase +} + +# firebird +package_php71-firebird() { + pkgdesc="pdo_firebird module for ${pkgbase}" + depends=("${_ext_depends_firebird[@]}") + _install_module pdo_firebird +} + +# pdo_dblib +package_php71-dblib() { + depends=("${pkgbase}=${pkgver}" 'freetds') + pkgdesc="pdo_dblib module for ${pkgbase}" + _install_module pdo_dblib +} + +# mssql +package_php71-mssql() { + depends=("${pkgbase}=${pkgver}" 'freetds') + pkgdesc="mssql module for ${pkgbase}" + _install_module mssql +} + +# Dba +package_php71-dba() { + pkgdesc="dba module for ${pkgbase}" + depends=("${_ext_depends_dba[@]}") + _install_module dba +} + +############################################################################### +# PHP Modules: internationalization, text, datetime +############################################################################### + +# Intl +package_php71-intl() { + pkgdesc="intl module for ${pkgbase}" + depends=("${_ext_depends_intl[@]}") + if ((_build_with_custom_icu)); then + # Patch to proper path inside intl.so + patchelf --set-rpath "/usr/lib/${pkgbase}/icu${_pkgver_icu}/lib" "build-cli/modules/intl.so" + fi + _install_module intl +} + +# Recode +package_php71-recode() { + pkgdesc="recode module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'recode') + _install_module recode +} + +# gettext +package_php71-gettext() { + pkgdesc="gettext module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module gettext +} + +# iconv +package_php71-iconv() { + pkgdesc="iconv module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module iconv +} + +# calendar +package_php71-calendar() { + pkgdesc="calendar module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module calendar +} + + +############################################################################### +# PHP Modules: multimedia +############################################################################### + +# GD +package_php71-gd() { + pkgdesc="gd module for ${pkgbase}" + depends=("${_ext_depends_gd[@]}") + _install_module gd +} + +# exif +package_php71-exif() { + pkgdesc="exif module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module exif +} + +# fileinfo +package_php71-fileinfo() { + pkgdesc="fileinfo module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module fileinfo +} + + +############################################################################### +# PHP modules: math +############################################################################### + +# bcmath +package_php71-bcmath() { + pkgdesc="bcmath module for ${pkgbase}" + depends=("${pkgbase}") + _install_module bcmath +} + +# gmp +package_php71-gmp() { + pkgdesc="gmp module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'gmp') + _install_module gmp +} - install -D -m755 build/modules/pgsql.so ${pkgdir}/usr/lib/${pkgbase}/modules/pgsql.so - install -D -m755 build/modules/pdo_pgsql.so ${pkgdir}/usr/lib/${pkgbase}/modules/pdo_pgsql.so +############################################################################### +# PHP modules: spell checking +############################################################################### + +# Enchant +package_php71-enchant() { + pkgdesc="enchant module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'enchant' 'libvoikko' 'hspell' 'hunspell' 'nuspell' 'aspell') + _install_module enchant } +# Pspell package_php71-pspell() { - pkgdesc='pspell module for PHP' - depends=("${pkgbase}" 'aspell') - provides=("${pkgbase}-pspell=$pkgver") + pkgdesc="pspell module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'aspell') + _install_module pspell +} + +############################################################################### +# PHP modules: compression +############################################################################### + +# bz2 +package_php71-bz2() { + pkgdesc="bz2 module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'bzip2') + _install_module bz2 +} + +# Zip +package_php71-zip() { + pkgdesc="zip module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libzip') + _install_module zip +} + +############################################################################### +# PHP modules: network client/servers +############################################################################### + +# curl +package_php71-curl() { + pkgdesc="curl module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" "curl") + _install_module curl +} + +# SOAP +package_php71-soap() { + pkgdesc="soap module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libxml2') + _install_module soap +} - install -D -m755 build/modules/pspell.so ${pkgdir}/usr/lib/${pkgbase}/modules/pspell.so +# FTP +package_php71-ftp() { + pkgdesc="FTP module for ${pkgbase}" + depends=("${_ext_depends_ftp[@]}") + _install_module ftp } +# ldap +package_php71-ldap() { + pkgdesc="ldap module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libldap' 'libsasl') + _install_module ldap +} + +# SNMP package_php71-snmp() { - pkgdesc='snmp module for PHP' - depends=("${pkgbase}" 'net-snmp') - provides=("${pkgbase}-snmp=$pkgver") + pkgdesc="snmp module for ${pkgbase}" + depends=("${_ext_depends_snmp[@]}") + _install_module snmp +} - install -D -m755 build/modules/snmp.so ${pkgdir}/usr/lib/${pkgbase}/modules/snmp.so +# XML-RPC +package_php71-xmlrpc() { + pkgdesc="xmlrpc module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libxml2') + _install_module xmlrpc } -package_php71-sqlite() { - pkgdesc='sqlite module for PHP' - depends=("${pkgbase}" 'sqlite') - provides=("${pkgbase}-sqlite=$pkgver") +# Imap +package_php71-imap() { + pkgdesc="imap module for ${pkgbase}" + depends=("${_ext_depends_imap[@]}") + _install_module imap +} - install -D -m755 build/modules/sqlite3.so ${pkgdir}/usr/lib/${pkgbase}/modules/sqlite3.so - install -D -m755 build/modules/pdo_sqlite.so ${pkgdir}/usr/lib/${pkgbase}/modules/pdo_sqlite.so +# sockets +package_php71-sockets() { + pkgdesc="sockets module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module sockets } -package_php71-tidy() { - pkgdesc='tidy module for PHP' - depends=("${pkgbase}" 'tidyhtml') - provides=("${pkgbase}-tidy=$pkgver") +############################################################################### +# PHP Modules: cryptography +############################################################################### - install -D -m755 build/modules/tidy.so ${pkgdir}/usr/lib/${pkgbase}/modules/tidy.so +# Sodium +package_php71-sodium() { + pkgdesc="sodium (libsodium) module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" "libsodium") + _install_module sodium } -package_php71-xsl() { - pkgdesc='xsl module for PHP' - depends=("${pkgbase}" 'libxslt') - provides=("${pkgbase}-xsl=$pkgver") +# Mcrypt +package_php71-mcrypt() { + pkgdesc="mcrypt module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libmcrypt') + _install_module mcrypt +} + + +############################################################################### +# PHP Zend modules: opcache/jit +############################################################################### - install -D -m755 build/modules/xsl.so ${pkgdir}/usr/lib/${pkgbase}/modules/xsl.so +# Opcache +package_php71-opcache() { + pkgdesc="opcache zend module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module opcache } + +############################################################################### +# PHP posix, pcntl, shmop and System V modules +############################################################################### + +# posix +package_php71-posix() { + pkgdesc="posix module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module posix +} + +# pcntl +package_php71-pcntl() { + pkgdesc="pcntl module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module pcntl +} + +# shmop +package_php71-shmop() { + pkgdesc="shmop module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module shmop +} + +# sysvmsg +package_php71-sysvmsg() { + pkgdesc="sysvmsg module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module sysvmsg +} + +# sysvsem +package_php71-sysvsem() { + pkgdesc="sysvsem module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module sysvsem +} + +# sysvshm +package_php71-sysvshm() { + pkgdesc="sysvshm module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module sysvshm +} + +############################################################################### +# PHP Misc modules +############################################################################### + +# Ffi +package_php71-ffi() { + pkgdesc="ffi module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libffi') + _install_module ffi +} + +# ctype +package_php71-ctype() { + pkgdesc="ctype module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module ctype +} + +# tokenizer +package_php71-tokenizer() { + pkgdesc="tokenizer module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}") + _install_module tokenizer +} + +# libedit/readline +package_php71-readline() { + pkgdesc="readline (libedit version) module for ${pkgbase}" + depends=("${pkgbase}=${pkgver}" 'libedit') + _install_module readline +} + + +sha256sums=('0b7e98dca9c996ec10cb9b3f6296bb7547c68797fd5f35006fdfd3e97700672d' + 'ba72fc64f77822755a469314160d5889d5298f4eb5758dd7939dac9b811afe52' + '6d0ad9becb5470ce8e5929d7d45660b0f32579038978496317544c5310281a91' + 'bd7c0a9bd5433289ee01fd440af3715309faf583f75832b64fe169c100d52968' + 'ee6529d441b2446d784e80aba23aa956541e541bd73ad54aee480d4a1a6117ca' + 'd175f0c14fdb22855090c93f76e18f04320d7bf15afc057ffde947f9bb361242' + 'f5ae925036744a5e88cea2698879aea0498e1e23aee7801923d90f16be383908' + '0a3a6e8ff04ff1e0869befcf2c7bca4e886d94065da6d7a10b809a4750b961a0' + '52c5a93fb03fa8f3f99438eb803b3182766ee04e0e6b76f00b0bc848d03ff6a6' + '3049b76460c65a70017ba2aac8f8c45725df2bbea458a96ec7164db63639e87f' + 'e07ebf146cea8e734c7704ba94f18279642df2b2f09d868781746d165041b8d5' + 'ed3184d5a6f7a3bf35ee32169f8dc3b6cba09c38f60e868e24652fe9a7dd844d' + 'c9f3b0dff07a7e9688f60b92a2a15817bd7cd59a8c5278cae629d856be66de5c' + '884b78ca63db5d8998e2e414b3e9e2a215e95890cf4a460fd7206aa9dd3db6ec' + '558e780e93dfa861a366c49b4d156d8fc43f17898f001ae6033ec63c33d5d41c' + '40bcc1e5058602302198d0925e431495391d8469499593af477f59d84d32f764' + '68350399aa196592e1d328deb48068c4b011b6f95cdd90299602c48c82af379d') diff --git a/apache.conf b/apache.conf deleted file mode 100644 index dd5acf40b589..000000000000 --- a/apache.conf +++ /dev/null @@ -1,13 +0,0 @@ -# Required modules: dir_module, php7_module - -<IfModule dir_module> - <IfModule php7_module> - DirectoryIndex index.php index.html - <FilesMatch "\.php$"> - SetHandler application/x-httpd-php - </FilesMatch> - <FilesMatch "\.phps$"> - SetHandler application/x-httpd-php-source - </FilesMatch> - </IfModule> -</IfModule>
\ No newline at end of file diff --git a/apache.patch b/apache.patch deleted file mode 100644 index aae3e3d9ac96..000000000000 --- a/apache.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- sapi/apache2handler/config.m4.orig -+++ sapi/apache2handler/config.m4 -@@ -122,7 +122,6 @@ - PHP_BUILD_THREAD_SAFE - fi - else -- APACHE_THREADED_MPM=`$APXS_HTTPD -V | grep 'threaded:.*yes'` - if test -n "$APACHE_THREADED_MPM"; then - PHP_BUILD_THREAD_SAFE - fi ---- configure.orig -+++ configure -@@ -6919,7 +6919,6 @@ - - fi - else -- APACHE_THREADED_MPM=`$APXS_HTTPD -V | grep 'threaded:.*yes'` - if test -n "$APACHE_THREADED_MPM"; then - - enable_maintainer_zts=yes diff --git a/debian-php-7.1.33.patch b/debian-php-7.1.33.patch new file mode 100644 index 000000000000..06129eafbb06 --- /dev/null +++ b/debian-php-7.1.33.patch @@ -0,0 +1,1890 @@ + +diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c +index 17dcdb1..5c1d514 100644 +--- a/ext/standard/proc_open.c ++++ b/ext/standard/proc_open.c +@@ -62,7 +62,7 @@ + * */ + #ifdef PHP_CAN_SUPPORT_PROC_OPEN + +-#if 0 && HAVE_PTSNAME && HAVE_GRANTPT && HAVE_UNLOCKPT && HAVE_SYS_IOCTL_H && HAVE_TERMIOS_H ++#if HAVE_PTSNAME && HAVE_GRANTPT && HAVE_UNLOCKPT && HAVE_SYS_IOCTL_H && HAVE_TERMIOS_H + # include <sys/ioctl.h> + # include <termios.h> + # define PHP_CAN_DO_PTS 1 +diff --git a/php.ini-development b/php.ini-development +index 654968b..d78d2f4 100644 +--- a/php.ini-development ++++ b/php.ini-development +@@ -306,6 +306,12 @@ + ; and below. This directive makes most sense if used in a per-directory + ; or per-virtualhost web server configuration file. + ; http://php.net/open-basedir ++ ++; NOTE: this is considered a "broken" security measure. ++; Applications relying on this feature will not receive full ++; support by the security team. For more information please ++; see /usr/share/doc/php-common/README.Debian.security ++; + ;open_basedir = + + ; This directive allows you to disable certain functions for security reasons. +diff --git a/ext/dba/config.m4 b/ext/dba/config.m4 +index ced02de..64e1661 100644 +--- a/ext/dba/config.m4 ++++ b/ext/dba/config.m4 +@@ -312,61 +312,13 @@ + dbdp4="/usr/local/BerkeleyDB.4." + dbdp5="/usr/local/BerkeleyDB.5." + for i in $PHP_DB4 ${dbdp5}1 ${dbdp5}0 ${dbdp4}8 ${dbdp4}7 ${dbdp4}6 ${dbdp4}5 ${dbdp4}4 ${dbdp4}3 ${dbdp4}2 ${dbdp4}1 ${dbdp}0 /usr/local /usr; do +- if test -f "$i/db5/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/db5/db.h +- break +- elif test -f "$i/db4/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/db4/db.h +- break +- elif test -f "$i/include/db5.3/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db5.3/db.h +- break +- elif test -f "$i/include/db5.1/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db5.1/db.h +- break +- elif test -f "$i/include/db5.0/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db5.0/db.h +- break +- elif test -f "$i/include/db4.8/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4.8/db.h +- break +- elif test -f "$i/include/db4.7/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4.7/db.h +- break +- elif test -f "$i/include/db4.6/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4.6/db.h +- break +- elif test -f "$i/include/db4.5/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4.5/db.h +- break +- elif test -f "$i/include/db4/db.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4/db.h +- break +- elif test -f "$i/include/db/db4.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db/db4.h +- break +- elif test -f "$i/include/db4.h"; then +- THIS_PREFIX=$i +- THIS_INCLUDE=$i/include/db4.h +- break +- elif test -f "$i/include/db.h"; then ++ if test -f "$i/include/db.h"; then + THIS_PREFIX=$i + THIS_INCLUDE=$i/include/db.h + break + fi + done +- PHP_DBA_DB_CHECK(4, db-5.3 db-5.1 db-5.0 db-4.8 db-4.7 db-4.6 db-4.5 db-4.4 db-4.3 db-4.2 db-4.1 db-4.0 db-4 db4 db, [(void)db_create((DB**)0, (DB_ENV*)0, 0)]) ++ PHP_DBA_DB_CHECK(4, db, [(void)db_create((DB**)0, (DB_ENV*)0, 0)]) + fi + PHP_DBA_STD_RESULT(db4,Berkeley DB4) + +diff --git a/ext/dba/dba.c b/ext/dba/dba.c +index a36c679..b2de3b2 100644 +--- a/ext/dba/dba.c ++++ b/ext/dba/dba.c +@@ -52,6 +52,10 @@ + #include "php_qdbm.h" + #include "php_tcadb.h" + ++#ifdef DB4_INCLUDE_FILE ++#include DB4_INCLUDE_FILE ++#endif ++ + /* {{{ arginfo */ + ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2) + ZEND_ARG_INFO(0, path) +@@ -552,6 +556,10 @@ + + php_info_print_table_start(); + php_info_print_table_row(2, "DBA support", "enabled"); ++#ifdef DB_VERSION_STRING ++ php_info_print_table_row(2, "libdb header version", DB_VERSION_STRING); ++ php_info_print_table_row(2, "libdb library version", db_version(NULL, NULL, NULL)); ++#endif + if (handlers.s) { + smart_str_0(&handlers); + php_info_print_table_row(2, "Supported handlers", ZSTR_VAL(handlers.s)); +diff --git a/ext/mysqli/config.m4 b/ext/mysqli/config.m4 +index c5dfe5d..87dd43e 100644 +--- a/ext/mysqli/config.m4 ++++ b/ext/mysqli/config.m4 +@@ -59,7 +59,7 @@ + MYSQL_LIB_CFG='--libmysqld-libs' + dnl mysqlnd doesn't support embedded, so we have to add some extra stuff + mysqli_extra_sources="mysqli_embedded.c" +- elif test "$enable_maintainer_zts" = "yes"; then ++ elif true || test "$enable_maintainer_zts" = "yes"; then + MYSQL_LIB_CFG='--libs_r' + MYSQL_LIB_NAME='mysqlclient_r' + else +diff --git a/ext/pdo_mysql/config.m4 b/ext/pdo_mysql/config.m4 +index 96f0441..6828e1d 100755 +--- a/ext/pdo_mysql/config.m4 ++++ b/ext/pdo_mysql/config.m4 +@@ -67,7 +67,7 @@ + if test "x$SED" = "x"; then + AC_PATH_PROG(SED, sed) + fi +- if test "$enable_maintainer_zts" = "yes"; then ++ if true || test "$enable_maintainer_zts" = "yes"; then + PDO_MYSQL_LIBNAME=mysqlclient_r + PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs_r | $SED -e "s/'//g"` + else +--- /dev/null ++++ b/tests/func/null-new_val.phpt +@@ -0,0 +1,10 @@ ++--TEST-- ++ini_restore strcmp NULL new_val ++--FILE-- ++<?php ++ ++ini_set('error_log','ini_set_works'); ++ini_restore('error_log'); ++ ++?> ++--EXPECT-- +diff --git a/build/build.mk b/build/build.mk +index 1ce958f..b8c7492 100644 +--- a/build/build.mk ++++ b/build/build.mk +@@ -63,6 +63,5 @@ + @if (test ! -f '.git/info/exclude' || grep -s "git-ls-files" .git/info/exclude); then \ + (echo "Rebuild .git/info/exclude" && echo '*.o' > .git/info/exclude && git svn propget svn:ignore | grep -v config.nice >> .git/info/exclude); \ + fi; \ +- git clean -X -f -d; + + .PHONY: $(ALWAYS) snapshot +diff --git a/ext/dba/config.m4 b/ext/dba/config.m4 +index 64e1661..edc7d11 100644 +--- a/ext/dba/config.m4 ++++ b/ext/dba/config.m4 +@@ -113,6 +113,10 @@ + THIS_PREFIX=$i + THIS_INCLUDE=$i/include/depot.h + break ++ elif test -f "$i/include/qdbm/depot.h"; then ++ THIS_PREFIX=$i ++ THIS_INCLUDE=$i/include/qdbm/depot.h ++ break + fi + done + +diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in +index 86edaa8..19e66a0 100644 +--- a/sapi/fpm/php-fpm.8.in ++++ b/sapi/fpm/php-fpm.8.in +@@ -139,22 +139,8 @@ + .TP + .B php.ini + The standard php configuration file. +-.SH EXAMPLES +-For any unix systems which use init.d for their main process manager, you should use the init script provided to start and stop the php-fpm daemon. +-.P +-.PD 1 +-.RS +-sudo /etc/init.d/php-fpm start +-.RE +-.TP +-For any unix systems which use systemd for their main process manager, you should use the unit file provided to start and stop the php-fpm daemon. +-.P +-.PD 1 +-.RS +-sudo systemctl start php-fpm.service +-.RE +-.TP +-If your installation has no appropriate init script, launch php-fpm with no arguments. It will launch as a daemon (background process) by default. The file @php_fpm_localstatedir@/run/php-fpm.pid determines whether php-fpm is already up and running. Once started, php-fpm then responds to several POSIX signals: ++.SH SIGNAL ++Once started, php-fpm then responds to several POSIX signals: + .P + .PD 0 + .RS +@@ -168,10 +154,6 @@ + .RE + .PD 1 + .P +-.SH TIPS +-The PHP-FPM CGI daemon will work well with most popular webservers, including Apache2, lighttpd and nginx. +-.PD 1 +-.P + .SH SEE ALSO + The PHP-FPM website: + .PD 0 +diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c +index 7fdf906..76dd0dd 100644 +--- a/main/streams/plain_wrapper.c ++++ b/main/streams/plain_wrapper.c +@@ -693,7 +693,13 @@ + + switch (value) { + case PHP_STREAM_MMAP_SUPPORTED: +- return fd == -1 ? PHP_STREAM_OPTION_RETURN_ERR : PHP_STREAM_OPTION_RETURN_OK; ++ if (fd == -1) ++ return PHP_STREAM_OPTION_RETURN_ERR; ++ /* Don't mmap large files */ ++ do_fstat(data, 1); ++ if (data->sb.st_size > 4 * 1024 * 1024) ++ return PHP_STREAM_OPTION_RETURN_ERR; ++ return PHP_STREAM_OPTION_RETURN_OK; + + case PHP_STREAM_MMAP_MAP_RANGE: + if(do_fstat(data, 1) != 0) { +diff --git a/ext/dba/dba.c b/ext/dba/dba.c +index b2de3b2..51c5ccf 100644 +--- a/ext/dba/dba.c ++++ b/ext/dba/dba.c +@@ -940,7 +940,7 @@ + } + } + +- if (error || hptr->open(info, &error) != SUCCESS) { ++ if (error || (hptr->open)(info, &error) != SUCCESS) { + dba_close(info); + php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Driver initialization failed for handler: %s%s%s", hptr->name, error?": ":"", error?error:""); + FREENOW; +diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c +index dd1bcb8..aca3c93 100644 +--- a/ext/dba/dba_db3.c ++++ b/ext/dba/dba_db3.c +@@ -96,9 +96,9 @@ + dbp->set_errcall(dbp, php_dba_db3_errcall_fcn); + if( + #if (DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1)) +- (err=dbp->open(dbp, 0, info->path, NULL, type, gmode, filemode)) == 0) { ++ (err=(dbp->open)(dbp, 0, info->path, NULL, type, gmode, filemode)) == 0) { + #else +- (err=dbp->open(dbp, info->path, NULL, type, gmode, filemode)) == 0) { ++ (err=(dbp->open)(dbp, info->path, NULL, type, gmode, filemode)) == 0) { + #endif + dba_db3_data *data; + +diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c +index 63a69bd..a77cc22 100644 +--- a/ext/dba/dba_db4.c ++++ b/ext/dba/dba_db4.c +@@ -125,9 +125,9 @@ + dbp->set_errcall(dbp, php_dba_db4_errcall_fcn); + if ( + #if (DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1)) +- (err=dbp->open(dbp, 0, info->path, NULL, type, gmode, filemode)) == 0) { ++ (err=(dbp->open)(dbp, 0, info->path, NULL, type, gmode, filemode)) == 0) { + #else +- (err=dbp->open(dbp, info->path, NULL, type, gmode, filemode)) == 0) { ++ (err=(dbp->open)(dbp, info->path, NULL, type, gmode, filemode)) == 0) { + #endif + dba_db4_data *data; + +diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c +index ad825ce..50d8f34 100644 +--- a/ext/zlib/zlib.c ++++ b/ext/zlib/zlib.c +@@ -49,6 +49,18 @@ + int le_deflate; + int le_inflate; + ++/* ++ * zlib include files can define the following preprocessor defines which rename ++ * the corresponding PHP functions to gzopen64, gzseek64 and gztell64 and thereby ++ * breaking some software, most notably PEAR's Archive_Tar, which halts execution ++ * without error message on gzip compressed archivesa. ++ * ++ * This only seems to happen on 32bit systems with large file support. ++ */ ++#undef gzopen ++#undef gzseek ++#undef gztell ++ + ZEND_DECLARE_MODULE_GLOBALS(zlib); + + /* {{{ Memory management wrappers */ +diff --git a/ext/standard/tests/strings/setlocale_variation2.phpt b/ext/standard/tests/strings/setlocale_variation2.phpt +index fad3298..346c987 100644 +--- a/ext/standard/tests/strings/setlocale_variation2.phpt ++++ b/ext/standard/tests/strings/setlocale_variation2.phpt +@@ -55,6 +55,7 @@ + //try different locale names + $failure_locale = array(); + $success_count = 0; ++$expected = 0; + + echo "-- Test setlocale() with all available locale in the system --\n"; + // gather all locales installed in the system(stored $all_system_locales), +@@ -64,6 +65,10 @@ + if(setlocale(LC_ALL,$value )){ + $success_count++; + } ++ else if ($value == 'no_NO.ISO-8859-1') { ++ // ignore this one, see rhbz #971416 ++ $expected++; ++ } + else{ + //failure values are put in to an array $failure_locale + $failure_locale[] = $value; +@@ -72,11 +77,11 @@ + + echo "No of locales found on the machine = ".count($all_system_locales)."\n"; + echo "No of setlocale() success = ".$success_count."\n"; +-echo "Expected no of failures = 0\n"; ++echo "Expected no of failures = $expected\n"; + echo "Test "; + // check if there were any failure of setlocale() function earlier, if any + // failure then dump the list of failing locales +-if($success_count != count($all_system_locales)){ ++if($success_count + $expected != count($all_system_locales)){ + echo "FAILED\n"; + echo "Names of locale() for which setlocale() failed ...\n"; + var_dump($failure_locale); +@@ -92,6 +97,6 @@ + -- Test setlocale() with all available locale in the system -- + No of locales found on the machine = %d + No of setlocale() success = %d +-Expected no of failures = 0 ++Expected no of failures = %d + Test PASSED + Done +diff --git a/ext/pcre/tests/bug37911.phpt b/ext/pcre/tests/bug37911.phpt +index 2b7481a..0d2859d 100644 +--- a/ext/pcre/tests/bug37911.phpt ++++ b/ext/pcre/tests/bug37911.phpt +@@ -37,5 +37,5 @@ + string(4) "blub" + } + +-Warning: preg_replace_callback(): Compilation failed: group name must start with a non-digit at offset %d in %sbug37911.php on line %d ++Warning: preg_replace_callback(): Numeric named subpatterns are not allowed in %sbug37911.php on line %d + NULL +diff --git a/ext/pcre/tests/grep2.phpt b/ext/pcre/tests/grep2.phpt +index 1a8476c..0cf8d4a 100644 +--- a/ext/pcre/tests/grep2.phpt ++++ b/ext/pcre/tests/grep2.phpt +@@ -40,12 +40,6 @@ + string(1) "1" + } + bool(true) +-array(3) { +- [5]=> +- string(1) "a" +- ["xyz"]=> +- string(2) "q6" +- [6]=> +- string(3) "h20" ++array(0) { + } +-bool(false) ++bool(true) +diff --git a/ext/pcre/tests/match_flags3.phpt b/ext/pcre/tests/match_flags3.phpt +index 695f0c1..05c62a0 100644 +--- a/ext/pcre/tests/match_flags3.phpt ++++ b/ext/pcre/tests/match_flags3.phpt +@@ -41,5 +41,5 @@ + } + } + +-Warning: preg_match(): Compilation failed: group name must start with a non-digit at offset %d in %smatch_flags3.php on line %d ++Warning: preg_match(): Numeric named subpatterns are not allowed in %smatch_flags3.php on line %d + bool(false) +diff --git a/ext/curl/config.m4 b/ext/curl/config.m4 +index 1ad688f..59fb585 100644 +--- a/ext/curl/config.m4 ++++ b/ext/curl/config.m4 +@@ -6,12 +6,12 @@ + [ --with-curl[=DIR] Include cURL support]) + + if test "$PHP_CURL" != "no"; then +- if test -r $PHP_CURL/include/curl/easy.h; then ++ if test -r $PHP_CURL/include/$DEB_HOST_MULTIARCH/curl/easy.h || test -r $PHP_CURL/include/curl/easy.h; then + CURL_DIR=$PHP_CURL + else + AC_MSG_CHECKING(for cURL in default path) + for i in /usr/local /usr; do +- if test -r $i/include/curl/easy.h; then ++ if test -r $i/include/$DEB_HOST_MULTIARCH/curl/easy.h || test -r $i/include/curl/easy.h; then + CURL_DIR=$i + AC_MSG_RESULT(found in $i) + break +diff --git a/ext/readline/config.m4 b/ext/readline/config.m4 +index d63df8b..62e873b 100644 +--- a/ext/readline/config.m4 ++++ b/ext/readline/config.m4 +@@ -67,6 +67,13 @@ + -L$READLINE_DIR/$PHP_LIBDIR $PHP_READLINE_LIBS + ]) + ++ PHP_CHECK_LIBRARY(readline, rl_completion_matches, ++ [ ++ AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, [ ]) ++ ],[],[ ++ -L$READLINE_DIR/$PHP_LIBDIR $PHP_READLINE_LIBS ++ ]) ++ + AC_DEFINE(HAVE_LIBREADLINE, 1, [ ]) + + elif test "$PHP_LIBEDIT" != "no"; then +@@ -114,11 +121,17 @@ + -L$READLINE_DIR/$PHP_LIBDIR + ]) + ++ PHP_CHECK_LIBRARY(edit, rl_completion_matches, ++ [ ++ AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, [ ]) ++ ],[],[ ++ -L$READLINE_DIR/$PHP_LIBDIR $PHP_READLINE_LIBS ++ ]) ++ + AC_DEFINE(HAVE_LIBEDIT, 1, [ ]) + fi + + if test "$PHP_READLINE" != "no" || test "$PHP_LIBEDIT" != "no"; then +- AC_CHECK_FUNCS([rl_completion_matches]) + PHP_NEW_EXTENSION(readline, readline.c readline_cli.c, $ext_shared, cli) + PHP_SUBST(READLINE_SHARED_LIBADD) + fi +diff --git a/ext/fileinfo/libmagic/cdf.c b/ext/fileinfo/libmagic/cdf.c +index 28084fb..01af1e4 100644 +--- a/ext/fileinfo/libmagic/cdf.c ++++ b/ext/fileinfo/libmagic/cdf.c +@@ -872,8 +872,9 @@ + i, inp[i].pi_id, inp[i].pi_type, q - p, offs)); + if (inp[i].pi_type & CDF_VECTOR) { + nelements = CDF_GETUINT32(q, 1); +- if (nelements == 0) { +- DPRINTF(("CDF_VECTOR with nelements == 0\n")); ++ if (nelements > CDF_ELEMENT_LIMIT || nelements == 0) { ++ DPRINTF(("CDF_VECTOR with nelements == %" ++ SIZE_T_FORMAT "u\n", nelements)); + goto out; + } + o = 2; +@@ -948,8 +949,6 @@ + *info = inp; + inp = *info + nelem; + } +- DPRINTF(("nelements = %" SIZE_T_FORMAT "u\n", +- nelements)); + for (j = 0; j < nelements && i < sh.sh_properties; + j++, i++) + { +diff --git a/ext/fileinfo/libmagic/cdf.h b/ext/fileinfo/libmagic/cdf.h +index 9006a68..6ad5bce 100644 +--- a/ext/fileinfo/libmagic/cdf.h ++++ b/ext/fileinfo/libmagic/cdf.h +@@ -50,6 +50,7 @@ + typedef int32_t cdf_secid_t; + + #define CDF_LOOP_LIMIT 10000 ++#define CDF_ELEMENT_LIMIT 100000 + + #define CDF_SECID_NULL 0 + #define CDF_SECID_FREE -1 +diff --git a/ext/standard/string.c b/ext/standard/string.c +index 922d4fc..c88135d 100644 +--- a/ext/standard/string.c ++++ b/ext/standard/string.c +@@ -4781,7 +4781,7 @@ + if (state == 4) { + /* Inside <!-- comment --> */ + break; +- } else if (state == 2 && *(p-1) != '\\') { ++ } else if (state == 2 && p >= buf + 1 && *(p-1) != '\\') { + if (lc == c) { + lc = '\0'; + } else if (lc != '\\') { +@@ -4808,7 +4808,7 @@ + + case '!': + /* JavaScript & Other HTML scripting languages */ +- if (state == 1 && *(p-1) == '<') { ++ if (state == 1 && p >= buf + 1 && *(p-1) == '<') { + state = 3; + lc = c; + } else { +@@ -4835,7 +4835,7 @@ + + case '?': + +- if (state == 1 && *(p-1) == '<') { ++ if (state == 1 && p >= buf + 1 && *(p-1) == '<') { + br=0; + state=2; + break; +--- /dev/null ++++ b/ext/standard/tests/file/bug79099.phpt +@@ -0,0 +1,32 @@ ++--TEST-- ++Bug #79099 (OOB read in php_strip_tags_ex) ++--FILE-- ++<?php ++$stream = fopen('php://memory', 'w+'); ++fputs($stream, "<?\n\"\n"); ++rewind($stream); ++var_dump(fgetss($stream)); ++var_dump(fgetss($stream)); ++fclose($stream); ++ ++$stream = fopen('php://memory', 'w+'); ++fputs($stream, "<\0\n!\n"); ++rewind($stream); ++var_dump(fgetss($stream)); ++var_dump(fgetss($stream)); ++fclose($stream); ++ ++$stream = fopen('php://memory', 'w+'); ++fputs($stream, "<\0\n?\n"); ++rewind($stream); ++var_dump(fgetss($stream)); ++var_dump(fgetss($stream)); ++fclose($stream); ++?> ++--EXPECT-- ++string(0) "" ++string(0) "" ++string(0) "" ++string(0) "" ++string(0) "" ++string(0) "" +diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c +index f5ab880..5e1ca81 100644 +--- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c ++++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c +@@ -138,6 +138,17 @@ + {0xf70f,0xf848,0xc740,0xc8fe}, + }; + ++static inline int is_in_cp950_pua(int c1, int c) { ++ if ((c1 >= 0xfa && c1 <= 0xfe) || (c1 >= 0x8e && c1 <= 0xa0) || ++ (c1 >= 0x81 && c1 <= 0x8d) || (c1 >= 0xc7 && c1 <= 0xc8)) { ++ return (c >=0x40 && c <= 0x7e) || (c >= 0xa1 && c <= 0xfe); ++ } ++ if (c1 == 0xc6) { ++ return c >= 0xa1 && c <= 0xfe; ++ } ++ return 0; ++} ++ + /* + * Big5 => wchar + */ +@@ -186,11 +197,7 @@ + + if (filter->from->no_encoding == mbfl_no_encoding_cp950) { + /* PUA for CP950 */ +- if (w <= 0 && +- (((c1 >= 0xfa && c1 <= 0xfe) || (c1 >= 0x8e && c1 <= 0xa0) || +- (c1 >= 0x81 && c1 <= 0x8d) ||(c1 >= 0xc7 && c1 <= 0xc8)) +- && ((c > 0x39 && c < 0x7f) || (c > 0xa0 && c < 0xff))) || +- ((c1 == 0xc6) && (c > 0xa0 && c < 0xff))) { ++ if (w <= 0 && is_in_cp950_pua(c1, c)) { + c2 = c1 << 8 | c; + for (k = 0; k < sizeof(cp950_pua_tbl)/(sizeof(unsigned short)*4); k++) { + if (c2 >= cp950_pua_tbl[k][2] && c2 <= cp950_pua_tbl[k][3]) { +--- /dev/null ++++ b/ext/mbstring/tests/bug79037.phpt +@@ -0,0 +1,10 @@ ++--TEST-- ++Bug #79037: global buffer-overflow in `mbfl_filt_conv_big5_wchar` ++--FILE-- ++<?php ++ ++var_dump(mb_convert_encoding("\x81\x3a", "UTF-8", "CP950")); ++ ++?> ++--EXPECT-- ++string(1) "?" +diff --git a/ext/standard/string.c b/ext/standard/string.c +index c88135d..018e919 100644 +--- a/ext/standard/string.c ++++ b/ext/standard/string.c +@@ -4731,7 +4731,7 @@ + switch (state) { + case 1: /* HTML/XML */ + lc = '>'; +- if (is_xml && *(p -1) == '-') { ++ if (is_xml && p >= buf + 1 && *(p-1) == '-') { + break; + } + in_q = state = is_xml = 0; +@@ -4752,7 +4752,7 @@ + break; + + case 2: /* PHP */ +- if (!br && lc != '\"' && *(p-1) == '?') { ++ if (!br && lc != '\"' && p >= buf + 1 && *(p-1) == '?') { + in_q = state = 0; + tp = tbuf; + } +diff --git a/ext/session/session.c b/ext/session/session.c +index bf8797a..d3226ee 100644 +--- a/ext/session/session.c ++++ b/ext/session/session.c +@@ -2999,9 +2999,11 @@ + if (PS(rfc1867_cleanup)) { + php_session_rfc1867_cleanup(progress); + } else { +- add_assoc_bool_ex(&progress->data, "done", sizeof("done") - 1, 1); +- Z_LVAL_P(progress->post_bytes_processed) = data->post_bytes_processed; +- php_session_rfc1867_update(progress, 1); ++ if (!Z_ISUNDEF(progress->data)) { ++ add_assoc_bool_ex(&progress->data, "done", sizeof("done") - 1, 1); ++ Z_LVAL_P(progress->post_bytes_processed) = data->post_bytes_processed; ++ php_session_rfc1867_update(progress, 1); ++ } + } + php_rshutdown_session_globals(); + } +--- /dev/null ++++ b/ext/session/tests/bug79221.phpt +@@ -0,0 +1,45 @@ ++--TEST-- ++Null Pointer Dereference in PHP Session Upload Progress ++--INI-- ++error_reporting=0 ++file_uploads=1 ++upload_max_filesize=1024 ++session.save_path= ++session.name=PHPSESSID ++session.serialize_handler=php ++session.use_strict_mode=0 ++session.use_cookies=1 ++session.use_only_cookies=0 ++session.upload_progress.enabled=1 ++session.upload_progress.cleanup=0 ++session.upload_progress.prefix=upload_progress_ ++session.upload_progress.name=PHP_SESSION_UPLOAD_PROGRESS ++session.upload_progress.freq=1% ++session.upload_progress.min_freq=0.000000001 ++--COOKIE-- ++PHPSESSID=session-upload ++--POST_RAW-- ++Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737 ++-----------------------------20896060251896012921717172737 ++Content-Disposition: form-data; name="PHPSESSID" ++ ++session-upload ++-----------------------------20896060251896012921717172737 ++Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS" ++ ++ryat ++-----------------------------20896060251896012921717172737 ++Content-Disposition: form-data; file="file"; ryat="filename" ++ ++1 ++-----------------------------20896060251896012921717172737-- ++--FILE-- ++<?php ++ ++session_start(); ++var_dump($_SESSION); ++session_destroy(); ++ ++--EXPECTF-- ++array(0) { ++} +diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c +index c1ba97a..b22a6ac 100644 +--- a/ext/phar/phar_object.c ++++ b/ext/phar/phar_object.c +@@ -1439,6 +1439,7 @@ + char *str_key; + zend_class_entry *ce = p_obj->c; + phar_archive_object *phar_obj = p_obj->p; ++ php_stream_statbuf ssb; + + value = iter->funcs->get_current_data(iter); + +@@ -1718,6 +1719,16 @@ + php_stream_copy_to_stream_ex(fp, p_obj->fp, PHP_STREAM_COPY_ALL, &contents_len); + data->internal_file->uncompressed_filesize = data->internal_file->compressed_filesize = + php_stream_tell(p_obj->fp) - data->internal_file->offset; ++ if (php_stream_stat(fp, &ssb) != -1) { ++ data->internal_file->flags = ssb.sb.st_mode & PHAR_ENT_PERM_MASK ; ++ } else { ++#ifndef _WIN32 ++ mode_t mask; ++ mask = umask(0); ++ umask(mask); ++ data->internal_file->flags &= ~mask; ++#endif ++ } + } + + if (close_fp) { +--- /dev/null ++++ b/ext/phar/tests/bug79082.phpt +@@ -0,0 +1,52 @@ ++--TEST-- ++Phar: Bug #79082: Files added to tar with Phar::buildFromIterator have all-access permissions ++--SKIPIF-- ++<?php ++if (!extension_loaded("phar")) die("skip"); ++if (defined("PHP_WINDOWS_VERSION_MAJOR")) die("skip not for Windows") ++?> ++--FILE-- ++<?php ++umask(022); ++var_dump(decoct(umask())); ++chmod(__DIR__ . '/test79082/test79082-testfile', 0644); ++chmod(__DIR__ . '/test79082/test79082-testfile2', 0400); ++ ++foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) { ++ clearstatcache(); ++ $phar = new PharData(__DIR__ . '/test79082.' . $ext, null, null, $mode); ++ $phar->buildFromIterator(new \RecursiveDirectoryIterator(__DIR__ . '/test79082', \FilesystemIterator::SKIP_DOTS), __DIR__ . '/test79082'); ++ $phar->extractTo(__DIR__); ++ var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode'])); ++ var_dump(decoct(stat(__DIR__ . '/test79082-testfile2')['mode'])); ++ unlink(__DIR__ . '/test79082-testfile'); ++ unlink(__DIR__ . '/test79082-testfile2'); ++} ++foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) { ++ clearstatcache(); ++ $phar = new PharData(__DIR__ . '/test79082-d.' . $ext, null, null, $mode); ++ $phar->buildFromDirectory(__DIR__ . '/test79082'); ++ $phar->extractTo(__DIR__); ++ var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode'])); ++ var_dump(decoct(stat(__DIR__ . '/test79082-testfile2')['mode'])); ++ unlink(__DIR__ . '/test79082-testfile'); ++ unlink(__DIR__ . '/test79082-testfile2'); ++} ++?> ++--CLEAN-- ++<? ++unlink(__DIR__ . '/test79082.tar'); ++unlink(__DIR__ . '/test79082.zip'); ++unlink(__DIR__ . '/test79082-d.tar'); ++unlink(__DIR__ . '/test79082-d.zip'); ++?> ++--EXPECT-- ++string(2) "22" ++string(6) "100644" ++string(6) "100400" ++string(6) "100644" ++string(6) "100400" ++string(6) "100644" ++string(6) "100400" ++string(6) "100644" ++string(6) "100400" +--- /dev/null ++++ b/ext/phar/tests/test79082/test79082-testfile +@@ -0,0 +1 @@ ++test +--- /dev/null ++++ b/ext/phar/tests/test79082/test79082-testfile2 +@@ -0,0 +1 @@ ++test +diff --git a/ext/exif/exif.c b/ext/exif/exif.c +index 406fee4..9130cea 100644 +--- a/ext/exif/exif.c ++++ b/ext/exif/exif.c +@@ -3243,6 +3243,11 @@ + { + unsigned exif_value_2a, offset_of_ifd; + ++ if (length < 2) { ++ exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Missing TIFF alignment marker"); ++ return; ++ } ++ + /* set the thumbnail stuff to nothing so we can test to see if they get set up */ + if (memcmp(CharBuf, "II", 2) == 0) { + ImageInfo->motorola_intel = 0; +@@ -3395,7 +3400,7 @@ + return FALSE; + } + +- sn = exif_file_sections_add(ImageInfo, marker, itemlen+1, NULL); ++ sn = exif_file_sections_add(ImageInfo, marker, itemlen, NULL); + Data = ImageInfo->file.list[sn].data; + + /* Store first two pre-read bytes. */ +--- /dev/null ++++ b/ext/exif/tests/bug79282.phpt +@@ -0,0 +1,15 @@ ++--TEST-- ++Bug #79282: Use-of-uninitialized-value in exif ++--FILE-- ++<?php ++ ++var_dump(exif_read_data('data://image/jpeg;base64,/9jhAAlFeGlmAAAg')); ++ ++?> ++--EXPECTF-- ++Warning: exif_read_data(): Invalid TIFF alignment marker in %s on line %d ++ ++Warning: exif_read_data(): File structure corrupted in %s on line %d ++ ++Warning: exif_read_data(): Invalid JPEG file in %s on line %d ++bool(false) +diff --git a/ext/standard/exec.c b/ext/standard/exec.c +index 8af1180..02d9539 100644 +--- a/ext/standard/exec.c ++++ b/ext/standard/exec.c +@@ -524,6 +524,15 @@ + return; + } + ++ if (!command_len) { ++ php_error_docref(NULL, E_WARNING, "Cannot execute a blank command"); ++ RETURN_FALSE; ++ } ++ if (strlen(command) != command_len) { ++ php_error_docref(NULL, E_WARNING, "NULL byte detected. Possible attack"); ++ RETURN_FALSE; ++ } ++ + #ifdef PHP_WIN32 + if ((in=VCWD_POPEN(command, "rt"))==NULL) { + #else +diff --git a/ext/standard/url.c b/ext/standard/url.c +index 39e5b1b..4cc1f77 100644 +--- a/ext/standard/url.c ++++ b/ext/standard/url.c +@@ -540,7 +540,7 @@ + #ifndef CHARSET_EBCDIC + *dest = (char) php_htoi(data + 1); + #else +- *dest = os_toebcdic[(char) php_htoi(data + 1)]; ++ *dest = os_toebcdic[(unsigned char) php_htoi(data + 1)]; + #endif + data += 2; + len -= 2; +@@ -632,7 +632,7 @@ + #ifndef CHARSET_EBCDIC + *dest = (char) php_htoi(data + 1); + #else +- *dest = os_toebcdic[(char) php_htoi(data + 1)]; ++ *dest = os_toebcdic[(unsigned char) php_htoi(data + 1)]; + #endif + data += 2; + len -= 2; +diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c +index cdf77f2..8f0c5db 100644 +--- a/ext/zip/php_zip.c ++++ b/ext/zip/php_zip.c +@@ -1454,6 +1454,21 @@ + ze_obj->filename = NULL; + } + ++#if LIBZIP_VERSION_MAJOR > 1 || LIBZIP_VERSION_MAJOR == 1 && LIBZIP_VERSION_MINOR >= 6 ++ /* reduce BC break introduce in libzip 1.6.0 ++ "Do not accept empty files as valid zip archives any longer" */ ++ ++ /* open for write without option to empty the archive */ ++ if ((flags & (ZIP_TRUNCATE | ZIP_RDONLY)) == 0) { ++ zend_stat_t st; ++ ++ /* exists and is empty */ ++ if (VCWD_STAT(resolved_path, &st) == 0 && st.st_size == 0) { ++ flags |= ZIP_TRUNCATE; ++ } ++ } ++#endif ++ + intern = zip_open(resolved_path, flags, &err); + if (!intern || err) { + efree(resolved_path); +diff --git a/main/rfc1867.c b/main/rfc1867.c +index b930e07..14ffbea 100644 +--- a/main/rfc1867.c ++++ b/main/rfc1867.c +@@ -692,7 +692,8 @@ + char *boundary, *s = NULL, *boundary_end = NULL, *start_arr = NULL, *array_index = NULL; + char *lbuf = NULL, *abuf = NULL; + zend_string *temp_filename = NULL; +- int boundary_len = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0; ++ int boundary_len = 0, cancel_upload = 0, is_arr_upload = 0; ++ size_t array_len = 0; + int64_t total_bytes = 0, max_file_size = 0; + int skip_upload = 0, anonindex = 0, is_anonymous; + HashTable *uploaded_files = NULL; +@@ -1126,7 +1127,7 @@ + is_arr_upload = (start_arr = strchr(param,'[')) && (param[strlen(param)-1] == ']'); + + if (is_arr_upload) { +- array_len = (int)strlen(start_arr); ++ array_len = strlen(start_arr); + if (array_index) { + efree(array_index); + } +diff --git a/main/rfc1867.c b/main/rfc1867.c +index 14ffbea..1742b9c 100644 +--- a/main/rfc1867.c ++++ b/main/rfc1867.c +@@ -616,7 +616,7 @@ + } + + /* read until a boundary condition */ +-static int multipart_buffer_read(multipart_buffer *self, char *buf, size_t bytes, int *end) ++static size_t multipart_buffer_read(multipart_buffer *self, char *buf, size_t bytes, int *end) + { + size_t len, max; + char *bound; +@@ -655,7 +655,7 @@ + self->buf_begin += len; + } + +- return (int)len; ++ return len; + } + + /* +@@ -665,7 +665,7 @@ + static char *multipart_buffer_read_body(multipart_buffer *self, size_t *len) + { + char buf[FILLUNIT], *out=NULL; +- int total_bytes=0, read_bytes=0; ++ size_t total_bytes=0, read_bytes=0; + + while((read_bytes = multipart_buffer_read(self, buf, sizeof(buf), NULL))) { + out = erealloc(out, total_bytes + read_bytes + 1); +diff --git a/NEWS b/NEWS +index 15bf59b..74fbea5 100644 +--- a/NEWS ++++ b/NEWS +@@ -3,6 +3,10 @@ + + Backported from 7.2.33 + ++- Core: ++ . Fixed bug #79877 (getimagesize function silently truncates after a null ++ byte) (cmb) ++ + - Phar: + . Fixed bug #79797 (Use of freed hash key in the phar_parse_zipfile + function). (CVE-2020-7068) (cmb) +diff --git a/ext/standard/image.c b/ext/standard/image.c +index 1d999ca..a5a86c2 100644 +--- a/ext/standard/image.c ++++ b/ext/standard/image.c +@@ -1474,6 +1474,11 @@ + return; + } + ++ if (mode == FROM_PATH && CHECK_NULL_PATH(input, input_len)) { ++ php_error_docref(NULL, E_WARNING, "Invalid path"); ++ return; ++ } ++ + if (argc == 2) { + zval_dtor(info); + array_init(info); +--- /dev/null ++++ b/ext/standard/tests/image/bug79877.phpt +@@ -0,0 +1,9 @@ ++--TEST-- ++Bug #79877 (getimagesize function silently truncates after a null byte) ++--FILE-- ++<?php ++var_dump(getimagesize("/tmp/a.png\0xx")); ++?> ++--EXPECTF-- ++Warning: getimagesize(): Invalid path in %s on line %d ++NULL +diff --git a/main/php_variables.c b/main/php_variables.c +index c56d230..d0223df 100644 +--- a/main/php_variables.c ++++ b/main/php_variables.c +@@ -484,7 +484,9 @@ + size_t new_val_len; + + *val++ = '\0'; +- php_url_decode(var, strlen(var)); ++ if (arg != PARSE_COOKIE) { ++ php_url_decode(var, strlen(var)); ++ } + val_len = php_url_decode(val, strlen(val)); + val = estrndup(val, val_len); + if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) { +@@ -495,7 +497,9 @@ + size_t val_len; + size_t new_val_len; + +- php_url_decode(var, strlen(var)); ++ if (arg != PARSE_COOKIE) { ++ php_url_decode(var, strlen(var)); ++ } + val_len = 0; + val = estrndup("", val_len); + if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) { +diff --git a/tests/basic/022.phpt b/tests/basic/022.phpt +index 0ab70d4..bd1db13 100644 +--- a/tests/basic/022.phpt ++++ b/tests/basic/022.phpt +@@ -10,7 +10,7 @@ + var_dump($_COOKIE); + ?> + --EXPECT-- +-array(10) { ++array(12) { + ["cookie1"]=> + string(6) "val1 " + ["cookie2"]=> +@@ -19,11 +19,15 @@ + string(6) "val 3." + ["cookie_4"]=> + string(10) " value 4 ;" ++ ["%20cookie1"]=> ++ string(6) "ignore" ++ ["+cookie1"]=> ++ string(6) "ignore" + ["cookie__5"]=> + string(7) " value" +- ["cookie_6"]=> ++ ["cookie%206"]=> + string(3) "žęö" +- ["cookie_7"]=> ++ ["cookie+7"]=> + string(0) "" + ["$cookie_8"]=> + string(0) "" +diff --git a/tests/basic/023.phpt b/tests/basic/023.phpt +index ca5f1dc..0e2e0ac 100644 +--- a/tests/basic/023.phpt ++++ b/tests/basic/023.phpt +@@ -10,9 +10,11 @@ + var_dump($_COOKIE); + ?> + --EXPECT-- +-array(3) { ++array(4) { + ["c_o_o_k_i_e"]=> + string(5) "value" ++ ["c%20o+o_k+i%20e"]=> ++ string(1) "v" + ["name"]=> + string(24) ""value","value",UEhQIQ==" + ["UEhQIQ"]=> +--- /dev/null ++++ b/tests/basic/bug79699.phpt +@@ -0,0 +1,22 @@ ++--TEST-- ++Cookies Security Bug ++--INI-- ++max_input_vars=1000 ++filter.default=unsafe_raw ++--COOKIE-- ++__%48ost-evil=evil; __Host-evil=good; %66oo=baz;foo=bar ++--FILE-- ++<?php ++var_dump($_COOKIE); ++?> ++--EXPECT-- ++array(4) { ++ ["__%48ost-evil"]=> ++ string(4) "evil" ++ ["__Host-evil"]=> ++ string(4) "good" ++ ["%66oo"]=> ++ string(3) "baz" ++ ["foo"]=> ++ string(3) "bar" ++} +diff --git a/ext/standard/tests/strings/url_t.phpt b/ext/standard/tests/strings/url_t.phpt +index 79ff3bc..f564f59 100644 +--- a/ext/standard/tests/strings/url_t.phpt ++++ b/ext/standard/tests/strings/url_t.phpt +@@ -575,15 +575,13 @@ + string(16) "some_page_ref123" + } + +---> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123: array(7) { ++--> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123: array(6) { + ["scheme"]=> + string(4) "http" + ["host"]=> +- string(11) "www.php.net" ++ string(26) "secret@hideout@www.php.net" + ["port"]=> + int(80) +- ["user"]=> +- string(14) "secret@hideout" + ["path"]=> + string(10) "/index.php" + ["query"]=> +--- /dev/null ++++ b/ext/standard/tests/url/bug77423.phpt +@@ -0,0 +1,30 @@ ++--TEST-- ++Bug #77423 (parse_url() will deliver a wrong host to user) ++--FILE-- ++<?php ++$urls = array( ++ "http://php.net\@aliyun.com/aaa.do", ++ "https://example.com\uFF03@bing.com", ++); ++foreach ($urls as $url) { ++ var_dump(filter_var($url, FILTER_VALIDATE_URL)); ++ var_dump(parse_url($url)); ++} ++?> ++--EXPECT-- ++bool(false) ++array(3) { ++ ["scheme"]=> ++ string(4) "http" ++ ["host"]=> ++ string(19) "php.net\@aliyun.com" ++ ["path"]=> ++ string(7) "/aaa.do" ++} ++bool(false) ++array(2) { ++ ["scheme"]=> ++ string(5) "https" ++ ["host"]=> ++ string(26) "example.com\uFF03@bing.com" ++} +diff --git a/ext/standard/tests/url/parse_url_basic_001.phpt b/ext/standard/tests/url/parse_url_basic_001.phpt +index 4606849..5101099 100644 +--- a/ext/standard/tests/url/parse_url_basic_001.phpt ++++ b/ext/standard/tests/url/parse_url_basic_001.phpt +@@ -506,15 +506,13 @@ + string(16) "some_page_ref123" + } + +---> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123: array(7) { ++--> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123: array(6) { + ["scheme"]=> + string(4) "http" + ["host"]=> +- string(11) "www.php.net" ++ string(26) "secret@hideout@www.php.net" + ["port"]=> + int(80) +- ["user"]=> +- string(14) "secret@hideout" + ["path"]=> + string(10) "/index.php" + ["query"]=> +diff --git a/ext/standard/tests/url/parse_url_basic_003.phpt b/ext/standard/tests/url/parse_url_basic_003.phpt +index 3d5a4a3..7968fd3 100644 +--- a/ext/standard/tests/url/parse_url_basic_003.phpt ++++ b/ext/standard/tests/url/parse_url_basic_003.phpt +@@ -68,7 +68,7 @@ + --> http://secret:@www.php.net/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(11) "www.php.net" + --> http://:hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(11) "www.php.net" + --> http://secret:hideout@www.php.net/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(11) "www.php.net" +---> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(11) "www.php.net" ++--> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(26) "secret@hideout@www.php.net" + --> http://secret:hid:out@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(11) "www.php.net" + --> nntp://news.php.net : string(12) "news.php.net" + --> ftp://ftp.gnu.org/gnu/glic/glibc.tar.gz : string(11) "ftp.gnu.org" +diff --git a/ext/standard/tests/url/parse_url_basic_005.phpt b/ext/standard/tests/url/parse_url_basic_005.phpt +index aefb339..ba778bf 100644 +--- a/ext/standard/tests/url/parse_url_basic_005.phpt ++++ b/ext/standard/tests/url/parse_url_basic_005.phpt +@@ -68,7 +68,7 @@ + --> http://secret:@www.php.net/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(6) "secret" + --> http://:hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(0) "" + --> http://secret:hideout@www.php.net/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(6) "secret" +---> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(14) "secret@hideout" ++--> http://secret@hideout@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : NULL + --> http://secret:hid:out@www.php.net:80/index.php?test=1&test2=char&test3=mixesCI#some_page_ref123 : string(6) "secret" + --> nntp://news.php.net : NULL + --> ftp://ftp.gnu.org/gnu/glic/glibc.tar.gz : NULL +diff --git a/ext/standard/url.c b/ext/standard/url.c +index 4cc1f77..d56dc24 100644 +--- a/ext/standard/url.c ++++ b/ext/standard/url.c +@@ -92,6 +92,22 @@ + return php_url_parse_ex(str, strlen(str)); + } + ++static int is_userinfo_valid(const char *str, size_t len) ++{ ++ char *valid = "-._~!$&'()*+,;=:"; ++ char *p = str; ++ while (p - str < len) { ++ if (isalpha(*p) || isdigit(*p) || strchr(valid, *p)) { ++ p++; ++ } else if (*p == '%' && p - str <= len - 3 && isdigit(*(p+1)) && isxdigit(*(p+2))) { ++ p += 3; ++ } else { ++ return 0; ++ } ++ } ++ return 1; ++} ++ + /* {{{ php_url_parse + */ + PHPAPI php_url *php_url_parse_ex(char const *str, size_t length) +@@ -235,13 +251,18 @@ + ret->pass = estrndup(pp, (p-pp)); + php_replace_controlchars_ex(ret->pass, (p-pp)); + } else { ++ if (!is_userinfo_valid(s, p-s)) { ++ goto check_port; ++ } + ret->user = estrndup(s, (p-s)); + php_replace_controlchars_ex(ret->user, (p-s)); ++ + } + + s = p + 1; + } + ++check_port: + /* check for port */ + if (s < ue && *s == '[' && *(e-1) == ']') { + /* Short circuit portscan, +diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c +index 6ce4b78..7de074a 100644 +--- a/ext/imap/php_imap.c ++++ b/ext/imap/php_imap.c +@@ -3531,6 +3531,23 @@ + } + /* }}} */ + ++static zend_bool header_injection(zend_string *str, zend_bool adrlist) ++{ ++ char *p = ZSTR_VAL(str); ++ ++ while ((p = strpbrk(p, "\r\n")) != NULL) { ++ if (!(p[0] == '\r' && p[1] == '\n') ++ /* adrlists do not support folding, but swallow trailing line breaks */ ++ && !((adrlist && p[1] == '\0') ++ /* other headers support folding */ ++ || !adrlist && (p[1] == ' ' || p[1] == '\t'))) { ++ return 1; ++ } ++ p++; ++ } ++ return 0; ++} ++ + /* {{{ proto string imap_mail_compose(array envelope, array body) + Create a MIME message based on given envelope and body sections */ + PHP_FUNCTION(imap_mail_compose) +@@ -3551,6 +3568,13 @@ + return; + } + ++#define CHECK_HEADER_INJECTION(zstr, adrlist, header) \ ++ if (header_injection(zstr, adrlist)) { \ ++ php_error_docref(NULL, E_WARNING, "header injection attempt in " header); \ ++ RETVAL_FALSE; \ ++ goto done; \ ++ } ++ + #define PHP_RFC822_PARSE_ADRLIST(target, value) \ + str_copy = estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)); \ + rfc822_parse_adrlist(target, str_copy, "NO HOST"); \ +@@ -3559,46 +3583,57 @@ + env = mail_newenvelope(); + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "remail", sizeof("remail") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "remail"); + env->remail = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "return_path", sizeof("return_path") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "return_path"); + PHP_RFC822_PARSE_ADRLIST(&env->return_path, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "date", sizeof("date") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "date"); + env->date = (unsigned char*)cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "from", sizeof("from") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "from"); + PHP_RFC822_PARSE_ADRLIST(&env->from, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "reply_to", sizeof("reply_to") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "reply_to"); + PHP_RFC822_PARSE_ADRLIST(&env->reply_to, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "in_reply_to", sizeof("in_reply_to") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "in_reply_to"); + env->in_reply_to = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "subject", sizeof("subject") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "subject"); + env->subject = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "to", sizeof("to") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "to"); + PHP_RFC822_PARSE_ADRLIST(&env->to, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "cc", sizeof("cc") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "cc"); + PHP_RFC822_PARSE_ADRLIST(&env->cc, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "bcc", sizeof("bcc") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "bcc"); + PHP_RFC822_PARSE_ADRLIST(&env->bcc, pvalue); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "message_id", sizeof("message_id") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "message_id"); + env->message_id=cpystr(Z_STRVAL_P(pvalue)); + } + +@@ -3608,6 +3643,7 @@ + ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pvalue), env_data) { + custom_headers_param = mail_newbody_parameter(); + convert_to_string_ex(env_data); ++ CHECK_HEADER_INJECTION(Z_STR_P(env_data), 0, "custom_headers"); + custom_headers_param->value = (char *) fs_get(Z_STRLEN_P(env_data) + 1); + custom_headers_param->attribute = NULL; + memcpy(custom_headers_param->value, Z_STRVAL_P(env_data), Z_STRLEN_P(env_data) + 1); +@@ -3640,6 +3676,7 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body charset"); + tmp_param = mail_newbody_parameter(); + tmp_param->value = cpystr(Z_STRVAL_P(pvalue)); + tmp_param->attribute = cpystr("CHARSET"); +@@ -3650,9 +3687,11 @@ + if(Z_TYPE_P(pvalue) == IS_ARRAY) { + disp_param = tmp_param = NULL; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { ++ CHECK_HEADER_INJECTION(key, 0, "body disposition key"); + disp_param = mail_newbody_parameter(); + disp_param->attribute = cpystr(ZSTR_VAL(key)); + convert_to_string_ex(disp_data); ++ CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body disposition value"); + disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1); + memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1); + disp_param->next = tmp_param; +@@ -3663,18 +3702,22 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body subtype"); + bod->subtype = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body id"); + bod->id = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body description"); + bod->description = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body disposition.type"); + bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1); + memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1); + } +@@ -3682,9 +3725,11 @@ + if (Z_TYPE_P(pvalue) == IS_ARRAY) { + disp_param = tmp_param = NULL; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { ++ CHECK_HEADER_INJECTION(key, 0, "body type.parameters key"); + disp_param = mail_newbody_parameter(); + disp_param->attribute = cpystr(ZSTR_VAL(key)); + convert_to_string_ex(disp_data); ++ CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body type.parameters value"); + disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1); + memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1); + disp_param->next = tmp_param; +@@ -3713,6 +3758,7 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body md5"); + bod->md5 = cpystr(Z_STRVAL_P(pvalue)); + } + } else if (Z_TYPE_P(data) == IS_ARRAY) { +@@ -3743,6 +3789,7 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body charset"); + tmp_param = mail_newbody_parameter(); + tmp_param->value = (char *) fs_get(Z_STRLEN_P(pvalue) + 1); + memcpy(tmp_param->value, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue) + 1); +@@ -3754,9 +3801,11 @@ + if (Z_TYPE_P(pvalue) == IS_ARRAY) { + disp_param = tmp_param = NULL; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { ++ CHECK_HEADER_INJECTION(key, 0, "body type.parameters key"); + disp_param = mail_newbody_parameter(); + disp_param->attribute = cpystr(ZSTR_VAL(key)); + convert_to_string_ex(disp_data); ++ CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body type.parameters value"); + disp_param->value = (char *)fs_get(Z_STRLEN_P(disp_data) + 1); + memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1); + disp_param->next = tmp_param; +@@ -3767,18 +3816,22 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body subtype"); + bod->subtype = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body id"); + bod->id = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body description"); + bod->description = cpystr(Z_STRVAL_P(pvalue)); + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body disposition.type"); + bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1); + memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1); + } +@@ -3786,9 +3839,11 @@ + if (Z_TYPE_P(pvalue) == IS_ARRAY) { + disp_param = tmp_param = NULL; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { ++ CHECK_HEADER_INJECTION(key, 0, "body disposition key"); + disp_param = mail_newbody_parameter(); + disp_param->attribute = cpystr(ZSTR_VAL(key)); + convert_to_string_ex(disp_data); ++ CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body disposition value"); + disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1); + memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1); + disp_param->next = tmp_param; +@@ -3817,6 +3872,7 @@ + } + if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) { + convert_to_string_ex(pvalue); ++ CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body md5"); + bod->md5 = cpystr(Z_STRVAL_P(pvalue)); + } + } +--- /dev/null ++++ b/ext/imap/tests/bug80710_1.phpt +@@ -0,0 +1,37 @@ ++--TEST-- ++Bug #80710 (imap_mail_compose() header injection) - MIME Splitting Attack ++--SKIPIF-- ++<?php ++if (!extension_loaded("imap")) die("skip imap extension not available"); ++?> ++--FILE-- ++<?php ++$envelope["from"]= "joe@example.com\n From : X-INJECTED"; ++$envelope["to"] = "foo@example.com\nFrom: X-INJECTED"; ++$envelope["cc"] = "bar@example.com\nFrom: X-INJECTED"; ++$envelope["subject"] = "bar@example.com\n\n From : X-INJECTED"; ++$envelope["x-remail"] = "bar@example.com\nFrom: X-INJECTED"; ++$envelope["something"] = "bar@example.com\nFrom: X-INJECTED"; ++ ++$part1["type"] = TYPEMULTIPART; ++$part1["subtype"] = "mixed"; ++ ++$part2["type"] = TYPEAPPLICATION; ++$part2["encoding"] = ENCBINARY; ++$part2["subtype"] = "octet-stream\nContent-Type: X-INJECTED"; ++$part2["description"] = "some file\nContent-Type: X-INJECTED"; ++$part2["contents.data"] = "ABC\nContent-Type: X-INJECTED"; ++ ++$part3["type"] = TYPETEXT; ++$part3["subtype"] = "plain"; ++$part3["description"] = "description3"; ++$part3["contents.data"] = "contents.data3\n\n\n\t"; ++ ++$body[1] = $part1; ++$body[2] = $part2; ++$body[3] = $part3; ++ ++echo imap_mail_compose($envelope, $body); ++?> ++--EXPECTF-- ++Warning: imap_mail_compose(): header injection attempt in from in %s on line %d +--- /dev/null ++++ b/ext/imap/tests/bug80710_2.phpt +@@ -0,0 +1,37 @@ ++--TEST-- ++Bug #80710 (imap_mail_compose() header injection) - Remail ++--SKIPIF-- ++<?php ++if (!extension_loaded("imap")) die("skip imap extension not available"); ++?> ++--FILE-- ++<?php ++$envelope["from"]= "joe@example.com\n From : X-INJECTED"; ++$envelope["to"] = "foo@example.com\nFrom: X-INJECTED"; ++$envelope["cc"] = "bar@example.com\nFrom: X-INJECTED"; ++$envelope["subject"] = "bar@example.com\n\n From : X-INJECTED"; ++$envelope["remail"] = "X-INJECTED-REMAIL: X-INJECTED\nFrom: X-INJECTED-REMAIL-FROM"; //<--- Injected as first hdr ++$envelope["something"] = "bar@example.com\nFrom: X-INJECTED"; ++ ++$part1["type"] = TYPEMULTIPART; ++$part1["subtype"] = "mixed"; ++ ++$part2["type"] = TYPEAPPLICATION; ++$part2["encoding"] = ENCBINARY; ++$part2["subtype"] = "octet-stream\nContent-Type: X-INJECTED"; ++$part2["description"] = "some file\nContent-Type: X-INJECTED"; ++$part2["contents.data"] = "ABC\nContent-Type: X-INJECTED"; ++ ++$part3["type"] = TYPETEXT; ++$part3["subtype"] = "plain"; ++$part3["description"] = "description3"; ++$part3["contents.data"] = "contents.data3\n\n\n\t"; ++ ++$body[1] = $part1; ++$body[2] = $part2; ++$body[3] = $part3; ++ ++echo imap_mail_compose($envelope, $body); ++?> ++--EXPECTF-- ++Warning: imap_mail_compose(): header injection attempt in remail in %s on line %d +diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c +index c5e6b68..bdde6c7 100644 +--- a/ext/pdo_firebird/firebird_statement.c ++++ b/ext/pdo_firebird/firebird_statement.c +@@ -133,8 +133,14 @@ + } + if (result[0] == isc_info_sql_records) { + unsigned i = 3, result_size = isc_vax_integer(&result[1], 2); ++ if (result_size > sizeof(result)) { ++ goto error; ++ } + while (result[i] != isc_info_end && i < result_size) { + short len = (short) isc_vax_integer(&result[i + 1], 2); ++ if (len != 1 && len != 2 && len != 4) { ++ goto error; ++ } + if (result[i] != isc_info_req_select_count) { + affected_rows += isc_vax_integer(&result[i + 3], len); + } +@@ -158,6 +164,7 @@ + return 1; + } while (0); + ++error: + RECORD_ERROR(stmt); + + return 0; +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76450.data +@@ -0,0 +1 @@ ++ +\ No newline at end of file +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76450.phpt +@@ -0,0 +1,29 @@ ++--TEST-- ++Bug #76450 (SIGSEGV in firebird_stmt_execute) ++--SKIPIF-- ++<?php ++if (!extension_loaded('pdo_firebird')) die("skip pdo_firebird extension not available"); ++if (!extension_loaded('sockets')) die("skip sockets extension not available"); ++?> ++--FILE-- ++<?php ++require_once "payload_server.inc"; ++ ++$address = run_server(__DIR__ . "/bug_76450.data"); ++ ++// no need to change the credentials; we're running against a fake server ++$dsn = "firebird:dbname=inet://$address/test"; ++$username = 'SYSDBA'; ++$password = 'masterkey'; ++ ++$dbh = new PDO($dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); ++$sql = "EXECUTE PROCEDURE test_proc 123"; ++$query = $dbh->prepare($sql); ++try { ++ $query->execute(); ++} catch (Exception $ex) { ++ echo "{$ex->getMessage()}\n"; ++} ++?> ++--EXPECT-- ++SQLSTATE[HY000]: General error +diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c +index 446f52d..0fc1c95 100644 +--- a/ext/pdo_firebird/firebird_driver.c ++++ b/ext/pdo_firebird/firebird_driver.c +@@ -252,8 +252,17 @@ + if (result[0] == isc_info_sql_records) { + unsigned i = 3, result_size = isc_vax_integer(&result[1],2); + ++ if (result_size > sizeof(result)) { ++ ret = -1; ++ goto free_statement; ++ } + while (result[i] != isc_info_end && i < result_size) { + short len = (short)isc_vax_integer(&result[i+1],2); ++ /* bail out on bad len */ ++ if (len != 1 && len != 2 && len != 4) { ++ ret = -1; ++ goto free_statement; ++ } + if (result[i] != isc_info_req_select_count) { + ret += isc_vax_integer(&result[i+3],len); + } +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76449.data +@@ -0,0 +1 @@ ++ +\ No newline at end of file +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76449.phpt +@@ -0,0 +1,23 @@ ++--TEST-- ++Bug #76449 (SIGSEGV in firebird_handle_doer) ++--SKIPIF-- ++<?php ++if (!extension_loaded('pdo_firebird')) die("skip pdo_firebird extension not available"); ++if (!extension_loaded('sockets')) die("skip sockets extension not available"); ++?> ++--FILE-- ++<?php ++require_once "payload_server.inc"; ++ ++$address = run_server(__DIR__ . "/bug_76449.data"); ++ ++// no need to change the credentials; we're running against a fake server ++$dsn = "firebird:dbname=inet://$address/test"; ++$username = 'SYSDBA'; ++$password = 'masterkey'; ++ ++$dbh = new PDO($dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); ++var_dump($dbh->exec("INSERT INTO test VALUES ('hihi2', 'xxxxx')")); ++?> ++--EXPECT-- ++bool(false) +diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c +index 0fc1c95..f555511 100644 +--- a/ext/pdo_firebird/firebird_driver.c ++++ b/ext/pdo_firebird/firebird_driver.c +@@ -555,14 +555,16 @@ + } + /* }}} */ + ++#define INFO_BUF_LEN 512 ++ + /* callback to used to report database server info */ + static void firebird_info_cb(void *arg, char const *s) /* {{{ */ + { + if (arg) { + if (*(char*)arg) { /* second call */ +- strcat(arg, " "); ++ strlcat(arg, " ", INFO_BUF_LEN); + } +- strcat(arg, s); ++ strlcat(arg, s, INFO_BUF_LEN); + } + } + /* }}} */ +@@ -573,7 +575,7 @@ + pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data; + + switch (attr) { +- char tmp[512]; ++ char tmp[INFO_BUF_LEN]; + + case PDO_ATTR_AUTOCOMMIT: + ZVAL_LONG(val,dbh->auto_commit); +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76448.data +@@ -0,0 +1 @@ ++ +\ No newline at end of file +--- /dev/null ++++ b/ext/pdo_firebird/tests/bug_76448.phpt +@@ -0,0 +1,23 @@ ++--TEST-- ++Bug #76448 (Stack buffer overflow in firebird_info_cb) ++--SKIPIF-- ++<?php ++if (!extension_loaded('pdo_firebird')) die("skip podo_firebird extension not available"); ++if (!extension_loaded('sockets')) die("skip sockets extension not available"); ++?> ++--FILE-- ++<?php ++require_once "payload_server.inc"; ++ ++$address = run_server(__DIR__ . "/bug_76448.data"); ++ ++// no need to change the credentials; we're running against a falke server ++$dsn = "firebird:dbname=inet://$address/test"; ++$username = 'SYSDBA'; ++$password = 'masterkey'; ++ ++$dbh = new PDO($dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); ++var_dump($dbh->getAttribute(PDO::ATTR_SERVER_INFO)); ++?> ++--EXPECT-- ++bool(false) +diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c +index 8f0c5db..72827ac 100644 +--- a/ext/zip/php_zip.c ++++ b/ext/zip/php_zip.c +@@ -101,8 +101,8 @@ + return NULL; + } + +- if (IS_SLASH(path[0])) { +- return path + 1; ++ if (IS_ABSOLUTE_PATH(path, path_len)) { ++ return path + COPY_WHEN_ABSOLUTE(path) + 1; + } + + i = path_len; +--- /dev/null ++++ b/ext/zip/tests/bug81420.phpt +@@ -0,0 +1,24 @@ ++--TEST-- ++Bug #81420 (ZipArchive::extractTo extracts outside of destination) ++--SKIPIF-- ++<?php ++if (!extension_loaded("zip")) die("skip zip extension not available"); ++?> ++--FILE-- ++<?php ++$zip = new ZipArchive(); ++$zip->open(__DIR__ . "/bug81420.zip"); ++$destination = __DIR__ . "/bug81420"; ++mkdir($destination); ++$zip->extractTo($destination); ++var_dump(file_exists("$destination/nt1/zzr_noharm.php")); ++?> ++--CLEAN-- ++<?php ++$destination = __DIR__ . "/bug81420"; ++@unlink("$destination/nt1/zzr_noharm.php"); ++@rmdir("$destination/nt1"); ++@rmdir($destination); ++?> ++--EXPECT-- ++bool(true) +--- /dev/null ++++ b/ext/zip/tests/bug81420.zip +@@ -0,0 +1,2 @@ ++PK ++ +\ No newline at end of file +diff --git a/ext/dom/domimplementation.c b/ext/dom/domimplementation.c +index 28e35eb..f4d1358 100644 +--- a/ext/dom/domimplementation.c ++++ b/ext/dom/domimplementation.c +@@ -114,6 +114,11 @@ + pch2 = (xmlChar *) systemid; + } + ++ if (strstr(name, "%00")) { ++ php_error_docref(NULL, E_WARNING, "URI must not contain percent-encoded NUL bytes"); ++ RETURN_FALSE; ++ } ++ + uri = xmlParseURI(name); + if (uri != NULL && uri->opaque != NULL) { + localname = xmlStrdup((xmlChar *) uri->opaque); +--- /dev/null ++++ b/ext/dom/tests/bug79971_2.phpt +@@ -0,0 +1,20 @@ ++--TEST-- ++Bug #79971 (special character is breaking the path in xml function) ++--SKIPIF-- ++<?php ++if (!extension_loaded('dom')) die('skip dom extension not available'); ++?> ++--FILE-- ++<?php ++$imp = new DOMImplementation; ++if (PHP_OS_FAMILY === 'Windows') { ++ $path = '/' . str_replace('\\', '/', __DIR__); ++} else { ++ $path = __DIR__; ++} ++$uri = "file://$path/bug79971_2.xml"; ++var_dump($imp->createDocumentType("$uri%00foo")); ++?> ++--EXPECTF-- ++Warning: DOMImplementation::createDocumentType(): URI must not contain percent-encoded NUL bytes in %s on line %d ++bool(false) +diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c +index 85f239d..98344d1 100644 +--- a/ext/libxml/libxml.c ++++ b/ext/libxml/libxml.c +@@ -308,6 +308,10 @@ + int isescaped=0; + xmlURI *uri; + ++ if (strstr(filename, "%00")) { ++ php_error_docref(NULL, E_WARNING, "URI must not contain percent-encoded NUL bytes"); ++ return NULL; ++ } + + uri = xmlParseURI(filename); + if (uri && (uri->scheme == NULL || +@@ -438,6 +442,11 @@ + if (URI == NULL) + return(NULL); + ++ if (strstr(URI, "%00")) { ++ php_error_docref(NULL, E_WARNING, "URI must not contain percent-encoded NUL bytes"); ++ return NULL; ++ } ++ + puri = xmlParseURI(URI); + if (puri != NULL) { + if (puri->scheme != NULL) +--- /dev/null ++++ b/ext/simplexml/tests/bug79971_1.phpt +@@ -0,0 +1,27 @@ ++--TEST-- ++Bug #79971 (special character is breaking the path in xml function) ++--SKIPIF-- ++<?php ++if (!extension_loaded('simplexml')) die('skip simplexml extension not available'); ++?> ++--FILE-- ++<?php ++if (PHP_OS_FAMILY === 'Windows') { ++ $path = '/' . str_replace('\\', '/', __DIR__); ++} else { ++ $path = __DIR__; ++} ++$uri = "file://$path/bug79971_1.xml"; ++var_dump(simplexml_load_file("$uri%00foo")); ++ ++$sxe = simplexml_load_file($uri); ++var_dump($sxe->asXML("$uri.out%00foo")); ++?> ++--EXPECTF-- ++Warning: simplexml_load_file(): URI must not contain percent-encoded NUL bytes in %s on line %d ++ ++Warning: simplexml_load_file(): I/O warning : failed to load external entity "%s/bug79971_1.xml%00foo" in %s on line %d ++bool(false) ++ ++Warning: SimpleXMLElement::asXML(): URI must not contain percent-encoded NUL bytes in %s on line %d ++bool(false) +--- /dev/null ++++ b/ext/simplexml/tests/bug79971_1.xml +@@ -0,0 +1,2 @@ ++<?xml version="1.0"?> ++<root></root> diff --git a/enchant-2.patch b/enchant-2.patch deleted file mode 100644 index e582e54458fe..000000000000 --- a/enchant-2.patch +++ /dev/null @@ -1,84 +0,0 @@ ---- ext/enchant/config.m4 2018-01-02 09:50:14.000000000 +0100 -+++ ext/enchant/config.m4.new 2018-02-01 12:13:28.801708953 +0100 -@@ -14,9 +14,9 @@ - ENCHANT_SEARCH_DIRS="/usr/local /usr" - fi - for i in $ENCHANT_SEARCH_DIRS; do -- if test -f $i/include/enchant/enchant.h; then -+ if test -f $i/include/enchant-2/enchant.h; then - ENCHANT_DIR=$i -- ENCHANT_INCDIR=$i/include/enchant -+ ENCHANT_INCDIR=$i/include/enchant-2 - elif test -f $i/include/enchant.h; then - ENCHANT_DIR=$i - ENCHANT_INCDIR=$i/include -@@ -31,7 +31,7 @@ - - AC_DEFINE(HAVE_ENCHANT,1,[ ]) - PHP_SUBST(ENCHANT_SHARED_LIBADD) -- PHP_ADD_LIBRARY_WITH_PATH(enchant, $ENCHANT_LIBDIR, ENCHANT_SHARED_LIBADD) -+ PHP_ADD_LIBRARY_WITH_PATH(enchant-2, $ENCHANT_LIBDIR, ENCHANT_SHARED_LIBADD) - PHP_ADD_INCLUDE($ENCHANT_INCDIR) - PHP_CHECK_LIBRARY(enchant, enchant_broker_set_param, - [ ---- configure 2018-01-02 09:51:27.000000000 +0100 -+++ configure.new 2018-02-01 12:16:17.950382811 +0100 -@@ -29838,9 +29838,9 @@ - ENCHANT_SEARCH_DIRS="/usr/local /usr" - fi - for i in $ENCHANT_SEARCH_DIRS; do -- if test -f $i/include/enchant/enchant.h; then -+ if test -f $i/include/enchant-2/enchant.h; then - ENCHANT_DIR=$i -- ENCHANT_INCDIR=$i/include/enchant -+ ENCHANT_INCDIR=$i/include/enchant-2 - elif test -f $i/include/enchant.h; then - ENCHANT_DIR=$i - ENCHANT_INCDIR=$i/include -@@ -29862,7 +29862,7 @@ - - - if test "$ext_shared" = "yes"; then -- ENCHANT_SHARED_LIBADD="-lenchant $ENCHANT_SHARED_LIBADD" -+ ENCHANT_SHARED_LIBADD="-lenchant-2 $ENCHANT_SHARED_LIBADD" - if test -n "$ENCHANT_LIBDIR"; then - - if test "$ENCHANT_LIBDIR" != "/usr/$PHP_LIBDIR" && test "$ENCHANT_LIBDIR" != "/usr/lib"; then ---- ext/enchant/enchant.c 2018-01-02 09:50:14.000000000 +0100 -+++ ext/enchant/enchant.c.new 2018-02-01 12:19:00.228985343 +0100 -@@ -745,7 +745,7 @@ - for (i = 0; i < n_sugg; i++) { - add_next_index_string(sugg, suggs[i]); - } -- enchant_dict_free_suggestions(pdict->pdict, suggs); -+ enchant_dict_free_string_list(pdict->pdict, suggs); - } - - -@@ -802,7 +802,7 @@ - add_next_index_string(return_value, suggs[i]); - } - -- enchant_dict_free_suggestions(pdict->pdict, suggs); -+ enchant_dict_free_string_list(pdict->pdict, suggs); - } - } - /* }}} */ -@@ -822,7 +822,7 @@ - - PHP_ENCHANT_GET_DICT; - -- enchant_dict_add_to_personal(pdict->pdict, word, wordlen); -+ enchant_dict_add(pdict->pdict, word, wordlen); - } - /* }}} */ - -@@ -860,7 +860,7 @@ - - PHP_ENCHANT_GET_DICT; - -- RETURN_BOOL(enchant_dict_is_in_session(pdict->pdict, word, wordlen)); -+ RETURN_BOOL(enchant_dict_is_added(pdict->pdict, word, wordlen)); - } - /* }}} */ - diff --git a/fpm-numeric-uid-gid.patch b/fpm-numeric-uid-gid.patch new file mode 100644 index 000000000000..f99dbe048037 --- /dev/null +++ b/fpm-numeric-uid-gid.patch @@ -0,0 +1,52 @@ +--- a/sapi/fpm/fpm/fpm_unix.c ++++ b/sapi/fpm/fpm/fpm_unix.c +@@ -165,27 +165,35 @@ + #endif + + if (c->listen_owner && *c->listen_owner) { +- struct passwd *pwd; ++ if (strlen(c->listen_owner) == strspn(c->listen_owner, "0123456789")) { ++ wp->socket_uid = strtoul(c->listen_owner, 0, 10); ++ } else { ++ struct passwd *pwd; + +- pwd = getpwnam(c->listen_owner); +- if (!pwd) { +- zlog(ZLOG_SYSERROR, "[pool %s] cannot get uid for user '%s'", wp->config->name, c->listen_owner); +- return -1; +- } ++ pwd = getpwnam(c->listen_owner); ++ if (!pwd) { ++ zlog(ZLOG_SYSERROR, "[pool %s] cannot get uid for user '%s'", wp->config->name, c->listen_owner); ++ return -1; ++ } + +- wp->socket_uid = pwd->pw_uid; +- wp->socket_gid = pwd->pw_gid; ++ wp->socket_uid = pwd->pw_uid; ++ wp->socket_gid = pwd->pw_gid; ++ } + } + + if (c->listen_group && *c->listen_group) { +- struct group *grp; ++ if (strlen(c->listen_group) == strspn(c->listen_group, "0123456789")) { ++ wp->socket_gid = strtoul(c->listen_group, 0, 10); ++ } else { ++ struct group *grp; + +- grp = getgrnam(c->listen_group); +- if (!grp) { +- zlog(ZLOG_SYSERROR, "[pool %s] cannot get gid for group '%s'", wp->config->name, c->listen_group); +- return -1; ++ grp = getgrnam(c->listen_group); ++ if (!grp) { ++ zlog(ZLOG_SYSERROR, "[pool %s] cannot get gid for group '%s'", wp->config->name, c->listen_group); ++ return -1; ++ } ++ wp->socket_gid = grp->gr_gid; + } +- wp->socket_gid = grp->gr_gid; + } + + return 0; diff --git a/fpm-reload-sighup.patch b/fpm-reload-sighup.patch new file mode 100644 index 000000000000..09b32b73ba06 --- /dev/null +++ b/fpm-reload-sighup.patch @@ -0,0 +1,57 @@ +diff --git a/sapi/fpm/fpm/fpm_events.c b/sapi/fpm/fpm/fpm_events.c +index ce5d543..63de0a4 100644 +--- a/sapi/fpm/fpm/fpm_events.c ++++ b/sapi/fpm/fpm/fpm_events.c +@@ -113,6 +113,11 @@ + zlog(ZLOG_NOTICE, "Reloading in progress ..."); + fpm_pctl(FPM_PCTL_STATE_RELOADING, FPM_PCTL_ACTION_SET); + break; ++ case 'H' : /* SIGHUP */ ++ zlog(ZLOG_DEBUG, "received SIGHUP"); ++ zlog(ZLOG_NOTICE, "Reloading in progress ..."); ++ fpm_pctl(FPM_PCTL_STATE_RELOADING, FPM_PCTL_ACTION_SET); ++ break; + } + + if (fpm_globals.is_child) { +diff --git a/sapi/fpm/fpm/fpm_signals.c b/sapi/fpm/fpm/fpm_signals.c +index c5d0692..9fae650 100644 +--- a/sapi/fpm/fpm/fpm_signals.c ++++ b/sapi/fpm/fpm/fpm_signals.c +@@ -160,6 +160,7 @@ + [SIGINT] = 'I', + [SIGUSR1] = '1', + [SIGUSR2] = '2', ++ [SIGHUP] = 'H', + [SIGQUIT] = 'Q', + [SIGCHLD] = 'C' + }; +@@ -206,6 +207,7 @@ + 0 > sigaction(SIGINT, &act, 0) || + 0 > sigaction(SIGUSR1, &act, 0) || + 0 > sigaction(SIGUSR2, &act, 0) || ++ 0 > sigaction(SIGHUP, &act, 0) || + 0 > sigaction(SIGCHLD, &act, 0) || + 0 > sigaction(SIGQUIT, &act, 0)) { + +@@ -235,6 +237,7 @@ + 0 > sigaction(SIGINT, &act_dfl, 0) || + 0 > sigaction(SIGUSR1, &act_dfl, 0) || + 0 > sigaction(SIGUSR2, &act_dfl, 0) || ++ 0 > sigaction(SIGHUP, &act_dfl, 0) || + 0 > sigaction(SIGCHLD, &act_dfl, 0) || + 0 > sigaction(SIGQUIT, &act, 0)) { + +diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in +index 794f508..b1bcf08 100644 +--- a/sapi/fpm/php-fpm.8.in ++++ b/sapi/fpm/php-fpm.8.in +@@ -150,7 +150,7 @@ + .TP + .B SIGUSR1 \fPre-open log file + .TP +-.B SIGUSR2 \fPgraceful reload of all workers + reload of fpm conf/binary ++.B SIGUSR2,SIGHUP \fPgraceful reload of all workers + reload of fpm conf/binary + .RE + .PD 1 + .P diff --git a/freetype2.patch b/freetype2.patch deleted file mode 100644 index 0585d51363d6..000000000000 --- a/freetype2.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- configure.orig -+++ configure -@@ -34202,23 +34202,36 @@ $as_echo "If configure fails try --with-xpm-dir=<DIR>" >&6; } - done - - if test -z "$FREETYPE2_DIR"; then -- as_fn_error $? "freetype-config not found." "$LINENO" 5 -+ for i in $PHP_FREETYPE_DIR /usr/local /usr; do -+ if test -f "$i/bin/pkg-config"; then -+ PKGCONFIG_DIR=$i -+ PKGCONFIG_CONFIG="$i/bin/pkg-config" -+ break -+ fi -+ done -+ if test -z "$PKGCONFIG_DIR"; then -+ as_fn_error $? "freetype-config and pkg-config not found." "$LINENO" 5 -+ else -+ FREETYPE2_CFLAGS=`$PKGCONFIG_CONFIG --cflags freetype2` -+ FREETYPE2_LIBS=`$PKGCONFIG_CONFIG --libs freetype2` -+ fi -+ else -+ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` -+ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` - fi - -- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` -- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` - - -- for ac_i in $FREETYPE2_CFLAGS; do -- case $ac_i in -- -I*) -- ac_ii=`echo $ac_i|cut -c 3-` -+ for ac_i in $FREETYPE2_CFLAGS; do -+ case $ac_i in -+ -I*) -+ ac_ii=`echo $ac_i|cut -c 3-` - -- if test "$ac_ii" != "/usr/include"; then -+ if test "$ac_ii" != "/usr/include"; then - -- if test -z "$ac_ii" || echo "$ac_ii" | grep '^/' >/dev/null ; then -- ai_p=$ac_ii -- else -+ if test -z "$ac_ii" || echo "$ac_ii" | grep '^/' >/dev/null ; then -+ ai_p=$ac_ii -+ else - - ep_dir=`echo $ac_ii|$SED 's%/*[^/][^/]*/*$%%'` - ---- configure.orig -+++ configure -@@ -35890,23 +35890,34 @@ $as_echo "If configure fails try --with-xpm-dir=<DIR>" >&6; } - done - - if test -z "$FREETYPE2_DIR"; then -- as_fn_error $? "freetype-config not found." "$LINENO" 5 -+ for i in $PHP_FREETYPE_DIR /usr/local /usr; do -+ if test -f "$i/bin/pkg-config"; then -+ PKGCONFIG_DIR=$i -+ PKGCONFIG_CONFIG="$i/bin/pkg-config" -+ break -+ fi -+ done -+ if test -z "$PKGCONFIG_DIR"; then -+ as_fn_error $? "freetype-config and pkg-config not found." "$LINENO" 5 -+ else -+ FREETYPE2_CFLAGS=`$PKGCONFIG_CONFIG --cflags freetype2` -+ FREETYPE2_LIBS=`$PKGCONFIG_CONFIG --libs freetype2` -+ fi -+ else -+ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` -+ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` - fi - -- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` -- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` -+ for ac_i in $FREETYPE2_CFLAGS; do -+ case $ac_i in -+ -I*) -+ ac_ii=`echo $ac_i|cut -c 3-` - -+ if test "$ac_ii" != "/usr/include"; then - -- for ac_i in $FREETYPE2_CFLAGS; do -- case $ac_i in -- -I*) -- ac_ii=`echo $ac_i|cut -c 3-` -- -- if test "$ac_ii" != "/usr/include"; then -- -- if test -z "$ac_ii" || echo "$ac_ii" | grep '^/' >/dev/null ; then -- ai_p=$ac_ii -- else -+ if test -z "$ac_ii" || echo "$ac_ii" | grep '^/' >/dev/null ; then -+ ai_p=$ac_ii -+ else - - ep_dir=`echo $ac_ii|$SED 's%/*[^/][^/]*/*$%%'` - diff --git a/mysql-socket-php7.1.patch b/mysql-socket-php7.1.patch new file mode 100644 index 000000000000..580a53572980 --- /dev/null +++ b/mysql-socket-php7.1.patch @@ -0,0 +1,26 @@ +diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c +index 8897038..6121317 100644 +--- a/ext/mysqlnd/mysqlnd_connection.c ++++ b/ext/mysqlnd/mysqlnd_connection.c +@@ -554,7 +554,7 @@ + if (hostname.l == sizeof("localhost") - 1 && !strncasecmp(hostname.s, "localhost", hostname.l)) { + DBG_INF_FMT("socket=%s", socket_or_pipe->s? socket_or_pipe->s:"n/a"); + if (!socket_or_pipe->s) { +- socket_or_pipe->s = "/tmp/mysql.sock"; ++ socket_or_pipe->s = "/run/mysqld/mysqld.sock"; + socket_or_pipe->l = strlen(socket_or_pipe->s); + } + transport.l = mnd_sprintf(&transport.s, 0, "unix://%s", socket_or_pipe->s); +diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c +index 54e1c93..b355a83 100644 +--- a/ext/pdo_mysql/pdo_mysql.c ++++ b/ext/pdo_mysql/pdo_mysql.c +@@ -51,7 +51,7 @@ + # define PDO_MYSQL_UNIX_ADDR PHP_MYSQL_UNIX_SOCK_ADDR + # else + # if !PHP_WIN32 +-# define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock" ++# define PDO_MYSQL_UNIX_ADDR "/run/mysqld/mysqld.sock" + # else + # define PDO_MYSQL_UNIX_ADDR NULL + # endif diff --git a/pear-config-patcher.php b/pear-config-patcher.php new file mode 100644 index 000000000000..ac6a1254282b --- /dev/null +++ b/pear-config-patcher.php @@ -0,0 +1,42 @@ +<?php +if (!isset($argv, $argc)) { + echo "No command line args provided\n"; + exit(1); +} +if ($argc < 3) { + echo "Not all command line args provided\n"; + exit(2); +} +$targetFile = $confFile = $argv[1]; +$varPath = $argv[2]; + +$data = ''; +$file = fopen($confFile, "r"); + +if ($file !== false) { + while(!feof($file)) { + $line = fgets($file); + $serialized = @unserialize($line); + if (is_array($serialized)) { + $serialized['temp_dir'] = "{$varPath}/temp"; + $serialized['cache_dir'] = "{$varPath}/cache"; + $serialized['download_dir'] = "{$varPath}/download"; + $serialized['metadata_dir'] = "{$varPath}/metadata"; + $data .= @serialize($serialized); + $data .= "\n"; + } else { + $data .= $line; + } + } + fclose($file); + if (false !== file_put_contents($targetFile, $data)) { + echo "Written to $targetFile\n"; + } else { + echo "Failed to write to $targetFile\n"; + exit(3); + } +} else { + echo "File was not found {$confFile}\n"; + exit(4); +} +exit(0); diff --git a/php-apache.conf b/php-apache.conf new file mode 100644 index 000000000000..e74ae8d9b7a8 --- /dev/null +++ b/php-apache.conf @@ -0,0 +1,13 @@ +# Required modules: dir_module, @MODULE@ + +<IfModule dir_module> + <IfModule @MODULE@> + DirectoryIndex index.php index.html + <FilesMatch "\.php$"> + SetHandler application/x-httpd-php + </FilesMatch> + <FilesMatch "\.phps$"> + SetHandler application/x-httpd-php-source + </FilesMatch> + </IfModule> +</IfModule> diff --git a/php-enchant-depr.patch b/php-enchant-depr.patch new file mode 100644 index 000000000000..0e2d2c0cf676 --- /dev/null +++ b/php-enchant-depr.patch @@ -0,0 +1,38 @@ +--- php-7.2.1/ext/enchant/enchant.c.orig ++++ php-7.2.1/ext/enchant/enchant.c +@@ -741,7 +741,7 @@ + for (i = 0; i < n_sugg; i++) { + add_next_index_string(sugg, suggs[i]); + } +- enchant_dict_free_suggestions(pdict->pdict, suggs); ++ enchant_dict_free_string_list(pdict->pdict, suggs); + } + + +@@ -798,7 +798,7 @@ + add_next_index_string(return_value, suggs[i]); + } + +- enchant_dict_free_suggestions(pdict->pdict, suggs); ++ enchant_dict_free_string_list(pdict->pdict, suggs); + } + } + /* }}} */ +@@ -818,7 +818,7 @@ + + PHP_ENCHANT_GET_DICT; + +- enchant_dict_add_to_personal(pdict->pdict, word, wordlen); ++ enchant_dict_add(pdict->pdict, word, wordlen); + } + /* }}} */ + +@@ -856,7 +856,7 @@ + + PHP_ENCHANT_GET_DICT; + +- RETURN_BOOL(enchant_dict_is_in_session(pdict->pdict, word, wordlen)); ++ RETURN_BOOL(enchant_dict_is_added(pdict->pdict, word, wordlen)); + } + /* }}} */ + diff --git a/php-enchant-php5.3.patch b/php-enchant-php5.3.patch new file mode 100644 index 000000000000..b82eef7fdd91 --- /dev/null +++ b/php-enchant-php5.3.patch @@ -0,0 +1,23 @@ +--- a/ext/enchant/config.m4 ++++ b/ext/enchant/config.m4 +@@ -14,9 +14,9 @@ + ENCHANT_SEARCH_DIRS="/usr/local /usr" + fi + for i in $ENCHANT_SEARCH_DIRS; do +- if test -f $i/include/enchant/enchant.h; then ++ if test -f $i/include/enchant-2/enchant.h; then + ENCHANT_DIR=$i +- ENCHANT_INCDIR=$i/include/enchant ++ ENCHANT_INCDIR=$i/include/enchant-2 + elif test -f $i/include/enchant.h; then + ENCHANT_DIR=$i + ENCHANT_INCDIR=$i/include +@@ -31,7 +31,7 @@ + + AC_DEFINE(HAVE_ENCHANT,1,[ ]) + PHP_SUBST(ENCHANT_SHARED_LIBADD) +- PHP_ADD_LIBRARY_WITH_PATH(enchant, $ENCHANT_LIBDIR, ENCHANT_SHARED_LIBADD) ++ PHP_ADD_LIBRARY_WITH_PATH(enchant-2, $ENCHANT_LIBDIR, ENCHANT_SHARED_LIBADD) + PHP_ADD_INCLUDE($ENCHANT_INCDIR) + PHP_CHECK_LIBRARY(enchant, enchant_broker_set_param, + [ diff --git a/php-fpm.install b/php-fpm.install new file mode 100644 index 000000000000..90fa868cd1da --- /dev/null +++ b/php-fpm.install @@ -0,0 +1,31 @@ +pre_install() { + echo "php-fpm pre_install hook" + echo "1=$1" +} + +post_install() { + echo "php-fpm post_install hook" + echo "1=$1" +} + +pre_upgrade() { + echo "php-fpm pre_upgrade hook" + echo "1=$1" + echo "2=$2" +} + +post_upgrade() { + echo "php-fpm post_upgrade hook" + echo "1=$1" + echo "2=$2" +} + +pre_remove() { + echo "php-fpm pre_remove hook" + echo "1=$1" +} + +post_remove() { + echo "php-fpm post_remove hook" + echo "1=$1" +} diff --git a/php-fpm.patch b/php-fpm.patch deleted file mode 100644 index 58fda94dab00..000000000000 --- a/php-fpm.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- sapi/fpm/Makefile.frag.orig -+++ sapi/fpm/Makefile.frag -@@ -15,8 +15,8 @@ - else \ - echo "Installing PHP FPM defconfig: $(INSTALL_ROOT)$(sysconfdir)/" && \ - $(mkinstalldirs) $(INSTALL_ROOT)$(sysconfdir)/php-fpm.d; \ -- $(INSTALL_DATA) sapi/fpm/php-fpm.conf $(INSTALL_ROOT)$(sysconfdir)/php-fpm.conf.default; \ -- $(INSTALL_DATA) sapi/fpm/www.conf $(INSTALL_ROOT)$(sysconfdir)/php-fpm.d/www.conf.default; \ -+ $(INSTALL_DATA) sapi/fpm/php-fpm.conf $(INSTALL_ROOT)$(sysconfdir)/php-fpm.conf; \ -+ $(INSTALL_DATA) sapi/fpm/www.conf $(INSTALL_ROOT)$(sysconfdir)/php-fpm.d/www.conf; \ - fi - - @echo "Installing PHP FPM man page: $(INSTALL_ROOT)$(mandir)/man8/" ---- sapi/fpm/php-fpm.conf.in.orig -+++ sapi/fpm/php-fpm.conf.in -@@ -17,14 +17,14 @@ - ; Pid file - ; Note: the default prefix is @EXPANDED_LOCALSTATEDIR@ - ; Default Value: none --;pid = run/php-fpm.pid -+;pid = /run/php71-fpm/php-fpm.pid - - ; Error log file - ; If it's set to "syslog", log is sent to syslogd instead of being written - ; into a local file. - ; Note: the default prefix is @EXPANDED_LOCALSTATEDIR@ - ; Default Value: log/php-fpm.log --;error_log = log/php-fpm.log -+error_log = syslog - - ; syslog_facility is used to specify what type of program is logging the - ; message. This lets syslogd specify that messages from different facilities ---- sapi/fpm/www.conf.in.orig -+++ sapi/fpm/www.conf.in -@@ -33,7 +33,7 @@ - ; (IPv6 and IPv4-mapped) on a specific port; - ; '/path/to/unix/socket' - to listen on a unix socket. - ; Note: This value is mandatory. --listen = 127.0.0.1:9000 -+listen = /run/php71-fpm/php-fpm.sock - - ; Set listen(2) backlog. - ; Default Value: 511 (-1 on FreeBSD and OpenBSD) -@@ -44,8 +44,8 @@ - ; BSD-derived systems allow connections regardless of permissions. - ; Default Values: user and group are set as the running user - ; mode is set to 0660 --;listen.owner = @php_fpm_user@ --;listen.group = @php_fpm_group@ -+listen.owner = @php_fpm_user@ -+listen.group = @php_fpm_group@ - ;listen.mode = 0660 - ; When POSIX Access Control Lists are supported you can set them using - ; these options, value is a comma separated list of user/group names. -@@ -352,7 +352,7 @@ - ; Chdir to this directory at the start. - ; Note: relative path can be used. - ; Default Value: current directory or / when chroot --;chdir = /var/www -+;chdir = /srv/http - - ; Redirect worker stdout and stderr into main error log. If not set, stdout and - ; stderr will be redirected to /dev/null according to FastCGI specs. ---- sapi/fpm/php-fpm.service.in.orig -+++ sapi/fpm/php-fpm.service.in -@@ -4,8 +4,8 @@ - - [Service] - Type=@php_fpm_systemd@ --PIDFile=@EXPANDED_LOCALSTATEDIR@/run/php-fpm.pid --ExecStart=@EXPANDED_SBINDIR@/php-fpm --nodaemonize --fpm-config @EXPANDED_SYSCONFDIR@/php-fpm.conf -+PIDFile=/run/php71-fpm/php-fpm.pid -+ExecStart=@sbindir@/php-fpm71 --nodaemonize --fpm-config @sysconfdir@/php-fpm.conf - ExecReload=/bin/kill -USR2 $MAINPID - - [Install] diff --git a/php-fpm.tmpfiles b/php-fpm.tmpfiles deleted file mode 100644 index 2de2116424bb..000000000000 --- a/php-fpm.tmpfiles +++ /dev/null @@ -1 +0,0 @@ -d /run/php71-fpm 755 root root diff --git a/php-freetype-2.9.1.patch b/php-freetype-2.9.1.patch new file mode 100644 index 000000000000..506c4f0b036b --- /dev/null +++ b/php-freetype-2.9.1.patch @@ -0,0 +1,50 @@ +--- a/ext/gd/config.m4 ++++ b/ext/gd/config.m4 +@@ -186,21 +186,36 @@ + AC_DEFUN([PHP_GD_FREETYPE2],[ + if test "$PHP_FREETYPE_DIR" != "no"; then + +- for i in $PHP_FREETYPE_DIR /usr/local /usr; do +- if test -f "$i/bin/freetype-config"; then +- FREETYPE2_DIR=$i +- FREETYPE2_CONFIG="$i/bin/freetype-config" +- break ++ AC_PATH_PROG(PKG_CONFIG, pkg-config, no) ++ AC_MSG_CHECKING(for freetype2) ++ ++ if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists freetype2 ; then ++ ++ FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags freetype2` ++ FREETYPE2_LIBS=`$PKG_CONFIG --libs freetype2` ++ FREETYPE2_VERSION=`$PKG_CONFIG --modversion freetype2` ++ FREETYPE2_DIR="found" ++ ++ AC_MSG_RESULT(from pkgconfig: version $FREETYPE2_VERSION found) ++ else ++ ++ for i in $PHP_FREETYPE_DIR /usr/local /usr; do ++ if test -f "$i/bin/freetype-config"; then ++ FREETYPE2_DIR=$i ++ FREETYPE2_CONFIG="$i/bin/freetype-config" ++ break ++ fi ++ done ++ ++ if test -z "$FREETYPE2_DIR"; then ++ AC_MSG_ERROR([freetype-config not found.]) + fi +- done + +- if test -z "$FREETYPE2_DIR"; then +- AC_MSG_ERROR([freetype-config not found.]) ++ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` ++ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` ++ AC_MSG_RESULT(found via freetype-config) + fi + +- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` +- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` +- + PHP_EVAL_INCLINE($FREETYPE2_CFLAGS) + PHP_EVAL_LIBLINE($FREETYPE2_LIBS, GD_SHARED_LIBADD) + AC_DEFINE(HAVE_LIBFREETYPE,1,[ ]) diff --git a/php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch b/php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch deleted file mode 100644 index e24205504be8..000000000000 --- a/php-icu-1100-Utilize-the-recommended-way-to-handle-the-icu-namespace.patch +++ /dev/null @@ -1,303 +0,0 @@ -From 8d35a423838eb462cd39ee535c5d003073cc5f22 Mon Sep 17 00:00:00 2001 -From: Anatol Belski <ab@php.net> -Date: Sat, 31 Mar 2018 18:51:03 +0200 -Subject: [PATCH] Utilize the recommended way to handle the icu namespace - ---- - ext/intl/breakiterator/breakiterator_class.cpp | 1 + - ext/intl/breakiterator/breakiterator_class.h | 2 ++ - ext/intl/breakiterator/breakiterator_methods.cpp | 2 ++ - ext/intl/breakiterator/codepointiterator_internal.cpp | 2 ++ - ext/intl/breakiterator/codepointiterator_internal.h | 3 +++ - ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp | 3 +++ - ext/intl/calendar/calendar_class.cpp | 3 +++ - ext/intl/calendar/calendar_class.h | 2 ++ - ext/intl/calendar/calendar_methods.cpp | 2 ++ - ext/intl/calendar/gregoriancalendar_methods.cpp | 7 +++++++ - ext/intl/common/common_date.cpp | 3 +++ - ext/intl/common/common_date.h | 2 ++ - ext/intl/common/common_enum.h | 1 + - ext/intl/dateformat/dateformat_format_object.cpp | 6 ++++++ - ext/intl/dateformat/dateformat_helpers.cpp | 2 ++ - ext/intl/dateformat/dateformat_helpers.h | 5 +++++ - ext/intl/intl_convertcpp.h | 2 ++ - ext/intl/msgformat/msgformat_helpers.cpp | 10 ++++++++++ - ext/intl/timezone/timezone_class.cpp | 2 ++ - ext/intl/timezone/timezone_class.h | 2 ++ - ext/intl/timezone/timezone_methods.cpp | 4 ++++ - 21 files changed, 66 insertions(+) - ---- a/ext/intl/breakiterator/breakiterator_class.cpp -+++ b/ext/intl/breakiterator/breakiterator_class.cpp -@@ -38,6 +38,7 @@ extern "C" { - } - - using PHP::CodePointBreakIterator; -+using U_ICU_NAMESPACE::RuleBasedBreakIterator; - - /* {{{ Global variables */ - zend_class_entry *BreakIterator_ce_ptr; ---- a/ext/intl/breakiterator/breakiterator_class.h -+++ b/ext/intl/breakiterator/breakiterator_class.h -@@ -26,6 +26,8 @@ - - #ifndef USE_BREAKITERATOR_POINTER - typedef void BreakIterator; -+#else -+using U_ICU_NAMESPACE::BreakIterator; - #endif - - typedef struct { ---- a/ext/intl/breakiterator/breakiterator_methods.cpp -+++ b/ext/intl/breakiterator/breakiterator_methods.cpp -@@ -32,6 +32,8 @@ extern "C" { - } - - using PHP::CodePointBreakIterator; -+using U_ICU_NAMESPACE::BreakIterator; -+using U_ICU_NAMESPACE::Locale; - - U_CFUNC PHP_METHOD(BreakIterator, __construct) - { ---- a/ext/intl/breakiterator/codepointiterator_internal.cpp -+++ b/ext/intl/breakiterator/codepointiterator_internal.cpp -@@ -33,6 +33,8 @@ typedef union { - - using namespace PHP; - -+using U_ICU_NAMESPACE::UCharCharacterIterator; -+ - UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CodePointBreakIterator); - - CodePointBreakIterator::CodePointBreakIterator() ---- a/ext/intl/breakiterator/codepointiterator_internal.h -+++ b/ext/intl/breakiterator/codepointiterator_internal.h -@@ -18,8 +18,11 @@ - #define CODEPOINTITERATOR_INTERNAL_H - - #include <unicode/brkiter.h> -+#include <unicode/unistr.h> - - using U_ICU_NAMESPACE::BreakIterator; -+using U_ICU_NAMESPACE::CharacterIterator; -+using U_ICU_NAMESPACE::UnicodeString; - - namespace PHP { - ---- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp -+++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp -@@ -26,6 +26,9 @@ extern "C" { - #include "../intl_convertcpp.h" - #include "../intl_common.h" - -+using U_ICU_NAMESPACE::RuleBasedBreakIterator; -+using U_ICU_NAMESPACE::Locale; -+ - static inline RuleBasedBreakIterator *fetch_rbbi(BreakIterator_object *bio) { - return (RuleBasedBreakIterator*)bio->biter; - } ---- a/ext/intl/calendar/calendar_class.cpp -+++ b/ext/intl/calendar/calendar_class.cpp -@@ -34,6 +34,9 @@ extern "C" { - #include <assert.h> - } - -+using U_ICU_NAMESPACE::GregorianCalendar; -+using U_ICU_NAMESPACE::Locale; -+ - /* {{{ Global variables */ - zend_class_entry *Calendar_ce_ptr; - zend_class_entry *GregorianCalendar_ce_ptr; ---- a/ext/intl/calendar/calendar_class.h -+++ b/ext/intl/calendar/calendar_class.h -@@ -26,6 +26,8 @@ - - #ifndef USE_CALENDAR_POINTER - typedef void Calendar; -+#else -+using U_ICU_NAMESPACE::Calendar; - #endif - - typedef struct { ---- a/ext/intl/calendar/calendar_methods.cpp -+++ b/ext/intl/calendar/calendar_methods.cpp -@@ -40,6 +40,8 @@ extern "C" { - } - #include "../common/common_enum.h" - -+using U_ICU_NAMESPACE::Locale; -+ - U_CFUNC PHP_METHOD(IntlCalendar, __construct) - { - zend_throw_exception( NULL, ---- a/ext/intl/calendar/gregoriancalendar_methods.cpp -+++ b/ext/intl/calendar/gregoriancalendar_methods.cpp -@@ -23,6 +23,8 @@ - #include <unicode/locid.h> - #include <unicode/calendar.h> - #include <unicode/gregocal.h> -+#include <unicode/ustring.h> -+ - extern "C" { - #include "../php_intl.h" - #include "../intl_common.h" -@@ -34,6 +36,11 @@ extern "C" { - #include "zend_exceptions.h" - } - -+using U_ICU_NAMESPACE::GregorianCalendar; -+using U_ICU_NAMESPACE::Locale; -+using U_ICU_NAMESPACE::UnicodeString; -+using U_ICU_NAMESPACE::StringPiece; -+ - static inline GregorianCalendar *fetch_greg(Calendar_object *co) { - return (GregorianCalendar*)co->ucal; - } ---- a/ext/intl/common/common_date.cpp -+++ b/ext/intl/common/common_date.cpp -@@ -25,4 +25,7 @@ - #include <ext/date/php_date.h> - } - -+using U_ICU_NAMESPACE::TimeZone; -+using U_ICU_NAMESPACE::UnicodeString; -+ - #ifndef INFINITY ---- a/ext/intl/common/common_date.h -+++ b/ext/intl/common/common_date.h -@@ -28,6 +28,8 @@ U_CDECL_END - - #include <unicode/timezone.h> - -+using U_ICU_NAMESPACE::TimeZone; -+ - U_CFUNC TimeZone *timezone_convert_datetimezone(int type, void *object, int is_datetime, intl_error *outside_error, const char *func); - U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz, - intl_error *err, const char *func); ---- a/ext/intl/common/common_enum.h -+++ b/ext/intl/common/common_enum.h -@@ -75,6 +75,7 @@ U_CFUNC zval *zoi_with_current_get_curre - U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter); - - #ifdef __cplusplus -+using U_ICU_NAMESPACE::StringEnumeration; - U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object); - #endif - ---- a/ext/intl/dateformat/dateformat_format_object.cpp -+++ b/ext/intl/dateformat/dateformat_format_object.cpp -@@ -33,6 +33,12 @@ extern "C" { - #include "../common/common_date.h" - } - -+using U_ICU_NAMESPACE::Locale; -+using U_ICU_NAMESPACE::DateFormat; -+using U_ICU_NAMESPACE::GregorianCalendar; -+using U_ICU_NAMESPACE::StringPiece; -+using U_ICU_NAMESPACE::SimpleDateFormat; -+ - static const DateFormat::EStyle valid_styles[] = { - DateFormat::kNone, - DateFormat::kFull, ---- a/ext/intl/dateformat/dateformat_helpers.cpp -+++ b/ext/intl/dateformat/dateformat_helpers.cpp -@@ -28,6 +28,8 @@ extern "C" { - #include "../calendar/calendar_class.h" - } - -+using U_ICU_NAMESPACE::GregorianCalendar; -+ - int datefmt_process_calendar_arg(zval* calendar_zv, - Locale const& locale, - const char *func_name, ---- a/ext/intl/dateformat/dateformat_helpers.h -+++ b/ext/intl/dateformat/dateformat_helpers.h -@@ -22,11 +22,16 @@ - #endif - - #include <unicode/calendar.h> -+#include <unicode/datefmt.h> - - extern "C" { - #include "../php_intl.h" - } - -+using U_ICU_NAMESPACE::Locale; -+using U_ICU_NAMESPACE::Calendar; -+using U_ICU_NAMESPACE::DateFormat; -+ - int datefmt_process_calendar_arg(zval* calendar_zv, - Locale const& locale, - const char *func_name, ---- a/ext/intl/intl_convertcpp.h -+++ b/ext/intl/intl_convertcpp.h -@@ -26,6 +26,8 @@ - #include <unicode/unistr.h> - #include <zend_types.h> - -+using U_ICU_NAMESPACE::UnicodeString; -+ - int intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status); - - zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status); ---- a/ext/intl/msgformat/msgformat_helpers.cpp -+++ b/ext/intl/msgformat/msgformat_helpers.cpp -@@ -76,6 +76,16 @@ MessageFormatAdapter::getMessagePattern( - #endif - U_NAMESPACE_END - -+using U_ICU_NAMESPACE::Formattable; -+using U_ICU_NAMESPACE::Format; -+using U_ICU_NAMESPACE::DateFormat; -+using U_ICU_NAMESPACE::MessageFormat; -+#ifdef HAS_MESSAGE_PATTERN -+using U_ICU_NAMESPACE::MessagePattern; -+#endif -+using U_ICU_NAMESPACE::MessageFormatAdapter; -+using U_ICU_NAMESPACE::FieldPosition; -+ - U_CFUNC int32_t umsg_format_arg_count(UMessageFormat *fmt) - { - int32_t fmt_count = 0; ---- a/ext/intl/timezone/timezone_class.cpp -+++ b/ext/intl/timezone/timezone_class.cpp -@@ -37,6 +37,8 @@ extern "C" { - #include <ext/date/php_date.h> - } - -+using U_ICU_NAMESPACE::Calendar; -+ - /* {{{ Global variables */ - U_CDECL_BEGIN - zend_class_entry *TimeZone_ce_ptr = NULL; ---- a/ext/intl/timezone/timezone_class.h -+++ b/ext/intl/timezone/timezone_class.h -@@ -29,6 +29,8 @@ - - #ifndef USE_TIMEZONE_POINTER - typedef void TimeZone; -+#else -+using U_ICU_NAMESPACE::TimeZone; - #endif - - typedef struct { ---- a/ext/intl/timezone/timezone_methods.cpp -+++ b/ext/intl/timezone/timezone_methods.cpp -@@ -23,6 +23,7 @@ - #include <unicode/locid.h> - #include <unicode/timezone.h> - #include <unicode/ustring.h> -+#include <unicode/calendar.h> - #include "intl_convertcpp.h" - - #include "../common/common_date.h" -@@ -37,6 +38,9 @@ extern "C" { - } - #include "common/common_enum.h" - -+using U_ICU_NAMESPACE::Locale; -+using U_ICU_NAMESPACE::Calendar; -+ - U_CFUNC PHP_METHOD(IntlTimeZone, __construct) - { - zend_throw_exception( NULL, diff --git a/php-icu-1101-Simplify-namespace-access.patch b/php-icu-1101-Simplify-namespace-access.patch deleted file mode 100644 index 84e8145ab44c..000000000000 --- a/php-icu-1101-Simplify-namespace-access.patch +++ /dev/null @@ -1,307 +0,0 @@ -From d8200e48857aeaf09f7127751efc5632ef7660a7 Mon Sep 17 00:00:00 2001 -From: Anatol Belski <ab@php.net> -Date: Sun, 1 Apr 2018 01:03:40 +0200 -Subject: [PATCH] Simplify namespace access - -The icu namespace is an alias which resolves to the real namespace. ---- - ext/intl/breakiterator/breakiterator_class.cpp | 2 +- - ext/intl/breakiterator/breakiterator_class.h | 2 +- - ext/intl/breakiterator/breakiterator_methods.cpp | 4 ++-- - ext/intl/breakiterator/codepointiterator_internal.cpp | 2 +- - ext/intl/breakiterator/codepointiterator_internal.h | 6 +++--- - ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp | 4 ++-- - ext/intl/calendar/calendar_class.cpp | 4 ++-- - ext/intl/calendar/calendar_class.h | 2 +- - ext/intl/calendar/calendar_methods.cpp | 2 +- - ext/intl/calendar/gregoriancalendar_methods.cpp | 8 ++++---- - ext/intl/common/common_date.cpp | 4 ++-- - ext/intl/common/common_date.h | 2 +- - ext/intl/common/common_enum.h | 2 +- - ext/intl/dateformat/dateformat_format_object.cpp | 10 +++++----- - ext/intl/dateformat/dateformat_helpers.cpp | 2 +- - ext/intl/dateformat/dateformat_helpers.h | 6 +++--- - ext/intl/intl_convertcpp.h | 2 +- - ext/intl/msgformat/msgformat_helpers.cpp | 14 +++++++------- - ext/intl/timezone/timezone_class.cpp | 2 +- - ext/intl/timezone/timezone_class.h | 2 +- - ext/intl/timezone/timezone_methods.cpp | 4 ++-- - 21 files changed, 43 insertions(+), 43 deletions(-) - ---- a/ext/intl/breakiterator/breakiterator_class.cpp -+++ b/ext/intl/breakiterator/breakiterator_class.cpp -@@ -38,7 +38,7 @@ extern "C" { - } - - using PHP::CodePointBreakIterator; --using U_ICU_NAMESPACE::RuleBasedBreakIterator; -+using icu::RuleBasedBreakIterator; - - /* {{{ Global variables */ - zend_class_entry *BreakIterator_ce_ptr; ---- a/ext/intl/breakiterator/breakiterator_class.h -+++ b/ext/intl/breakiterator/breakiterator_class.h -@@ -27,7 +27,7 @@ - #ifndef USE_BREAKITERATOR_POINTER - typedef void BreakIterator; - #else --using U_ICU_NAMESPACE::BreakIterator; -+using icu::BreakIterator; - #endif - - typedef struct { ---- a/ext/intl/breakiterator/breakiterator_methods.cpp -+++ b/ext/intl/breakiterator/breakiterator_methods.cpp -@@ -32,8 +32,8 @@ extern "C" { - } - - using PHP::CodePointBreakIterator; --using U_ICU_NAMESPACE::BreakIterator; --using U_ICU_NAMESPACE::Locale; -+using icu::BreakIterator; -+using icu::Locale; - - U_CFUNC PHP_METHOD(BreakIterator, __construct) - { ---- a/ext/intl/breakiterator/codepointiterator_internal.cpp -+++ b/ext/intl/breakiterator/codepointiterator_internal.cpp -@@ -33,7 +33,7 @@ typedef union { - - using namespace PHP; - --using U_ICU_NAMESPACE::UCharCharacterIterator; -+using icu::UCharCharacterIterator; - - UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CodePointBreakIterator); - ---- a/ext/intl/breakiterator/codepointiterator_internal.h -+++ b/ext/intl/breakiterator/codepointiterator_internal.h -@@ -20,9 +20,9 @@ - #include <unicode/brkiter.h> - #include <unicode/unistr.h> - --using U_ICU_NAMESPACE::BreakIterator; --using U_ICU_NAMESPACE::CharacterIterator; --using U_ICU_NAMESPACE::UnicodeString; -+using icu::BreakIterator; -+using icu::CharacterIterator; -+using icu::UnicodeString; - - namespace PHP { - ---- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp -+++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp -@@ -26,8 +26,8 @@ extern "C" { - #include "../intl_convertcpp.h" - #include "../intl_common.h" - --using U_ICU_NAMESPACE::RuleBasedBreakIterator; --using U_ICU_NAMESPACE::Locale; -+using icu::RuleBasedBreakIterator; -+using icu::Locale; - - static inline RuleBasedBreakIterator *fetch_rbbi(BreakIterator_object *bio) { - return (RuleBasedBreakIterator*)bio->biter; ---- a/ext/intl/calendar/calendar_class.cpp -+++ b/ext/intl/calendar/calendar_class.cpp -@@ -34,8 +34,8 @@ extern "C" { - #include <assert.h> - } - --using U_ICU_NAMESPACE::GregorianCalendar; --using U_ICU_NAMESPACE::Locale; -+using icu::GregorianCalendar; -+using icu::Locale; - - /* {{{ Global variables */ - zend_class_entry *Calendar_ce_ptr; ---- a/ext/intl/calendar/calendar_class.h -+++ b/ext/intl/calendar/calendar_class.h -@@ -27,7 +27,7 @@ - #ifndef USE_CALENDAR_POINTER - typedef void Calendar; - #else --using U_ICU_NAMESPACE::Calendar; -+using icu::Calendar; - #endif - - typedef struct { ---- a/ext/intl/calendar/calendar_methods.cpp -+++ b/ext/intl/calendar/calendar_methods.cpp -@@ -40,7 +40,7 @@ extern "C" { - } - #include "../common/common_enum.h" - --using U_ICU_NAMESPACE::Locale; -+using icu::Locale; - - U_CFUNC PHP_METHOD(IntlCalendar, __construct) - { ---- a/ext/intl/calendar/gregoriancalendar_methods.cpp -+++ b/ext/intl/calendar/gregoriancalendar_methods.cpp -@@ -36,10 +36,10 @@ extern "C" { - #include "zend_exceptions.h" - } - --using U_ICU_NAMESPACE::GregorianCalendar; --using U_ICU_NAMESPACE::Locale; --using U_ICU_NAMESPACE::UnicodeString; --using U_ICU_NAMESPACE::StringPiece; -+using icu::GregorianCalendar; -+using icu::Locale; -+using icu::UnicodeString; -+using icu::StringPiece; - - static inline GregorianCalendar *fetch_greg(Calendar_object *co) { - return (GregorianCalendar*)co->ucal; ---- a/ext/intl/common/common_date.cpp -+++ b/ext/intl/common/common_date.cpp -@@ -25,8 +25,8 @@ extern "C" { - #include <ext/date/php_date.h> - } - --using U_ICU_NAMESPACE::TimeZone; --using U_ICU_NAMESPACE::UnicodeString; -+using icu::TimeZone; -+using icu::UnicodeString; - - #include "zend_portability.h" - ---- a/ext/intl/common/common_date.h -+++ b/ext/intl/common/common_date.h -@@ -28,7 +28,7 @@ U_CDECL_END - - #include <unicode/timezone.h> - --using U_ICU_NAMESPACE::TimeZone; -+using icu::TimeZone; - - U_CFUNC TimeZone *timezone_convert_datetimezone(int type, void *object, int is_datetime, intl_error *outside_error, const char *func); - U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz, ---- a/ext/intl/common/common_enum.h -+++ b/ext/intl/common/common_enum.h -@@ -75,7 +75,7 @@ U_CFUNC zval *zoi_with_current_get_curre - U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter); - - #ifdef __cplusplus --using U_ICU_NAMESPACE::StringEnumeration; -+using icu::StringEnumeration; - U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object); - #endif - ---- a/ext/intl/dateformat/dateformat_format_object.cpp -+++ b/ext/intl/dateformat/dateformat_format_object.cpp -@@ -33,11 +33,11 @@ extern "C" { - #include "../common/common_date.h" - } - --using U_ICU_NAMESPACE::Locale; --using U_ICU_NAMESPACE::DateFormat; --using U_ICU_NAMESPACE::GregorianCalendar; --using U_ICU_NAMESPACE::StringPiece; --using U_ICU_NAMESPACE::SimpleDateFormat; -+using icu::Locale; -+using icu::DateFormat; -+using icu::GregorianCalendar; -+using icu::StringPiece; -+using icu::SimpleDateFormat; - - static const DateFormat::EStyle valid_styles[] = { - DateFormat::kNone, ---- a/ext/intl/dateformat/dateformat_helpers.cpp -+++ b/ext/intl/dateformat/dateformat_helpers.cpp -@@ -28,7 +28,7 @@ extern "C" { - #include "../calendar/calendar_class.h" - } - --using U_ICU_NAMESPACE::GregorianCalendar; -+using icu::GregorianCalendar; - - int datefmt_process_calendar_arg(zval* calendar_zv, - Locale const& locale, ---- a/ext/intl/dateformat/dateformat_helpers.h -+++ b/ext/intl/dateformat/dateformat_helpers.h -@@ -28,9 +28,9 @@ extern "C" { - #include "../php_intl.h" - } - --using U_ICU_NAMESPACE::Locale; --using U_ICU_NAMESPACE::Calendar; --using U_ICU_NAMESPACE::DateFormat; -+using icu::Locale; -+using icu::Calendar; -+using icu::DateFormat; - - int datefmt_process_calendar_arg(zval* calendar_zv, - Locale const& locale, ---- a/ext/intl/intl_convertcpp.h -+++ b/ext/intl/intl_convertcpp.h -@@ -26,7 +26,7 @@ - #include <unicode/unistr.h> - #include <zend_types.h> - --using U_ICU_NAMESPACE::UnicodeString; -+using icu::UnicodeString; - - int intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status); - ---- a/ext/intl/msgformat/msgformat_helpers.cpp -+++ b/ext/intl/msgformat/msgformat_helpers.cpp -@@ -76,15 +76,15 @@ MessageFormatAdapter::getMessagePattern( - #endif - U_NAMESPACE_END - --using U_ICU_NAMESPACE::Formattable; --using U_ICU_NAMESPACE::Format; --using U_ICU_NAMESPACE::DateFormat; --using U_ICU_NAMESPACE::MessageFormat; -+using icu::Formattable; -+using icu::Format; -+using icu::DateFormat; -+using icu::MessageFormat; - #ifdef HAS_MESSAGE_PATTERN --using U_ICU_NAMESPACE::MessagePattern; -+using icu::MessagePattern; - #endif --using U_ICU_NAMESPACE::MessageFormatAdapter; --using U_ICU_NAMESPACE::FieldPosition; -+using icu::MessageFormatAdapter; -+using icu::FieldPosition; - - U_CFUNC int32_t umsg_format_arg_count(UMessageFormat *fmt) - { ---- a/ext/intl/timezone/timezone_class.cpp -+++ b/ext/intl/timezone/timezone_class.cpp -@@ -37,7 +37,7 @@ extern "C" { - #include <ext/date/php_date.h> - } - --using U_ICU_NAMESPACE::Calendar; -+using icu::Calendar; - - /* {{{ Global variables */ - U_CDECL_BEGIN ---- a/ext/intl/timezone/timezone_class.h -+++ b/ext/intl/timezone/timezone_class.h -@@ -30,7 +30,7 @@ - #ifndef USE_TIMEZONE_POINTER - typedef void TimeZone; - #else --using U_ICU_NAMESPACE::TimeZone; -+using icu::TimeZone; - #endif - - typedef struct { ---- a/ext/intl/timezone/timezone_methods.cpp -+++ b/ext/intl/timezone/timezone_methods.cpp -@@ -38,8 +38,8 @@ extern "C" { - } - #include "common/common_enum.h" - --using U_ICU_NAMESPACE::Locale; --using U_ICU_NAMESPACE::Calendar; -+using icu::Locale; -+using icu::Calendar; - - U_CFUNC PHP_METHOD(IntlTimeZone, __construct) - { diff --git a/php-icu-php5.5.patch b/php-icu-php5.5.patch new file mode 100644 index 000000000000..4dde37a4c30e --- /dev/null +++ b/php-icu-php5.5.patch @@ -0,0 +1,40 @@ +--- a/ext/intl/breakiterator/codepointiterator_internal.cpp ++++ b/ext/intl/breakiterator/codepointiterator_internal.cpp +@@ -74,7 +74,11 @@ + clearCurrentCharIter(); + } + ++#if U_ICU_VERSION_MAJOR_NUM >= 70 ++bool CodePointBreakIterator::operator==(const BreakIterator& that) const ++#else + UBool CodePointBreakIterator::operator==(const BreakIterator& that) const ++#endif + { + if (typeid(*this) != typeid(that)) { + return FALSE; +--- 7.2.34/ext/intl/breakiterator/codepointiterator_internal.h ++++ 7.2.34/ext/intl/breakiterator/codepointiterator_internal.h +@@ -36,8 +36,11 @@ + + virtual ~CodePointBreakIterator(); + ++#if U_ICU_VERSION_MAJOR_NUM >= 70 ++ virtual bool operator==(const BreakIterator& that) const; ++#else + virtual UBool operator==(const BreakIterator& that) const; +- ++#endif + virtual CodePointBreakIterator* clone(void) const; + + virtual UClassID getDynamicClassID(void) const; +--- a/ext/intl/locale/locale_methods.c ++++ b/ext/intl/locale/locale_methods.c +@@ -1333,7 +1333,7 @@ + if( token && (token==cur_lang_tag) ){ + /* check if the char. after match is SEPARATOR */ + chrcheck = token + (strlen(cur_loc_range)); +- if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){ ++ if( isIDSeparator(*chrcheck) || isKeywordSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){ + if( cur_lang_tag){ + efree( cur_lang_tag ); + } diff --git a/php-makefile-patcher.php b/php-makefile-patcher.php new file mode 100644 index 000000000000..7a071eeba66d --- /dev/null +++ b/php-makefile-patcher.php @@ -0,0 +1,47 @@ +<?php +if (!isset($argv, $argc)) { + echo "No command line args provided\n"; + exit(1); +} +if ($argc < 2) { + echo "Not all command line args provided\n"; + exit(2); +} +$filename = $argv[1]; +$fileContent = @file_get_contents($filename); +if (!strlen($fileContent)) { + echo "No file contents of $filename\n"; + exit(3); +} +$matches = array(); +$match = preg_match("/^(?P<line>(?P<definition>PHP_MODULES[\s\t]+=[\s\t]+)(?P<expression>.*)$)/m", $fileContent, $matches); +if (!$match) { + echo "No PHP_MODULES in $filename\n"; + exit (4); +} +$expression = explode(' ', $matches['expression']); +function sortByPrio($a, $b) { + $aPrio = 999; + $bPrio = 999; + $priorities = array('/openssl/i'=> 0, '@\/xml\.@i'=>1, '@\/pdo\.@i'=>2, '@\/dom\.@i'=>3, '/mysqlnd/i'=>4); + foreach ($priorities as $regex => $prio) { + if (preg_match($regex, $a) && $prio < $aPrio) { + $aPrio = $prio; + } + if (preg_match($regex, $b) && $prio < $bPrio) { + $bPrio = $prio; + } + } + if ($aPrio == $bPrio) { + return 0; + } + return $aPrio > $bPrio ? 1: -1; +} +usort($expression, 'sortByPrio'); +$expression = $matches['definition'].join (' ', $expression)."\n"; +$fileContent = str_replace($matches['line'], $expression, $fileContent); +if (!file_put_contents($filename, $fileContent)) { + echo "Failed to write to $filename\n"; + exit(5); +} +exit(0); diff --git a/php-phpinfo.patch b/php-phpinfo.patch new file mode 100644 index 000000000000..72d0beaea4bd --- /dev/null +++ b/php-phpinfo.patch @@ -0,0 +1,22 @@ +--- a/ext/standard/info.c ++++ b/ext/standard/info.c +@@ -810,9 +810,6 @@ PHPAPI ZEND_COLD void php_print_info(int flag) + #ifdef ARCHITECTURE + php_info_print_table_row(2, "Architecture", ARCHITECTURE); + #endif +-#ifdef CONFIGURE_COMMAND +- php_info_print_table_row(2, "Configure Command", CONFIGURE_COMMAND ); +-#endif + + if (sapi_module.pretty_name) { + php_info_print_table_row(2, "Server API", sapi_module.pretty_name ); +--- a/ext/standard/tests/general_functions/phpinfo.phpt ++++ b/ext/standard/tests/general_functions/phpinfo.phpt +@@ -20,7 +20,6 @@ PHP Version => %s + + System => %s + Build Date => %s%a +-Configure Command => %s + Server API => Command Line Interface + Virtual Directory Support => %s + Configuration File (php.ini) Path => %s diff --git a/php.ini.patch b/php.ini.patch deleted file mode 100644 index faa94793b01d..000000000000 --- a/php.ini.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- php.ini-production.orig -+++ php.ini-production -@@ -734,5 +734,5 @@ - ; Directory in which the loadable extensions (modules) reside. - ; http://php.net/extension-dir --; extension_dir = "./" -+extension_dir = "/usr/lib/php71/modules/" - ; On windows: - ; extension_dir = "ext" -@@ -886,41 +886,38 @@ --; Windows Extensions --; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5+) --; extension folders as well as the separate PECL DLL download (PHP 5+). --; Be sure to appropriately set the extension_dir directive. --; --;extension=php_bz2.dll --;extension=php_curl.dll --;extension=php_fileinfo.dll --;extension=php_ftp.dll --;extension=php_gd2.dll --;extension=php_gettext.dll --;extension=php_gmp.dll --;extension=php_intl.dll --;extension=php_imap.dll --;extension=php_interbase.dll --;extension=php_ldap.dll --;extension=php_mbstring.dll --;extension=php_exif.dll ; Must be after mbstring as it depends on it --;extension=php_mysqli.dll --;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client --;extension=php_odbc.dll --;extension=php_openssl.dll --;extension=php_pdo_firebird.dll --;extension=php_pdo_mysql.dll --;extension=php_pdo_oci.dll --;extension=php_pdo_odbc.dll --;extension=php_pdo_pgsql.dll --;extension=php_pdo_sqlite.dll --;extension=php_pgsql.dll --;extension=php_shmop.dll -- --; The MIBS data available in the PHP distribution must be installed. --; See http://www.php.net/manual/en/snmp.installation.php --;extension=php_snmp.dll -- --;extension=php_soap.dll --;extension=php_sockets.dll --;extension=php_sqlite3.dll --;extension=php_tidy.dll --;extension=php_xmlrpc.dll --;extension=php_xsl.dll -+;extension=bcmath.so -+;extension=bz2.so -+;extension=calendar.so -+extension=curl.so -+;extension=dba.so -+;extension=enchant.so -+;extension=exif.so -+;extension=ftp.so -+;extension=gd.so -+;extension=gettext.so -+;extension=gmp.so -+;extension=iconv.so -+;extension=imap.so -+;extension=intl.so -+;extension=ldap.so -+;extension=mcrypt.so -+;extension=mysqli.so -+;extension=odbc.so -+;zend_extension=opcache.so -+;extension=pdo_dblib.so -+;extension=pdo_mysql.so -+;extension=pdo_odbc.so -+;extension=pdo_pgsql.so -+;extension=pdo_sqlite.so -+;extension=pgsql.so -+;extension=pspell.so -+;extension=shmop.so -+;extension=snmp.so -+;extension=soap.so -+;extension=sockets.so -+;extension=sqlite3.so -+;extension=sysvmsg.so -+;extension=sysvsem.so -+;extension=sysvshm.so -+;extension=tidy.so -+;extension=xmlrpc.so -+;extension=xsl.so -+extension=zip.so diff --git a/php71-phar-names.patch b/php71-phar-names.patch new file mode 100644 index 000000000000..3dae4ab5cced --- /dev/null +++ b/php71-phar-names.patch @@ -0,0 +1,17 @@ +--- a/ext/phar/Makefile.frag ++++ b/ext/phar/Makefile.frag +@@ -42,9 +42,9 @@ + + install-pharcmd: pharcmd + -@$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) +- $(INSTALL) $(builddir)/phar.phar $(INSTALL_ROOT)$(bindir) +- -@rm -f $(INSTALL_ROOT)$(bindir)/phar +- $(LN_S) -f phar.phar $(INSTALL_ROOT)$(bindir)/phar ++ $(INSTALL) $(builddir)/phar.phar $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix).phar ++ -@rm -f $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix) ++ $(LN_S) -f $(program_prefix)phar$(program_suffix).phar $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix) + @$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1 +- @$(INSTALL_DATA) $(builddir)/phar.1 $(INSTALL_ROOT)$(mandir)/man1/phar.1 +- @$(INSTALL_DATA) $(builddir)/phar.phar.1 $(INSTALL_ROOT)$(mandir)/man1/phar.phar.1 ++ @$(INSTALL_DATA) $(builddir)/phar.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phar$(program_suffix).1 ++ @$(INSTALL_DATA) $(builddir)/phar.phar.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phar$(program_suffix).phar.1 diff --git a/recode-php5.3.patch b/recode-php5.3.patch new file mode 100644 index 000000000000..f7fa0105b78d --- /dev/null +++ b/recode-php5.3.patch @@ -0,0 +1,10 @@ +--- a/ext/recode/config9.m4 ++++ b/ext/recode/config9.m4 +@@ -13,6 +13,6 @@ + fi + + if test -n "$recode_conflict"; then +- AC_MSG_ERROR([recode extension can not be configured together with:$recode_conflict]) ++ AC_MSG_WARN([recode extension can not be configured together with:$recode_conflict]) + fi + fi diff --git a/timezonedb-guess.patch b/timezonedb-guess.patch new file mode 100644 index 000000000000..10c057e40799 --- /dev/null +++ b/timezonedb-guess.patch @@ -0,0 +1,27 @@ +index cf4a11b..f2ea919 100644 +--- a/ext/date/php_date.c ++++ b/ext/date/php_date.c +@@ -545,6 +545,23 @@ static char* guess_timezone(const timelib_tzdb *tzdb) + DATEG(timezone_valid) = 1; + return DATEG(default_timezone); + } ++ /* Try to guess timezone from system information */ ++ { ++ struct tm *ta, tmbuf; ++ time_t the_time; ++ char *tzid = NULL; ++ ++ the_time = time(NULL); ++ ta = php_localtime_r(&the_time, &tmbuf); ++ if (ta) { ++ tzid = timelib_timezone_id_from_abbr(ta->tm_zone, ta->tm_gmtoff, ta->tm_isdst); ++ } ++ if (! tzid) { ++ tzid = "UTC"; ++ } ++ ++ return tzid; ++ } + /* Fallback to UTC */ + return "UTC"; + } diff --git a/timezonedb-php7.1.patch b/timezonedb-php7.1.patch new file mode 100644 index 000000000000..90fe548ae765 --- /dev/null +++ b/timezonedb-php7.1.patch @@ -0,0 +1,650 @@ +--- a/ext/date/lib/parse_tz.c ++++ b/ext/date/lib/parse_tz.c +@@ -24,6 +24,16 @@ + + #include "timelib.h" + ++#ifdef HAVE_SYSTEM_TZDATA ++#include <sys/mman.h> ++#include <sys/stat.h> ++#include <limits.h> ++#include <fcntl.h> ++#include <unistd.h> ++ ++#include "php_scandir.h" ++#endif ++ + #include <stdio.h> + + #ifdef HAVE_LOCALE_H +@@ -36,8 +46,12 @@ + #include <strings.h> + #endif + ++#ifndef HAVE_SYSTEM_TZDATA + #define TIMELIB_SUPPORTS_V2DATA + #include "timezonedb.h" ++#endif ++ ++#include <ctype.h> + + #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__)) + # if defined(__LITTLE_ENDIAN__) +@@ -59,6 +73,11 @@ static int read_preamble(const unsigned char **tzf, timelib_tzinfo *tz) + { + uint32_t version; + ++ if (memcmp(*tzf, "TZif", 4) == 0) { ++ *tzf += 20; ++ return 0; ++ } ++ + /* read ID */ + version = (*tzf)[3] - '0'; + *tzf += 4; +@@ -302,7 +321,429 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz) + } + } + +-static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb) ++#ifdef HAVE_SYSTEM_TZDATA ++ ++#ifdef HAVE_SYSTEM_TZDATA_PREFIX ++#define ZONEINFO_PREFIX HAVE_SYSTEM_TZDATA_PREFIX ++#else ++#define ZONEINFO_PREFIX "/usr/share/zoneinfo" ++#endif ++ ++/* System timezone database pointer. */ ++static const timelib_tzdb *timezonedb_system; ++ ++/* Hash table entry for the cache of the zone.tab mapping table. */ ++struct location_info { ++ char code[2]; ++ double latitude, longitude; ++ char name[64]; ++ char *comment; ++ struct location_info *next; ++}; ++ ++/* Cache of zone.tab. */ ++static struct location_info **system_location_table; ++ ++/* Size of the zone.tab hash table; a random-ish prime big enough to ++ * prevent too many collisions. */ ++#define LOCINFO_HASH_SIZE (1021) ++ ++/* Compute a case insensitive hash of str */ ++static uint32_t tz_hash(const char *str) ++{ ++ const unsigned char *p = (const unsigned char *)str; ++ uint32_t hash = 5381; ++ int c; ++ ++ while ((c = tolower(*p++)) != '\0') { ++ hash = (hash << 5) ^ hash ^ c; ++ } ++ ++ return hash % LOCINFO_HASH_SIZE; ++} ++ ++/* Parse an ISO-6709 date as used in zone.tab. Returns end of the ++ * parsed string on success, or NULL on parse error. On success, ++ * writes the parsed number to *result. */ ++static char *parse_iso6709(char *p, double *result) ++{ ++ double v, sign; ++ char *pend; ++ size_t len; ++ ++ if (*p == '+') ++ sign = 1.0; ++ else if (*p == '-') ++ sign = -1.0; ++ else ++ return NULL; ++ ++ p++; ++ for (pend = p; *pend >= '0' && *pend <= '9'; pend++) ++ ;; ++ ++ /* Annoying encoding used by zone.tab has no decimal point, so use ++ * the length to determine the format: ++ * ++ * 4 = DDMM ++ * 5 = DDDMM ++ * 6 = DDMMSS ++ * 7 = DDDMMSS ++ */ ++ len = pend - p; ++ if (len < 4 || len > 7) { ++ return NULL; ++ } ++ ++ /* p => [D]DD */ ++ v = (p[0] - '0') * 10.0 + (p[1] - '0'); ++ p += 2; ++ if (len == 5 || len == 7) ++ v = v * 10.0 + (*p++ - '0'); ++ /* p => MM[SS] */ ++ v += (10.0 * (p[0] - '0') ++ + p[1] - '0') / 60.0; ++ p += 2; ++ /* p => [SS] */ ++ if (len > 5) { ++ v += (10.0 * (p[0] - '0') ++ + p[1] - '0') / 3600.0; ++ p += 2; ++ } ++ ++ /* Round to five decimal place, not because it's a good idea, ++ * but, because the builtin data uses rounded data, so, match ++ * that. */ ++ *result = trunc(v * sign * 100000.0) / 100000.0; ++ ++ return p; ++} ++ ++/* This function parses the zone.tab file to build up the mapping of ++ * timezone to country code and geographic location, and returns a ++ * hash table. The hash table is indexed by the function: ++ * ++ * tz_hash(timezone-name) ++ */ ++static struct location_info **create_location_table(void) ++{ ++ struct location_info **li, *i; ++ char zone_tab[PATH_MAX]; ++ char line[512]; ++ FILE *fp; ++ ++ strncpy(zone_tab, ZONEINFO_PREFIX "/zone.tab", sizeof zone_tab); ++ ++ fp = fopen(zone_tab, "r"); ++ if (!fp) { ++ return NULL; ++ } ++ ++ li = calloc(LOCINFO_HASH_SIZE, sizeof *li); ++ ++ while (fgets(line, sizeof line, fp)) { ++ char *p = line, *code, *name, *comment; ++ uint32_t hash; ++ double latitude, longitude; ++ ++ while (isspace(*p)) ++ p++; ++ ++ if (*p == '#' || *p == '\0' || *p == '\n') ++ continue; ++ ++ if (!isalpha(p[0]) || !isalpha(p[1]) || p[2] != '\t') ++ continue; ++ ++ /* code => AA */ ++ code = p; ++ p[2] = 0; ++ p += 3; ++ ++ /* coords => [+-][D]DDMM[SS][+-][D]DDMM[SS] */ ++ p = parse_iso6709(p, &latitude); ++ if (!p) { ++ continue; ++ } ++ p = parse_iso6709(p, &longitude); ++ if (!p) { ++ continue; ++ } ++ ++ if (!p || *p != '\t') { ++ continue; ++ } ++ ++ /* name = string */ ++ name = ++p; ++ while (*p != '\t' && *p && *p != '\n') ++ p++; ++ ++ *p++ = '\0'; ++ ++ /* comment = string */ ++ comment = p; ++ while (*p != '\t' && *p && *p != '\n') ++ p++; ++ ++ if (*p == '\n' || *p == '\t') ++ *p = '\0'; ++ ++ hash = tz_hash(name); ++ i = malloc(sizeof *i); ++ memcpy(i->code, code, 2); ++ strncpy(i->name, name, sizeof i->name); ++ i->comment = strdup(comment); ++ i->longitude = longitude; ++ i->latitude = latitude; ++ i->next = li[hash]; ++ li[hash] = i; ++ /* printf("%s [%u, %f, %f]\n", name, hash, latitude, longitude); */ ++ } ++ ++ fclose(fp); ++ ++ return li; ++} ++ ++/* Return location info from hash table, using given timezone name. ++ * Returns NULL if the name could not be found. */ ++const struct location_info *find_zone_info(struct location_info **li, ++ const char *name) ++{ ++ uint32_t hash = tz_hash(name); ++ const struct location_info *l; ++ ++ if (!li) { ++ return NULL; ++ } ++ ++ for (l = li[hash]; l; l = l->next) { ++ if (strcasecmp(l->name, name) == 0) ++ return l; ++ } ++ ++ return NULL; ++} ++ ++/* Filter out some non-tzdata files and the posix/right databases, if ++ * present. */ ++static int index_filter(const struct dirent *ent) ++{ ++ return strcmp(ent->d_name, ".") != 0 ++ && strcmp(ent->d_name, "..") != 0 ++ && strcmp(ent->d_name, "posix") != 0 ++ && strcmp(ent->d_name, "posixrules") != 0 ++ && strcmp(ent->d_name, "right") != 0 ++ && strstr(ent->d_name, ".list") == NULL ++ && strstr(ent->d_name, ".tab") == NULL; ++} ++ ++static int sysdbcmp(const void *first, const void *second) ++{ ++ const timelib_tzdb_index_entry *alpha = first, *beta = second; ++ ++ return strcasecmp(alpha->id, beta->id); ++} ++ ++ ++/* Create the zone identifier index by trawling the filesystem. */ ++static void create_zone_index(timelib_tzdb *db) ++{ ++ size_t dirstack_size, dirstack_top; ++ size_t index_size, index_next; ++ timelib_tzdb_index_entry *db_index; ++ char **dirstack; ++ ++ /* LIFO stack to hold directory entries to scan; each slot is a ++ * directory name relative to the zoneinfo prefix. */ ++ dirstack_size = 32; ++ dirstack = malloc(dirstack_size * sizeof *dirstack); ++ dirstack_top = 1; ++ dirstack[0] = strdup(""); ++ ++ /* Index array. */ ++ index_size = 64; ++ db_index = malloc(index_size * sizeof *db_index); ++ index_next = 0; ++ ++ do { ++ struct dirent **ents; ++ char name[PATH_MAX], *top; ++ int count; ++ ++ /* Pop the top stack entry, and iterate through its contents. */ ++ top = dirstack[--dirstack_top]; ++ snprintf(name, sizeof name, ZONEINFO_PREFIX "/%s", top); ++ ++ count = php_scandir(name, &ents, index_filter, php_alphasort); ++ ++ while (count > 0) { ++ struct stat st; ++ const char *leaf = ents[count - 1]->d_name; ++ ++ snprintf(name, sizeof name, ZONEINFO_PREFIX "/%s/%s", ++ top, leaf); ++ ++ if (strlen(name) && stat(name, &st) == 0) { ++ /* Name, relative to the zoneinfo prefix. */ ++ const char *root = top; ++ ++ if (root[0] == '/') root++; ++ ++ snprintf(name, sizeof name, "%s%s%s", root, ++ *root ? "/": "", leaf); ++ ++ if (S_ISDIR(st.st_mode)) { ++ if (dirstack_top == dirstack_size) { ++ dirstack_size *= 2; ++ dirstack = realloc(dirstack, ++ dirstack_size * sizeof *dirstack); ++ } ++ dirstack[dirstack_top++] = strdup(name); ++ } ++ else { ++ if (index_next == index_size) { ++ index_size *= 2; ++ db_index = realloc(db_index, ++ index_size * sizeof *db_index); ++ } ++ ++ db_index[index_next++].id = strdup(name); ++ } ++ } ++ ++ free(ents[--count]); ++ } ++ ++ if (count != -1) free(ents); ++ free(top); ++ } while (dirstack_top); ++ ++ qsort(db_index, index_next, sizeof *db_index, sysdbcmp); ++ ++ db->index = db_index; ++ db->index_size = index_next; ++ ++ free(dirstack); ++} ++ ++#define FAKE_HEADER "1234\0??\1??" ++#define FAKE_UTC_POS (7 - 4) ++ ++/* Create a fake data segment for database 'sysdb'. */ ++static void fake_data_segment(timelib_tzdb *sysdb, ++ struct location_info **info) ++{ ++ size_t n; ++ char *data, *p; ++ ++ data = malloc(3 * sysdb->index_size + 7); ++ ++ p = mempcpy(data, FAKE_HEADER, sizeof(FAKE_HEADER) - 1); ++ ++ for (n = 0; n < sysdb->index_size; n++) { ++ const struct location_info *li; ++ timelib_tzdb_index_entry *ent; ++ ++ ent = (timelib_tzdb_index_entry *)&sysdb->index[n]; ++ ++ /* Lookup the timezone name in the hash table. */ ++ if (strcmp(ent->id, "UTC") == 0) { ++ ent->pos = FAKE_UTC_POS; ++ continue; ++ } ++ ++ li = find_zone_info(info, ent->id); ++ if (li) { ++ /* If found, append the BC byte and the ++ * country code; set the position for this ++ * section of timezone data. */ ++ ent->pos = (p - data) - 4; ++ *p++ = '\1'; ++ *p++ = li->code[0]; ++ *p++ = li->code[1]; ++ } ++ else { ++ /* If not found, the timezone data can ++ * point at the header. */ ++ ent->pos = 0; ++ } ++ } ++ ++ sysdb->data = (unsigned char *)data; ++} ++ ++/* Returns true if the passed-in stat structure describes a ++ * probably-valid timezone file. */ ++static int is_valid_tzfile(const struct stat *st, int fd) ++{ ++ if (fd) { ++ char buf[20]; ++ if (read(fd, buf, 20)!=20) { ++ return 0; ++ } ++ lseek(fd, SEEK_SET, 0); ++ if (memcmp(buf, "TZif", 4)) { ++ return 0; ++ } ++ } ++ return S_ISREG(st->st_mode) && st->st_size > 20; ++} ++ ++/* To allow timezone names to be used case-insensitively, find the ++ * canonical name for this timezone, if possible. */ ++static const char *canonical_tzname(const char *timezone) ++{ ++ if (timezonedb_system) { ++ timelib_tzdb_index_entry *ent, lookup; ++ ++ lookup.id = (char *)timezone; ++ ++ ent = bsearch(&lookup, timezonedb_system->index, ++ timezonedb_system->index_size, sizeof lookup, ++ sysdbcmp); ++ if (ent) { ++ return ent->id; ++ } ++ } ++ ++ return timezone; ++} ++ ++/* Return the mmap()ed tzfile if found, else NULL. On success, the ++ * length of the mapped data is placed in *length. */ ++static char *map_tzfile(const char *timezone, size_t *length) ++{ ++ char fname[PATH_MAX]; ++ struct stat st; ++ char *p; ++ int fd; ++ ++ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) { ++ return NULL; ++ } ++ ++ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", canonical_tzname(timezone)); ++ ++ fd = open(fname, O_RDONLY); ++ if (fd == -1) { ++ return NULL; ++ } else if (fstat(fd, &st) != 0 || !is_valid_tzfile(&st, fd)) { ++ close(fd); ++ return NULL; ++ } ++ ++ *length = st.st_size; ++ p = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); ++ close(fd); ++ ++ return p != MAP_FAILED ? p : NULL; ++} ++ ++#endif ++ ++static int inmem_seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb) + { + int left = 0, right = tzdb->index_size - 1; + #ifdef HAVE_SETLOCALE +@@ -341,21 +782,88 @@ static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const + return 0; + } + ++static int seek_to_tz_position(const unsigned char **tzf, char *timezone, ++ char **map, size_t *maplen, ++ const timelib_tzdb *tzdb) ++{ ++#ifdef HAVE_SYSTEM_TZDATA ++ if (tzdb == timezonedb_system) { ++ char *orig; ++ ++ orig = map_tzfile(timezone, maplen); ++ if (orig == NULL) { ++ return 0; ++ } ++ ++ (*tzf) = (unsigned char *)orig; ++ *map = orig; ++ return 1; ++ } ++ else ++#endif ++ { ++ return inmem_seek_to_tz_position(tzf, timezone, tzdb); ++ } ++} ++ + const timelib_tzdb *timelib_builtin_db(void) + { ++#ifdef HAVE_SYSTEM_TZDATA ++ if (timezonedb_system == NULL) { ++ timelib_tzdb *tmp = malloc(sizeof *tmp); ++ ++ tmp->version = "0.system"; ++ tmp->data = NULL; ++ create_zone_index(tmp); ++ system_location_table = create_location_table(); ++ fake_data_segment(tmp, system_location_table); ++ timezonedb_system = tmp; ++ } ++ ++ return timezonedb_system; ++#else + return &timezonedb_builtin; ++#endif + } + + const timelib_tzdb_index_entry *timelib_timezone_builtin_identifiers_list(int *count) + { ++#ifdef HAVE_SYSTEM_TZDATA ++ *count = timezonedb_system->index_size; ++ return timezonedb_system->index; ++#else + *count = sizeof(timezonedb_idx_builtin) / sizeof(*timezonedb_idx_builtin); + return timezonedb_idx_builtin; ++#endif + } + + int timelib_timezone_id_is_valid(char *timezone, const timelib_tzdb *tzdb) + { + const unsigned char *tzf; +- return (seek_to_tz_position(&tzf, timezone, tzdb)); ++ ++#ifdef HAVE_SYSTEM_TZDATA ++ if (tzdb == timezonedb_system) { ++ char fname[PATH_MAX]; ++ struct stat st; ++ ++ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) { ++ return 0; ++ } ++ ++ if (system_location_table) { ++ if (find_zone_info(system_location_table, timezone) != NULL) { ++ /* found in cache */ ++ return 1; ++ } ++ } ++ ++ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", canonical_tzname(timezone)); ++ ++ return stat(fname, &st) == 0 && is_valid_tzfile(&st, 0); ++ } ++#endif ++ ++ return (inmem_seek_to_tz_position(&tzf, timezone, tzdb)); + } + + static void skip_64bit_preamble(const unsigned char **tzf, timelib_tzinfo *tz) +@@ -380,24 +888,54 @@ static void read_64bit_header(const unsigned char **tzf, timelib_tzinfo *tz) + timelib_tzinfo *timelib_parse_tzfile(char *timezone, const timelib_tzdb *tzdb) + { + const unsigned char *tzf; ++ char *memmap = NULL; ++ size_t maplen; + timelib_tzinfo *tmp; + int version; + +- if (seek_to_tz_position(&tzf, timezone, tzdb)) { ++ if (seek_to_tz_position(&tzf, timezone, &memmap, &maplen, tzdb)) { + tmp = timelib_tzinfo_ctor(timezone); + + version = read_preamble(&tzf, tmp); + read_header(&tzf, tmp); + read_transistions(&tzf, tmp); + read_types(&tzf, tmp); +- if (version == 2) { +- skip_64bit_preamble(&tzf, tmp); +- read_64bit_header(&tzf, tmp); +- skip_64bit_transistions(&tzf, tmp); +- skip_64bit_types(&tzf, tmp); +- skip_posix_string(&tzf, tmp); +- } +- read_location(&tzf, tmp); ++ ++#ifdef HAVE_SYSTEM_TZDATA ++ if (memmap) { ++ const struct location_info *li; ++ ++ /* TZif-style - grok the location info from the system database, ++ * if possible. */ ++ ++ if ((li = find_zone_info(system_location_table, timezone)) != NULL) { ++ tmp->location.comments = timelib_strdup(li->comment); ++ strncpy(tmp->location.country_code, li->code, 2); ++ tmp->location.longitude = li->longitude; ++ tmp->location.latitude = li->latitude; ++ tmp->bc = 1; ++ } ++ else { ++ strcpy(tmp->location.country_code, "??"); ++ tmp->bc = 0; ++ tmp->location.comments = timelib_strdup(""); ++ } ++ ++ /* Now done with the mmap segment - discard it. */ ++ munmap(memmap, maplen); ++ } else ++#endif ++ { ++ /* PHP-style - use the embedded info. */ ++ if (version == 2) { ++ skip_64bit_preamble(&tzf, tmp); ++ read_64bit_header(&tzf, tmp); ++ skip_64bit_transistions(&tzf, tmp); ++ skip_64bit_types(&tzf, tmp); ++ skip_posix_string(&tzf, tmp); ++ } ++ read_location(&tzf, tmp); ++ } + } else { + tmp = NULL; + } +diff --git a/ext/date/lib/timelib.m4 b/ext/date/lib/timelib.m4 +index 99bf9fa..4bf7e46 100644 +--- a/ext/date/lib/timelib.m4 ++++ b/ext/date/lib/timelib.m4 +@@ -78,3 +78,16 @@ stdlib.h + + dnl Check for strtoll, atoll + AC_CHECK_FUNCS(strtoll atoll strftime gettimeofday) ++ ++PHP_ARG_WITH(system-tzdata, for use of system timezone data, ++[ --with-system-tzdata[=DIR] to specify use of system timezone data], ++no, no) ++ ++if test "$PHP_SYSTEM_TZDATA" != "no"; then ++ AC_DEFINE(HAVE_SYSTEM_TZDATA, 1, [Define if system timezone data is used]) ++ ++ if test "$PHP_SYSTEM_TZDATA" != "yes"; then ++ AC_DEFINE_UNQUOTED(HAVE_SYSTEM_TZDATA_PREFIX, "$PHP_SYSTEM_TZDATA", ++ [Define for location of system timezone data]) ++ fi ++fi |