1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:58:12 +00:00

WindowServer: Fallback to safe mode-setting in case of mapping overflow

In case of possible framebuffer mapping overflow, just fallback to the
safe mode-setting of the DisplayConnector, because in that state we know
for sure that we can map a usable framebuffer (otherwise it is a bug in
the Kernel, and not WindowServer).
This commit is contained in:
Liav A 2022-09-24 16:59:08 +03:00 committed by Linus Groh
parent d5b97eb41e
commit 13e9947b4b
6 changed files with 37 additions and 2 deletions

View file

@ -51,8 +51,27 @@ HardwareScreenBackend::~HardwareScreenBackend()
}
}
ErrorOr<void> HardwareScreenBackend::set_safe_head_mode_setting()
{
auto rc = graphics_connector_set_safe_head_mode_setting(m_display_connector_fd);
if (rc != 0) {
dbgln("Failed to set backend safe mode setting: aborting");
return Error::from_syscall("graphics_connector_set_safe_head_mode_setting"sv, rc);
}
return {};
}
ErrorOr<void> HardwareScreenBackend::set_head_mode_setting(GraphicsHeadModeSetting mode_setting)
{
size_t size_in_bytes = 0;
if (m_can_set_head_buffer) {
size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
} else {
size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active;
}
VERIFY(size_in_bytes != 0);
if (m_max_size_in_bytes < size_in_bytes)
return Error::from_errno(EOVERFLOW);
GraphicsHeadModeSetting requested_mode_setting = mode_setting;
auto rc = graphics_connector_set_head_mode_setting(m_display_connector_fd, &requested_mode_setting);
@ -91,6 +110,9 @@ ErrorOr<void> HardwareScreenBackend::map_framebuffer()
} else {
m_size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active;
}
if (m_max_size_in_bytes < m_size_in_bytes)
return Error::from_errno(EOVERFLOW);
m_framebuffer = (Gfx::ARGB32*)TRY(Core::System::mmap(nullptr, m_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_display_connector_fd, 0));
if (m_can_set_head_buffer) {