Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

api: fix a buffer overflow in x86emu_log() #45

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

lkundrak
Copy link

@lkundrak lkundrak commented Nov 1, 2024

There seems to be an assumption that vsnprintf() returns a number of characters that were written. That is actually not the case -- it returns number of characters that would have been written regardless of truncation to specified size.

Therefore, on x86emu_log() that would cross the buffer end will move .log.ptr beyond the end of the buffer, and the subsequent .flush() will be called back with a size argument larger than the buffer.

Moreover, given the .flush() is essentially only invoked upon x86emu_clear_log(), this is almost bound to happen for instances that run for a long time.

Let's solve the buffer fillup differently: 1.) flush the buffer when it fills up (we'd be crossing the buffer boundary) and 2.) make sure .log.ptr is allways clipped to point inside the allocated buffer.

There seems to be an assumption that vsnprintf() returns a number of
characters that were written. That is actually not the case -- it
returns number of characters that *would* have been written regardless
of truncation to specified size.

Therefore, on x86emu_log() that would cross the buffer end will move
.log.ptr beyond the end of the buffer, and the subsequent .flush()
will be called back with a size argument larger than the buffer.

Moreover, given the .flush() is essentially only invoked upon
x86emu_clear_log(), this is almost bound to happen for instances that
run for a long time.

Let's solve the buffer fillup differently: 1.) flush the buffer when it
fills up (we'd be crossing the buffer boundary) and 2.) make sure
.log.ptr is allways clipped to point inside the allocated buffer.
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.

1 participant