Skip to content

Fix OOB read in opcache POSIX largepage page-size selection#22429

Open
iliaal wants to merge 1 commit into
php:PHP-8.4from
iliaal:opcache-largepage-oob
Open

Fix OOB read in opcache POSIX largepage page-size selection#22429
iliaal wants to merge 1 commit into
php:PHP-8.4from
iliaal:opcache-largepage-oob

Conversation

@iliaal

@iliaal iliaal commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

create_segments() under HAVE_SHM_CREATE_LARGEPAGE stored the int return of getpagesizes() in a size_t and iterated with a size_t counter. On the getpagesizes() error return (-1) the size_t became SIZE_MAX, passing the > 0 guard, and the unsigned counter made i >= 0 always true, so the loop ran from a huge index and read far outside the 3-element shared_segment_sindexes array; even on success, if no returned page size divided requested_size the counter wrapped past 0. Capture the result in a signed int and iterate signed. This path is FreeBSD-only (HAVE_SHM_CREATE_LARGEPAGE), so it is not compiled or exercised on the Linux CI; the change is a type/sign correction within that block.

create_segments() under HAVE_SHM_CREATE_LARGEPAGE stored the int return
of getpagesizes() in a size_t and iterated with a size_t counter. On the
getpagesizes() error return (-1) the size_t became SIZE_MAX, passing the
> 0 guard, and the unsigned loop counter made i >= 0 always true, so the
loop ran from a huge index and read far outside the 3-element
shared_segment_sindexes array; even on success, if no returned page size
divided requested_size the counter wrapped past 0. Capture the result in
a signed int and iterate signed so the error return is rejected and the
loop terminates.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant