Skip to content

avm2: Handle null elementFormat correctly when creating text line - #24307

Merged
Lord-McSweeney merged 3 commits into
ruffle-rs:masterfrom
Lord-McSweeney:avm2-null-elementformat
Jul 26, 2026
Merged

avm2: Handle null elementFormat correctly when creating text line#24307
Lord-McSweeney merged 3 commits into
ruffle-rs:masterfrom
Lord-McSweeney:avm2-null-elementformat

Conversation

@Lord-McSweeney

Copy link
Copy Markdown
Member

Description

Previously, when calling createTextLine when textBlock.content.elementFormat was null, our behavior didn't match Flash's.

As a bonus, due to more validation, some code has been simplified.

This PR conflicts with #24306.

Testing

I've added coverage to the existing avm2/textblock_createline_errors test.

Checklist

  • I, a human, have self-reviewed this PR and fully understand the changes within.
  • I have made or updated tests where possible.
  • All of my commits are properly scoped, compile successfully, and pass all tests.
  • This PR does not make sense to split up into smaller PRs.
  • An LLM was involved in the authoring of this code.

@Lord-McSweeney Lord-McSweeney added A-avm2 Area: AVM2 (ActionScript 3) fte/tlf Issues relating to the FTE (Flash Text Engine) AVM2 API or the TLF (Text Layout Framework) library T-compat Type: Compatibility with Flash Player labels Jul 26, 2026
Comment thread core/src/avm2/globals/flash/text/engine/text_block.rs Outdated
@Lord-McSweeney
Lord-McSweeney force-pushed the avm2-null-elementformat branch from 2e02644 to e3ba3b0 Compare July 26, 2026 13:05
@Lord-McSweeney
Lord-McSweeney force-pushed the avm2-null-elementformat branch from e3ba3b0 to abea543 Compare July 26, 2026 17:46
@Lord-McSweeney
Lord-McSweeney enabled auto-merge (rebase) July 26, 2026 17:55
@Lord-McSweeney
Lord-McSweeney merged commit 37ab26a into ruffle-rs:master Jul 26, 2026
27 of 28 checks passed
Hancock33 added a commit to Hancock33/batocera.piboy that referenced this pull request Jul 28, 2026
---------------------------------------------------------
libxmp.mk libxmp-4.7.2 # Version: Commits on Jul 26, 2026
---------------------------------------------------------
Checksums (SHA256):
```
510a96eefd79e4558fb1fa41fb5494870328776b3f77563f94f61f241f64bde1  libxmp-4.7.2.tar.gz
bace7f53248a2cd5adcf77f9402a8858fc0fec05f4e6d6436e3d2a28d68f640e  libxmp-lite-4.7.2.tar.gz
```
Changes in version 4.7.2 (July 26, 2026):
- Fix loading Startrekker modules from memory/handle/callbacks.
- Fix cmake build failure for certain Apple targets (e.g. tvOS.)
- Fix stb-vorbis floor1 inverse_db_table indexing (missing part
  of CVE-2019-13220 fix.)

--------------------------------------------------------
rocknix-abl.mk v1.1.6 # Version: Commits on Jul 04, 2026
--------------------------------------------------------
Initial commit,

--------------------------------------------------------------------------------------------------------
batocera-emulationstation.mk f5d6be675dc5220606964cd839862064feb81326 # Version: Commits on Jul 27, 2026
--------------------------------------------------------------------------------------------------------
Merge pull request #2181 from dmanlfc/splash-update
slightly lower the update text for batocera's new logo,

------------------------------------------------------------------------------------------------
batocera-es-piboy.mk f5d6be675dc5220606964cd839862064feb81326 # Version: Commits on Jul 27, 2026
------------------------------------------------------------------------------------------------
Merge pull request #2181 from dmanlfc/splash-update
slightly lower the update text for batocera's new logo,

-------------------------------------------------------------------------------------
azahar.mk ff1d9d2985cc6a6402762011a115571fd95aef50 # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------
qt: Fix \New 3DS setup\ and \Old 3DS setup\ strings being erroneously swapped,

------------------------------------------------------------------------------------------
dolphin-emu.mk d742aa8b4c4d052f7dceaa39022b1fe3996f1781 # Version: Commits on Jul 26, 2026
------------------------------------------------------------------------------------------
Merge pull request #14756 from JoshuaVandaele/gcc16-warns-fix
Resolve various warnings,

------------------------------------------------------------------------------------------
duckstation.mk 12f012caa8b94c4c5f6e016fe8c55b0836b74c71 # Version: Commits on Jul 27, 2026
------------------------------------------------------------------------------------------
Spanish (Spain) translation update 2026/07/27 (#3777)
- Cherry-picking previous changes and changing inconsistent ones with previous ones across the board.
 - Restoring consistency when speaking towards the user (informal tuteo).
 - Restoring NBSPs.
 - Translating new strings.
 - Retranslated all presumed PEMT translations.
 - Restored previous translations in Setup Wizard (QTLinguist was not detecting correctly changes in longer strings).,

-------------------------------------------------------------------------------------
hatari.mk a0c2a5ed8441d404174151791a1568a2b7878928 # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------
Fix change #eaa2d24aae from 2027/07/04 to skip MFM bits when motor remains ON
Use FDC_Skip_FdcCycles_MFM() instead of mfm_stream_skip() to correctly handle
indexes while skipping bits
Fix the protection in the game \Prophecy I - The Viking Child\ in KryoFlux Stream raw dump format,

--------------------------------------------------------------------------------------
openmsx.mk e954c5ce9bf393077ef6883ed222404a78ca3430 # Version: Commits on Jul 26, 2026
--------------------------------------------------------------------------------------
Update to SDL 2.32.10.,

-------------------------------------------------------------------------------------
ppsspp.mk 19be55253c0c7c283d766c0f968a5f9c1b2de58c # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------
Merge pull request #21986 from a-blondel/feature/fifa06-infra
Add FIFA06 to infra-dns.json,

------------------------------------------------------------------------------------
rpcs3.mk 7a3deb649f9a0ea8a619f2f810da739b8d626689 # Version: Commits on Jul 27, 2026
------------------------------------------------------------------------------------
Fix package install failure warning message,

-----------------------------------------------------------------------------------------
supermodel.mk 24d2ffcfc7f14229337f05f4920fe26b56633d9d # Version: Commits on Jul 26, 2026
-----------------------------------------------------------------------------------------
Fix initializer order (#325),

-------------------------------------------------
vice.mk r46191 # Version: Commits on Jul 27, 2026
-------------------------------------------------
null

-------------------------------------------------------------------------------------
vita3k.mk be6927105e65c0d6d17b707aac2e7f72214997e4 # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------
external: Update dependencies (#4063)
* external: Update CLI11 to version 2.6.2
* external: Update MoltenVK to version 1.4.1
* external: Update VulkanMemoryAllocator-Hpp
* external: Update capstone to version 5.0.9
* external: Update concurrentqueue to version 1.0.5
* external: Update cubeb
* external: Update curl to version 8.21.0
* external: Update ddspp to version 1.13
* external: Update dirent to version 1.26
* external: Update googletest to version 1.17.0
* external: Update miniz to version 3.1.2
* external: Update nativefiledialog-extended to version 1.3.0
* external: Update openssl to version 4.0.1
* external: Update pugixml to version 1.16
* external: Update sdl to version 3.2.30
* external: Update spdlog to version 1.17.0
* external: Update stb
* external: Update vita-toolchain
* external: Update yaml-cpp to version 0.9.0
* cmake: Add expected hash for file downloads,

-----------------------------------------------------------------------------------------
xenia-edge.mk 9c729844c02c5d8c90feb901c644eab289a19885 # Version: Commits on Jul 27, 2026
-----------------------------------------------------------------------------------------
[CPU] Emit a real acquire barrier for isync and drop lwarx/stwcx fences,

-------------------------------------------------------------------------------------
ikemen.mk d65ed762d12323409a25fa95f92839574b6143fa # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------
Merge pull request #3816 from potsmugen/push2
fix: angled shadows, p2defmul,

-------------------------------------------------------------------------------------------
moonlight-qt.mk 546cb72e32e5ac04bbc7e0b3a254176e5696685a # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------------
Update Windows, macOS, and AppImage dependencies
- SDL -> c9ad2963
- dav1d -> 1.5.4
- Detours rebuilt with EHCont,

---------------------------------------------------------------
ruffle.mk nightly-2026-07-27 # Version: Commits on Jul 27, 2026
---------------------------------------------------------------
## What's Changed
* avm2: Correctly implement `DisplayObject.getRect` by @Lord-McSweeney in ruffle-rs/ruffle#24253
* avm2: Clean up some FTE logic, add validation by @Lord-McSweeney in ruffle-rs/ruffle#24304
* avm2: Stub flash.system.System.exit by @evilpie in ruffle-rs/ruffle#24300
* avm2: Handle shrinking underlying content in TextBlock.createTextLine  by @evilpie in ruffle-rs/ruffle#24303
* avm2: Handle null `elementFormat` correctly when creating text line by @Lord-McSweeney in ruffle-rs/ruffle#24307
* tests: Expand the `avm2/avm1_root` test by @ChrisCPI in ruffle-rs/ruffle#24164
**Full Changelog**: ruffle-rs/ruffle@nightly-2026-07-26...nightly-2026-07-27,

-----------------------------------------------------
nghttp3.mk v1.18.0 # Version: Commits on Jul 26, 2026
-----------------------------------------------------
Merge pull request #542 from ngtcp2/gcc-16
Fix build error with gcc-16,

----------------------------------------------------
ngtcp2.mk v1.25.0 # Version: Commits on Jul 26, 2026
----------------------------------------------------
Bump package and library versions,

------------------------------------------------------------------------------------------
devilutionx.mk b3e52b1ea25aa2e41be8fe97b9c516794897812f # Version: Commits on Jul 26, 2026
------------------------------------------------------------------------------------------
correct and complete Italian translations,

------------------------------------------------------------------------------------------
fallout2-ce.mk 552505e3f59037df037d5b2a2a0f9588ac804dc8 # Version: Commits on Jul 27, 2026
------------------------------------------------------------------------------------------
fixes party_member.cc memory leaks (#601)
updates functions:
--- File: src/party_member.cc ---
661 | static int _partyMemberRecoverLoadInstance(PartyMemberListItem* a1)
--- File: src/party_member.cc ---
710 | int partyMembersLoad(File* stream),

----------------------------------------------------------------------------------------------------
sdl2-gamecontrollerdb.mk 58b39858157965a8fda9dd641ccad9dc8b25527a # Version: Commits on Jul 26, 2026
----------------------------------------------------------------------------------------------------
Add 8BitDo Ultimate 2C 0x310a Windows mapping (#971),

----------------------------------------------------------------------------------------
retroarch.mk 62c0e73e4f9d4e6ab8e8a1d0e1f4a36f7d101171 # Version: Commits on Jul 27, 2026
----------------------------------------------------------------------------------------
audio: fix the menu background music hanging the frontend at its loop point
Background music freezes RetroArch the moment the track loops, on every
platform and both mixing paths.  Reported as libretro/RetroArch#19262
(Linux aarch64, PulseAudio) and reproduced on Windows, where a break-in
shows the main thread parked in the mixer with no frame coming out:
  #0  audio_mixer_mix_stream ()
  #1  audio_mixer_mix ()
  #2  audio_driver_flush.constprop ()
  #3  audio_driver_menu_sample ()
  #4  runloop_check_state ()
Two independent faults have to line up for that, and both are here.
The decoder half is the regression.  The bisect in the report lands
between e312e70 and 22d9755, and the commit responsible is de45ef581a:
it gave the plain resident-buffer Vorbis arm an emission bound taken
from the summed granule positions, so that a chained file reports the
length it plays and the last packet's overhang is trimmed.  For a
single-link .ogg the bound is what would come out anyway, which is why
nothing changed while a track played forward.
Nothing changed until it looped.  audio_transfer_vorbis_cap() measures
what is left as limit - emitted, and the frame == 0 arm of
audio_transfer_seek() rewound rvorbis but left 'emitted' where the
playthrough left it.  So the seek reported success, the next read found
no room under the bound and produced nothing, and the stream read as
permanently ended one sample after its own end.  The packet-fed arm
right above already zeroed the counter, which is why a Matroska or
multiplexed source never showed this.
Set the cursor with the stream in both directions: zero on the
loop-to-start, and the target frame on a seek that lands elsewhere.
The latter was wrong for the same reason and would have shortened every
subsequent read after any forward seek.
The packet arm gets the same treatment for a different hole in it: it
reset the blob cursor and rewound an rwebm demuxer, but left the Ogg
page feeder (pg_off, seg_idx, body_off) parked at end of file, so a
multiplexed .ogg rewound to a page cursor that could not produce
anything either.  audio_transfer_vorbis_to_head() already knows how to
put every source this arm can have back at the first audio packet -
including re-consuming the three headers the page walk must skip - so
call it rather than open-coding a subset.
The mixer half is structural, and older.  Both streaming mixers reacted
to an empty read on a repeating voice by seeking to zero and jumping
back to the read, with the seek's return value discarded and no bound
on how many times that could happen.  If the rewound stream produced
nothing - because the seek failed, or because it succeeded and the
decoder still had nothing to give - the loop had no way out.  It is not
a deadlock and not a crash: the thread spins at full speed inside the
mixer with no frame ever produced, so the frontend simply stops, which
is what the report looked like from the outside and why the only
visible symptom was a frozen menu.
One rewind is now allowed per empty read.  Getting frames out clears
the flag, because a sound shorter than one mixing buffer legitimately
wraps several times within a single call and must not be cut off by the
guard - a 20 ms sample still carries audio 400 calls in.  The seek's
result is checked, and AUDIO_MIXER_SOUND_REPEATED fires only when the
repeat actually happened rather than ahead of an attempt that may not.
A voice that cannot repeat takes the same FINISHED and release path as
one that reached its natural end.  Whatever a future arm does, an empty
repeat should end the voice, not wedge the process.
Neither half had a test, so samples/audio/audio_mixer_loop is the third
piece.  It drives the real thing rather than a model of it:
audio_transfer for the seek contract the mixer depends on (a stream
that has been played out and seeked back to zero plays out again, to
the byte, on WAV as well as Vorbis), then the mixer's own repeat path
on a coded stream for the end-to-end shape of the report.
The two halves are deliberately distinguishable at the point of
failure.  Against the broken decoder with the guard in place, the run
ends and reports a voice that went silent; against both broken, it
never reaches that assertion and a watchdog reports a spin, naming the
case.  That difference is the guard's whole value, so the test is built
to show it rather than to collapse both into \failed\.  Measured across
all four combinations of the two files, old and new:
  mixer  transfer  result
  old    old       watchdog fired - spinning in case 3
  old    new       OK
  new    old       FAIL: 3 cases (seek contract, float, int16)
  new    new       OK
Self-contained and argument-free, so it goes in the samples workflow's
run allowlist rather than being built and skipped.  The WAV fixtures
are built in memory; the Vorbis one is embedded, because the bound the
loop trips over comes from an Ogg container's summed granule positions
and no PCM assembled at runtime produces one.  It is as small as a
valid Vorbis stream gets - mono, 8 kHz, lowest quality, 50 ms - since
only its existence matters, and the three setup headers are most of its
2771 bytes.
Case 4 records a line rather than crossing it: a stream with no audio
in it is the shape the mixer's guard exists for, and today it is
refused before a voice is made, so the guard has no reachable trigger
through the public loaders.  That is worth stating in the test rather
than leaving as a silent gap - if some future arm lets such a stream
through, this is where it surfaces, bounded by the watchdog instead of
hanging a CI runner.
The sample's binary is added to .gitignore next to the one entry
libretro-common/samples already had.  Nothing else under samples/ is
tracked as a build product, so the convention is to name them as they
appear rather than to glob, and this one is easy to stage by accident
because it sits beside the sources.
Both sources pass -std=c89 -pedantic.  The sample is clean under -Wall
-Wextra -pedantic on gcc and clang and under ASan+UBSan, which is how
the samples workflow builds everything.  The decoder fix was also
checked against e312e70 to confirm that commit loops correctly, so this
restores the prior behaviour rather than papering over it.,

----------------------------------------------------------------------------------------
doomretro.mk cb2fa469d88c65c9c97da474c626a1ed8fef29d3 # Version: Commits on Jul 27, 2026
----------------------------------------------------------------------------------------
Fix changing `r_screensize` CVAR in console,

--------------------------------------------------------------------------------------
vkquake.mk 170d4d00a1fd555972f6e4cee8c2381d88b78f66 # Version: Commits on Jul 26, 2026
--------------------------------------------------------------------------------------
Multiplayer : make server list slightly larger,

--------------------------------------------------------------------------------------
yquake2.mk fa906385ac326bcd8e532c9339b6933316e908b9 # Version: Commits on Jul 26, 2026
--------------------------------------------------------------------------------------
gl3: cleanup bloom code,

---------------------------------------------------------------------------------------
openlara.mk 3b268ca4bf986c380f44a26ffd9218bf6d376249 # Version: Commits on Jul 26, 2026
---------------------------------------------------------------------------------------
Allow game data in symlink dirs for nix platform (#535),

------------------------------------------------------------------------------------------
xash3d-fwgs.mk 8b15bc9a967047dd6a6f6578e5e39891ad5d2149 # Version: Commits on Jul 26, 2026
------------------------------------------------------------------------------------------
3rdparty: mainui: update,

----------------------------------------------------------------------------------------------
libretro-azahar.mk ff1d9d2985cc6a6402762011a115571fd95aef50 # Version: Commits on Jul 26, 2026
----------------------------------------------------------------------------------------------
qt: Fix \New 3DS setup\ and \Old 3DS setup\ strings being erroneously swapped,

--------------------------------------------------------------------------------------------------
libretro-beetle-psx.mk 33f7e850f6cf5683275ec435518d2d15abdc7d5f # Version: Commits on Jul 27, 2026
--------------------------------------------------------------------------------------------------
Texture Replacement: add clutrows, pageignore and pagemindump to dump.cfg (#980)
Three optional directives for the per-game <content>-texture-dump/dump.cfg,
extending the existing `ignore` directive to the page-aligned dump/replacement
path. Each is read straight from dump.cfg with no core option (inert unless
declared) and lives entirely in the shared rhi/rhi_tt.c tracker, so it applies
to both the Vulkan and GL renderers.
- clutrows a,b        exclude VRAM rows a..b (inclusive) from the page hash, at
                      both dump and match. Some games keep a live CLUT inside a
                      texture page and animate it; page-aligned hashing then
                      mints a new page hash every tick for unchanged art, so
                      dumps balloon into near-duplicates and page replacements
                      stop matching. Zeroing the declared rows before the CRC
                      keeps the hash stable.
- pageignore x,y,w,h  skip page-dumping any page that overlaps this VRAM rect,
                      for regions the game composites at runtime (sprite frames,
                      menu text, icon slots) where page dumps are unbounded
                      near-duplicates by design.
- pagemindump w,h     only dump a page when it overlaps a dumpable upload at
                      least this large (VRAM halfwords); suppresses page dumps
                      triggered by tiny composite writes (glyphs, icons, map
                      pixels).
Only clutrows changes the hash; pageignore/pagemindump affect only what is
dumped. rhi_tt.c only.
Co-authored-by: Tarrantx <24298510+Tarrantx@users.noreply.github.com>,

-----------------------------------------------------------------------------------------------------
libretro-beetle-saturn.mk 262c4ff521e96e3807a94fde041f332324be5cff # Version: Commits on Jul 26, 2026
-----------------------------------------------------------------------------------------------------
input: carry mouse sensitivity fraction across frames
Continuation of the output-pipeline quantization audit: the mouse
sensitivity scale rounded each frame's delta independently
(round-half-away-from-zero in Q16), which quantizes the *rate* rather
than the position.  For slow movements the setting stopped working
entirely: a 1-count/frame drag at 50% sensitivity still moved 1
count/frame (0.5 rounds to 1 every frame), and at 150% it moved 2
count/frame -- an effective 200%.  Fast movements were fine because
the per-frame rounding error is bounded at half a count.
Keep a per-player, per-axis Q16 remainder: fold it into the scaled
delta, emit the floor, carry the fraction.  The residual stays in
[0, 0xFFFF], so alternating output (-1, 0, -1, 0 for -0.5/frame)
realizes the exact long-run rate at every speed.  Verified with a
harness sweeping sensitivities 50..200% against input rates 1..7
counts/frame over 100k frames: emitted totals match the Q16-quantized
sensitivity times the input rate to within one count everywhere.
Both SS_MOUSE cases get the fix (the bitmask and per-key polling
paths); the residual array is shared per player since input_type[]
selects exactly one case per player per frame, and resets in
input_init alongside the other per-player conditioning state.  Like
the existing gun-debounce state this is frontend-side conditioning
and deliberately not serialized: a runahead secondary instance can
diverge by at most one count for one frame, the same exposure the
debounce already has.,

-----------------------------------------------------------------------------------------------
libretro-bluemsx.mk f1715c8bf6443c4de7cad254ea14037704f8058e # Version: Commits on Jul 27, 2026
-----------------------------------------------------------------------------------------------
Include zlib even for statically linked platforms,

------------------------------------------------------------------------------------------------
libretro-chailove.mk 2e1bad330e9bf4c74c8600ef69648b5c2420d455 # Version: Commits on Jul 26, 2026
------------------------------------------------------------------------------------------------
Merge pull request #447 from WizzardSK/ci-linux-aarch64
ci: add a Linux aarch64 build,

--------------------------------------------------------------------------------------------
libretro-dice.mk 7e7a22d27e84d73faf28424d746b7defc6a6875c # Version: Commits on Jul 26, 2026
--------------------------------------------------------------------------------------------
Merge pull request #49 from WizzardSK/ci-linux-aarch64,

-------------------------------------------------------------------------------------------------
libretro-dinothawr.mk dde9179cf743838927d67ce3a11ea5904a189d47 # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------------------
libretro-common: pull in the inflate refill threshold
Resync encoding_deflate.c for RetroArch 64e23d3: the inflate fast loop
topped its bit buffer up to 56 bits at the head of every iteration, so
every symbol paid a whole refill even when the buffer already held
enough for a full length/distance group.  It refills below 48 bits now,
which is the worst case for one group (15 + 5 + 15 + 13).
The win is on literal-dominated streams, which this core does not have:
PNG scanline data compresses to 7.4% and is match-heavy, so decode here
moves 0.2758 -> 0.2747 s over 70 assets x20, inside the noise.  Taken
for the same reason as the last two deflate resyncs - staying identical
to upstream libretro-common is worth more than the delta either way -
and it does no harm: upstream measured it neutral on match-heavy input
by construction, and all 70 PNGs still decode byte-exact against the
zlib-backed decoder.
3000 frames render to f654b0d8; gcc, clang, win64, win32 and
STATIC_LINKING=1 build warning-free.,

-----------------------------------------------------------------------------------------------
libretro-dolphin.mk f76197ad8aeb87f9bb7a19d4d17edfced92aa251 # Version: Commits on Jul 26, 2026
-----------------------------------------------------------------------------------------------
Merge pull request #461 from cscd98/android-armv7a-fix
libretro: specify core_args for armv7a correctly,

------------------------------------------------------------------------------------------------------
libretro-doublecherrygb.mk 79e25aaf7d362e7b340b86045f452c193e1191ae # Version: Commits on Jul 27, 2026
------------------------------------------------------------------------------------------------------
� Updated Readme,

---------------------------------------------------------------------------------------------
libretro-fbneo.mk aca45aa5e9b767d01af54eeba646702015e8b6a6 # Version: Commits on Jul 27, 2026
---------------------------------------------------------------------------------------------
libretro: stop borrowing zlib and the 7-Zip SDK from the frontend
Statically linked cores were built assuming RetroArch would supply
zlib and the 7-Zip SDK: EXTERNAL_ZLIB skipped dep/libs/zlib, and the
lib7z sources were gated behind \ifneq ($(STATIC_LINKING), 1)\.
RetroArch dropped both on 2026-07-24 (2f57044c \Remove deps/7zip\,
dfd4a953 \Remove HAVE_BUILTINZLIB and the vendored deps/libz\,
0daf50e0 \Remove the vendored zlib headers\), replacing the 7-Zip SDK
with its own r7z_* reader. The symbols we relied on are gone, so the
link into retroarch_3ds.elf / the Vita equivalent now fails with
undefined references to SzArEx_Open, SzArEx_Free, SzArEx_Extract,
SzArEx_Init, SzArEx_GetFileNameUtf16, LookToRead2_CreateVTable,
CrcGenerateTable, inflate, inflateInit2_, inflateEnd, crc32 and
get_crc_table.
Not a code regression on our side: the same tree passed and then
failed on consecutive pipelines for the same sha, on the day of those
upstream commits.
Compile our own copies instead. Archive members are only pulled in to
resolve symbols that are still undefined, so a frontend that does
provide zlib keeps winning and no duplicate definition can occur.
EXTERNAL_ZLIB is a makefile-only switch with no source references, and
-I dep/libs/zlib is unconditional, so the headers in use do not change.
emscripten keeps EXTERNAL_ZLIB=1, as emsdk supplies a real zlib port.
Fixes ctr-neogeo, ctr-cps12 and vita. ps3/psl1ght, xenon, switch and
ngc/wii/wiiu are broken the same way and are covered here too, though
they are not built by CI.,

--------------------------------------------------------------------------------------------------
libretro-gearcoleco.mk 4bc802e086e56d72861e238da06aca6e05792c33 # Version: Commits on Jul 27, 2026
--------------------------------------------------------------------------------------------------
Correct ignored prefix timing before extended opcodes,

-------------------------------------------------------------------------------------------------
libretro-geargrafx.mk ec2285ad8f07d28f12c868f82f162bf5038038d1 # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------------------
Fix unused HTTP client parameter,

--------------------------------------------------------------------------------------------------
libretro-gearsystem.mk e510b4f7d90904496d28334866c015fdfb1fa187 # Version: Commits on Jul 27, 2026
--------------------------------------------------------------------------------------------------
Correct ignored prefix timing before extended opcodes,

-----------------------------------------------------------------------------------------------
libretro-jollycv.mk eb14292005d51e2bef954cb75145981037ee9988 # Version: Commits on Jul 27, 2026
-----------------------------------------------------------------------------------------------
Merge pull request #4 from WizzardSK/ci-linux-aarch64
ci: add Linux aarch64 libretro build,

-------------------------------------------------------------------------------------------------
libretro-jumpnbump.mk 2cc840155ce4bf42b2e9e0ef3854b32d534e607e # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------------------
Merge pull request #9 from WizzardSK/ci-linux-aarch64
ci: add a Linux aarch64 build,

---------------------------------------------------------------------------------------------
libretro-opera.mk 0e9562eb2e2628fb4fc5d7180fd7125631da7fd4 # Version: Commits on Jul 27, 2026
---------------------------------------------------------------------------------------------
For now we need to bake zlib in even for statically linked targets,

---------------------------------------------------------------------------------------------
libretro-pd777.mk 8c6d1cb4b0d57f14fb7dc18aa37a8aee79c800a3 # Version: Commits on Jul 26, 2026
---------------------------------------------------------------------------------------------
Merge pull request #30 from WizzardSK/ci-linux-aarch64,

-------------------------------------------------------------------------------------------------
libretro-picodrive.mk 213c433e752b8dbea20608ba1cc0a96605ab38fe # Version: Commits on Jul 27, 2026
-------------------------------------------------------------------------------------------------
libretro-common: emscripten has <sys/mman.h>, drop it from the no-mman list
The emscripten (static) build fails at link time with:
  wasm-ld: error: duplicate symbol: memsync
  wasm-ld: error: duplicate symbol: memprotect
  >>> defined in obj-emscripten/./libretro-common/memmap/memmap.o
  >>> defined in libretro_emscripten.a(memmap.o)
The vendored memmap.h still lists __EMSCRIPTEN__ under 'no mman
available', so memmap.c compiles the mmap/munmap/mprotect shims for
that target.  plat_mmap() in libretro.c references mmap(), which drags
the archive member in, and that member also carries memsync() and
memprotect() - both of which the frontend already defines, since
upstream libretro-common dropped __EMSCRIPTEN__ from the same list.
Emscripten does ship a working <sys/mman.h> (anonymous private maps are
supported), so use it.  memmap.o then compiles down to memsync() and
memprotect() only, neither of which picodrive references, so the
archive member is never pulled and the collision goes away.
Nothing else in the tree calls memsync()/memprotect(), and every mmap()
user goes through plat_mmap()/plat_mremap().,

----------------------------------------------------------------------------------------------
libretro-ppsspp.mk 19be55253c0c7c283d766c0f968a5f9c1b2de58c # Version: Commits on Jul 27, 2026
----------------------------------------------------------------------------------------------
Merge pull request #21986 from a-blondel/feature/fifa06-infra
Add FIFA06 to infra-dns.json,

----------------------------------------------------------------------------------------------
libretro-prboom.mk ac35b61d25317c869ba2f7f39ea4a9de1cc981aa # Version: Commits on Jul 27, 2026
----------------------------------------------------------------------------------------------
Makefile: link against libpthread when threaded rendering is enabled
rthreads.c uses the pthreads backend on every hosted non-Win32 target,
but nothing ever asked for the library.  On glibc older than 2.34 and on
the musl-based handheld toolchains, pthread_create, pthread_join,
pthread_detach, pthread_mutex_trylock and pthread_cancel still live in
libpthread rather than libc, and the shared-object link lines here pass
--no-undefined, so the link dies:
  ./libretro/libretro-common/rthreads/rthreads.o: In function
    `sthread_create_with_priority':
  rthreads.c:(.text+0xac): undefined reference to `pthread_create'
  ...
  collect2: error: ld returned 1 exit status
which took out linux-x64, linux-i686, linux-aarch64, dingux-mips32 and
webos-armv7a.  The subset of symbols reported is the giveaway: the rest
of the pthread API has libc stubs on these toolchains, so only the five
that do not resolved to nothing.
Add -lpthread once, after the platform blocks so an empty LIBS assignment
still wins.  The gate skips it where it would be wrong: HAVE_THREADS=0
targets, STATIC_LINKING targets (they archive a .a and the frontend does
the linking), MSVC, and any block that deliberately zeroes LIBS, which
covers the MinGW targets and linux-portable's -nostdlib link.
Verified by building platform=unix to completion; the link line now ends
in -lm -lpthread and the resulting prboom_libretro.so resolves all 21 of
its undefined pthread symbols.,

-------------------------------------------------------------------------------------------
libretro-ps2.mk 8d14ef94c95b194fbfe0d7d82054a32ab21368fe # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------------
Makefile: Define NOMINMAX/WIN32_LEAN_AND_MEAN empty to match Granite
The Windows platform blocks pass -DNOMINMAX and -DWIN32_LEAN_AND_MEAN,
which define them as 1. The vendored parallel-gs Granite sources
define both unconditionally and empty in 15+ files, so every such TU
warned about the redefinition (empty vs 1) on MinGW.
Define them empty on the command line instead: an identical
redefinition is diagnostic-free, so all Granite sites become benign,
and guarding the vendored files individually (which a future
parallel-gs resync would undo) is unnecessary. glad.h, the only other
definer in the tree (as 1), already wraps its defines in #ifndef so
they never fire when the build line defines the macros, and nothing
anywhere tests the macros' value -- both are #ifdef-style switches
for windows.h.
Verified with descriptor_set.cpp (which defines NOMINMAX empty at
top level, outside any _WIN32 guard, so it reproduces on Linux):
-DNOMINMAX warns, -DNOMINMAX= compiles clean. The
WIN32_LEAN_AND_MEAN sites sit inside _WIN32 blocks and are covered
by the same identical-redefinition rule.,

----------------------------------------------------------------------------------------------------
libretro-superbroswar.mk f43233e75573a9e0067793c5fce957a1ebc6b1ae # Version: Commits on Jul 27, 2026
----------------------------------------------------------------------------------------------------
Bake in zlib even for statically linked,

-------------------------------------------------------------------------------------------------
libretro-vaporspec.mk 6abef0e3a8736340ce23d4c616982863d7f2af44 # Version: Commits on Jul 26, 2026
-------------------------------------------------------------------------------------------------
Merge pull request #19 from WizzardSK/ci-linux-aarch64
ci: add a Linux aarch64 build,

---------------------------------------------------------------------------------------------
libretro-vba-m.mk 41a3382aa7ae54ff5981992d1b5cc304aa4d931b # Version: Commits on Jul 27, 2026
---------------------------------------------------------------------------------------------
translations: transifex pull
Signed-off-by: Rafael Kitover <rkitover@gmail.com>,

-----------------------------------------------------------------------------------------------------
libretro-virtualjaguar.mk cab0671a6741876f92f0873e201f15550e5a0995 # Version: Commits on Jul 27, 2026
-----------------------------------------------------------------------------------------------------
Merge pull request #209 from libretro/release/v2.3.2
Release v2.3.2,

---------------------------------------------------------------------------------------------
libretro-wasm4.mk dc64f62c6fc404ad6d537db68565025b3ad51a20 # Version: Commits on Jul 26, 2026
---------------------------------------------------------------------------------------------
Merge pull request #872 from QuaternionWake/main
Add Journey to the Steam Planet cartridge,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-avm2 Area: AVM2 (ActionScript 3) fte/tlf Issues relating to the FTE (Flash Text Engine) AVM2 API or the TLF (Text Layout Framework) library T-compat Type: Compatibility with Flash Player

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants