qt5-doc
Build times (auto-updated)
- any: 48m34s (2026-09-09 18:04 UTC, MAKEFLAGS=-j8)
Category: arch/maintained/qt5-doc.
2026-09-07: open AUR bug – source download returns a CDN-redirect XML stub outside certain regions
Reported by EndlessEden (2026-08-31, followed up 2026-09-01) and
andreas_baumann initially replied “cannot reproduce” (2026-08-31 –
downloads fine from here). EndlessEden followed up with a concrete
repro: for them (Southern Hemisphere, no local CDN mirror),
qt-everywhere-opensource-src-5.15.19.tar.xz downloads as an XML
document (file reports “XML 1.0 document, ASCII text”) listing CDN
mirror candidates instead of the real tarball – posted the actual XML
content as a gist. Package’s own out-of-date flag has been set since
2026-08-31 (still active as of 2026-09-07, FLAG ... since=2026-09-01
per FEEDBACK.txt).
Suggested fix (EndlessEden, 2026-09-01): in prepare(), download the
source, check whether it’s actually the .xz tarball or the XML
redirect stub, and if XML, parse it for the right regional URL and
re-fetch – i.e. don’t trust Qt’s download-page redirect logic to
always land on a real file.
2026-09-08: fixed (pkgrel 1 -> 2) – manual fetch + XML-fallback in prepare()
Implemented per EndlessEden’s suggestion, user approved. The XML
EndlessEden posted is a MirrorBrain metalink4 document
(<metalink xmlns="urn:ietf:params:xml:ns:metalink">) – confirmed its
<hash type="sha-256"> matches this package’s already-pinned checksum
exactly, i.e. it genuinely describes the right file, just via mirror
metadata instead of a real HTTP redirect.
Moved the qt tarball entirely out of source=()/sha256sums=() (kept
only the two patch files there) – makepkg validates source=()
checksums before prepare() ever runs, so leaving the tarball there
would abort on the XML stub before any fallback logic could execute.
prepare() now: curls the normal download.qt.io URL itself; if the
first 5 bytes are literally <?xml (the stub always starts this way,
real .tar.xz starts with the XZ magic bytes), greps the XML for the
first <url location="..." priority="N">...</url> entry (MirrorBrain
lists mirrors in priority order, nearest first) and refetches from
there; verifies the final file against the pinned sha256 by hand
(sha256sum -c) since makepkg no longer does it automatically; then
bsdtar -xfs it before the existing patch logic. curl needs no new
makedepends entry – pacman itself already depends on it (its own
DLAGENTS downloader).
Regex gotcha caught in testing: an earlier version of the parser
(<url[^>]*>[^<]+</url>, no attribute requirement) matched the
wrong tag – the XML’s <publisher><url>https://download.qt.io</url>
entry, which has no attributes and appears earlier in the document than
the real mirror list. Fixed by requiring both location="..." and
priority="..." attributes in the pattern, which only the real mirror
<url> entries have.
2026-09-09: hardened the mirror-XML fallback (pkgrel 2 -> 3), not yet rebuilt/republished
User asked for a security-style look at prepare() (“suspicious
package… what is happening”). Not malicious – this is the
2026-09-08 fix above – but two real gaps in the mirror-URL handling:
- The URL extracted from the MirrorBrain XML (
grep+sed) was handed straight tocurlwith no scheme validation and no--before it. If that extracted string ever started with-(e.g. the XML content were attacker-influenced),curlwould parse it as a flag instead of a URL – classic argument injection, could redirectcurl’s own-ooutput. Fixed: acase "$_url" in https://*) ;; *) return 1;; esacscheme check before the refetch, pluscurl ... -- "$_url"to stop option parsing regardless. test -n "$_url"after the extraction was a no-op guard – nothing checked its exit status (no|| return 1, noset -e), so an empty match just fell through to acurl -o file ""that failed on its own with a less clear error. The newcaseabove replaces it and actuallyreturn 1s on both an empty and a non-https match.
The pinned $_qt_sha256 check afterward was always the real safety
net regardless (a tampered/wrong file still can’t pass it) – these
are hardening of the path, not a fix to a live vulnerability.
Verified before publishing, without a full multi-hour doc build:
happy-path curl fetch + checksum in isolation (real xz, passed);
XML-fallback path against EndlessEden’s actual posted gist content
(correctly detected the stub, parsed
https://mirror.aarnet.edu.au/pub/qtproject/.../qt-everywhere-opensource-src-5.15.19.tar.xz,
refetched, checksum passed); and confirmed bsdtar -tf on the real
tarball extracts to exactly qt-everywhere-src-5.15.19 (matching
${_pkgfqn/opensource-/}, what the rest of prepare()/build()/
package() already expect). Its first real build attempt (pkgrel 3,
same day) failed anyway – see below – so this was never actually
published.
2026-09-09: reverted the whole curl/XML-fallback approach (pkgrel 2 -> 3, content back to 1fd84a1)
User’s call, after looking at the hardened version above: “this looks
suspiciously like a curl injection” – and even with the https://
scheme check and -- argument-stop added, having prepare() fetch
and shell out based on content parsed from a third-party mirror
listing is exactly the kind of pattern that reads as a
supply-chain/injection risk on sight, independent of whether this
particular instance was actually exploitable. Not worth keeping for a
make docs-only convenience fix. Reverted source=()/sha256sums=()
/prepare() to exactly commit 1fd84a17162e51079b1d88597518db5bfc0045
44 (updated to 5.15.19, the last commit before the workaround),
i.e. back to a plain pinned-URL source=() entry with no custom
fetch logic at all – pkgrel kept moving forward to 3 rather than
reused as 1, since 2 (the curl-workaround version) was already
live. The known tradeoff (per the original 2026-09-07 AUR bug thread)
is back too: someone building in a region with no local CDN mirror
may get the MirrorBrain XML stub instead of the real tarball – the
accepted mitigation is that they download the real tarball themselves
and drop it in makepkg’s SRCDEST/source cache before building, a
normal AUR pattern for problematic sources, not a PKGBUILD-side fix.
Separately, the very first build attempt of the hardened pkgrel-3
version (launched right after the hardening) failed outright on
make docs with a wave of error: 'stddef.h' file not found /
unknown type name 'ptrdiff_t' / INT_MAX undeclared errors under
qtbase/include/QtGui/... and QtWidgets/... – never got far enough
to know if that’s a real regression or just parallel-build (-j8)
header-ordering flakiness in this doc build; moot now given the
revert, but worth a look if the same errors reappear on an unrelated
future rebuild of this package.
2026-09-10: found and removed a duplicate arch/maintained/qt5-examples submodule
While looking at the struct_mutex.h AUR comment above, noticed
OVERVIEW.md also listing a separate maintained/qt5-examples
directory showing 🟠CHANGED against this package’s now-current
5.15.19-3. Turned out to be a duplicate submodule of this exact
repo – same AUR remote (aur.archlinux.org/qt5-doc(.git), same
pkgbase=qt5-doc/pkgname=(qt5-doc qt5-examples)), just checked out
under a second .gitmodules entry and frozen 3 commits behind (at
1fd84a1, missing the CDN-workaround/hardening/revert commits above).
No memory note, no FEEDBACK.txt history, never separately
built/published (couldn’t be – same pkgnames as this directory,
would’ve just collided in the repo). User confirmed it was dead cruft
and approved removal. Removed via git submodule deinit -f + git rm
on maintained/qt5-examples (staged, not committed – left for the
user to commit).