linux/drivers/video
Nam Cao 8986ea3539 fbdev: fix incorrect address computation in deferred IO
commit 78d9161d2b upstream.

With deferred IO enabled, a page fault happens when data is written to the
framebuffer device. Then driver determines which page is being updated by
calculating the offset of the written virtual address within the virtual
memory area, and uses this offset to get the updated page within the
internal buffer. This page is later copied to hardware (thus the name
"deferred IO").

This offset calculation is only correct if the virtual memory area is
mapped to the beginning of the internal buffer. Otherwise this is wrong.
For example, if users do:
    mmap(ptr, 4096, PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0xff000);

Then the virtual memory area will mapped at offset 0xff000 within the
internal buffer. This offset 0xff000 is not accounted for, and wrong page
is updated.

Correct the calculation by using vmf->pgoff instead. With this change, the
variable "offset" will no longer hold the exact offset value, but it is
rounded down to multiples of PAGE_SIZE. But this is still correct, because
this variable is only used to calculate the page offset.

Reported-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Closes: https://lore.kernel.org/linux-fbdev/271372d6-e665-4e7f-b088-dee5f4ab341a@oracle.com
Fixes: 56c134f7f1 ("fbdev: Track deferred-I/O pages in pageref struct")
Cc: <stable@vger.kernel.org>
Signed-off-by: Nam Cao <namcao@linutronix.de>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240423115053.4490-1-namcao@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2024-05-02 16:32:46 +02:00
..
backlight backlight: lp8788: Fully initialize backlight_properties during probe 2024-03-26 18:19:56 -04:00
console drm: fix up fbdev Kconfig defaults 2023-09-18 10:52:55 +02:00
fbdev fbdev: fix incorrect address computation in deferred IO 2024-05-02 16:32:46 +02:00
logo video: logo: LOGO should depend on FB_CORE i.s.o. FB 2023-07-28 11:48:30 +02:00
aperture.c video/aperture: Provide a VGA helper for gma500 and internal use 2023-04-16 14:18:10 +02:00
cmdline.c fbdev: Handle video= parameter in video/cmdline.c 2023-02-20 14:56:48 +01:00
display_timing.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 428 2019-06-05 17:37:16 +02:00
hdmi.c video/hdmi: Add audio_infoframe packing for DP 2022-09-04 15:31:59 +03:00
Kconfig video: logo: LOGO should depend on FB_CORE i.s.o. FB 2023-07-28 11:48:30 +02:00
Makefile video: Move HP PARISC STI core code to shared location 2023-04-20 10:04:51 +02:00
nomodeset.c drm: Move nomodeset kernel parameter to drivers/video 2022-11-16 13:26:12 +01:00
of_display_timing.c video: fbdev: of: display_timing: Remove a redundant zeroing of memory 2022-04-04 08:55:23 +02:00
of_videomode.c video: Fix kernel-doc warnings in of_display_timing + of_videomode 2020-11-29 22:42:17 +01:00
sticore.c sticon/parisc: Fix STI console on 64-bit only machines 2023-06-30 17:14:14 +02:00
vgastate.c Video: vgastate: fixed a spacing coding style 2018-10-08 12:57:35 +02:00
videomode.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 428 2019-06-05 17:37:16 +02:00