Skip to content

Conversation

@Freax13
Copy link
Member

@Freax13 Freax13 commented Nov 29, 2025

This PR fixes a buffer overflow (see commit message for details) and adjusts the optimization level to generate smaller binaries.

The buffer overflow became noticeable on newer nightlies, but it's always been around. With the old mangling scheme, the linker placed the symbols in a different order where the buffer overflow happened to not cause any harm. The order generated by the linker with the new scheme made the buffer overflow noticeable.

Cc @adoerr

DiskAccess::read_exact_into did not work correctly if current_offset
wasn't aligned to 512 bytes.

For example, if self.current_offset is 3 and len is 1024:
- end_addr will be 3+1024=1027
- start_lba will be 3/512=0
- end_lba (1027-1)=2
read_exact_into would then read 3 (!) sectors with lbas 0, 1, and 2
even though the buffer can only hold 2 sectors (1024 bytes).

To fix this, only allow seeking to the start of a sector.
DiskAccess::read_exact_into works correctly if the offset is a multiple
of the sector size.

There were few uses of DiskAccess::seek that didn't seek to the start
of a sector. All those uses then use DiskAccess::read_exact to read
data at the offset. Unlike DiskAccess::read_exact_into,
DiskAccess::read_exact can already handle non-aligned offsets. To fix
the bad seek calls, we turn read_exact into a combined seek+offset
function that works for non-aligned offsets.
This generates smaller binaries.
Now that we fixed the buffer overflow and found another way of
generating smaller binaries, we no longer need to use the old symbol
mangling scheme.
The new symbol mangling was never really at fault. All it did was
shuffle some of the symbols around resulting in a larger binary. We
just got unlucky there.
@Freax13 Freax13 requested a review from phil-opp November 29, 2025 12:06
@Freax13 Freax13 linked an issue Nov 29, 2025 that may be closed by this pull request
Copy link
Member

@phil-opp phil-opp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh wow, thanks a lot for getting to the bottom of this!

@phil-opp phil-opp merged commit 707db11 into main Dec 1, 2025
16 of 18 checks passed
@phil-opp phil-opp deleted the fix/buffer-overflow branch December 1, 2025 11:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Build failure with nightly-2025-11-23

3 participants