php85
STATUS (2026-10-24): abandoned, does not exist in arch/adapted/. Never
committed to git (confirmed via git log --all -- adapted/php85 returning
nothing, and adapted/README not listing it) – superseded same day
(2026-10-21) by [[php]], which forks official Arch php 8.5.12 (fix already
included upstream, no patch needed) and adds armv7h. Everything below is
kept for the historical record of why that pivot happened, but don’t expect
the directory/PKGBUILD to actually be there.
Build times (auto-updated)
- armv7h: 6h58m (2026-10-22 02:40 UTC, remote, MAKEFLAGS=-j1)
- aarch64: 2h31m (2026-10-22 02:40 UTC, remote, MAKEFLAGS=-j1)
Category: adapted (new package, created 2026-10-21 – vendored from AUR’s
php85 by maintainer el_aur, part of the same arch-phpbs-generated
family as [[php74]]). arch=() is armv6h/armv7h/aarch64 only – the
whole point of adding this package is ARM coverage; x86_64/i686/pentium4
builds were deliberately left out per the user’s explicit “rebuild for ARM
only” instruction. If an x86_64 need shows up later, re-derive from the
current upstream AUR php85 PKGBUILD rather than just re-adding x86_64 to
this one’s arch=() (upstream will have moved on by then).
Same dead-arch=()-stanza + $CARCH bug as php74 (2026-10-21)
Upstream’s arch-phpbs-generated PKGBUILD carries two arch=() assignments:
an unused empty placeholder (arch=(
)) early in the file, and the real one
much later as the dynamic/self-resolving arch=("$CARCH") trick (meant for a
build wrapper that re-invokes makepkg per target, not for direct
repo_build.sh consumption). Both needed fixing, same as php74’s
2026-08-19 fix:
- Deleted the dead empty
arch=()placeholder entirely. - Replaced
arch=("$CARCH")with a real literal array:arch=('armv6h' 'armv7h' 'aarch64').
This dead-placeholder stanza is NOT cosmetic – it actively breaks the
build. repo_build.sh’s awk-based arch parser (added 2026-09-21 to handle
multi-line arch=(), see its own comment) matches the first
/^arch=\(/ it finds and exits once that block closes with ) – so with
two stanzas in one file, it locks onto the first (empty) one and silently
falls into the “any”/x86_64-only path, never reaching the real array.
Confirmed hitting this live with php74’s rebuild today: repo_release.sh
logged === any (via x86_64) === and only ever built x86_64, silently
skipping i686 even after the arch=() fix had supposedly been in place since
2026-08-19 (it was in the second stanza; the newer awk parser never got
that far) – had to catch it from the log, fix by deleting the dead
placeholder in both php74 and php85, then re-run i686 specifically via
REPO_BUILD_ONLY_ARCH=i686. Any arch-phpbs-family PKGBUILD (php56
through php85) vendored in the future will have this same dead stanza –
delete it on sight, don’t just fix the real array and assume that’s enough.
See memory/TOOLING_NOTES.md for the general note on this parser gotcha.
CVE-2026-109618 / CVE-2026-109619 backport (2026-10-21)
Same vulnerability as [[php74]]’s entry describes (critical RCE, “php2shell”, bailout-during-OOM state corruption). Unlike the EOL 7.4/8.0/8.1 branches, PHP’s actively-maintained branches (8.2-8.5) got the fix as a normal point release (8.5.12 here) rather than a standalone EOL-style mitigation patch – there is no small, purpose-built backport patch for an older point release the way there was for 7.4.
Found the real fix commit on the PHP-8.5 branch: 31c0ea7d7ff1, “Avoid
state corruption via bailout” (same core authors: arnaud-lb, iluuu1994,
plus bukka/ndossche/Nicolas Grekas). It’s 423 files, because the
underlying flaw is systemic – any mid-request bailout can corrupt
worker-global state, not just the one multipart-upload exploit path that
went public – so the real fix converts allocation call sites across ~40
extensions from “bail out on OOM” to “fail gracefully” (fallible alloc
variants). This does NOT cherry-pick cleanly onto our pinned 8.5.9: there
were unrelated intermediate refactors to some of the same functions between
8.5.9 and the patch’s base (confirmed e.g. ext/soap/php_http.c’s
get_http_body() already uses different alloc calls/bounds-check style in
8.5.9 than the patch’s “before” context expects – a real structural
conflict, not just line-offset drift).
Dry-run tested the full commit against a pristine php-8.5.9 extraction
(patch -p1 --dry-run) and found genuine (non-offset) hunk failures in:
ext/date/lib/parse_date.c(re2c-generated; its.resource also excluded to keep them in sync)ext/soap/php_http.c(2 hunks –get_http_body()OOM-handling refactor)ext/filter/filter.cext/spl/spl_fixedarray.cext/standard/string.cext/zend_test/test_arginfo.h(moot anyway –zend_testis a dev/test-only extension, never built by this PKGBUILD)
User’s explicit choice, given the above: backport the core fix only,
skip the conflicting extension hardening rather than hand-resolve it.
Built the actual patch file (php85-cve-2026-109618-109619.patch) with
filterdiff -x '<pattern>' ... dropping all */tests/*/*.phpt files,
ext/zend_test/*, run-tests.php, sapi/fuzzer/*, and the six files above
– 104 files remain (down from 423), verified with a second
patch -p1 --dry-run that it now applies 100% cleanly to php-8.5.9,
zero fuzz, zero failures. The core exploit path survives intact:
Zend/zend_alloc.c/.h, Zend/zend_execute_API.c, Zend/zend_globals.h,
main/SAPI.c, main/php_variables.c, main/rfc1867.c (the actual public
PoC vector) are all in the trimmed patch.
Known gap, by design: SOAP’s get_http_body(), the date parser, and the
three ext/filter/ext/spl/ext/standard call sites are left exactly as
exploitable to the systemic bailout-corruption class as they were before
this patch (no worse, just not hardened to 8.5.12 parity). If a future
public PoC specifically targets one of those paths, this package needs a
real second look – the gap is known and intentional, not an oversight.
pkgrel"2"->"2.1"(packaging-only local deviation, no pkgver bump – matches the [[php74]] convention: upstream AUR will presumably catch up to 8.5.12 on its own pkgver eventually).- Added to
arch/adapted/README.