public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] vt: fix memory overlapping when deleting chars in the buffer
@ 2022-06-27 12:54 Yangxi Xiang
  2022-06-27 13:07 ` Greg Kroah-Hartman
  2022-06-28  8:08 ` Jiri Slaby
  0 siblings, 2 replies; 13+ messages in thread
From: Yangxi Xiang @ 2022-06-27 12:54 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, Jiri Slaby, Johan Hovold,
	Igor Matheus Andrade Torrente, Christian Borntraeger, nick black,
	Yangxi Xiang

A memory overlapping copy occurs when deleting a long line. This memory
overlapping copy can cause data corruption when scr_memcpyw is optimized
to memcpy because memcpy does not ensure its behavior if the destination
buffer overlaps with the source buffer. The line buffer is not always
broken, because the memcpy utilizes the hardware acceleration, whose
result is not deterministic.

Fix this problem by using replacing the scr_memcpyw with scr_memmovew, and
preserving the memcpy optimization when the buffers are not overlapping.

Fixes: 81732c3b2fed ("Fix line garbage in virtual console").
Signed-off-by: Yangxi Xiang <xyangxi5@gmail.com>
---
 drivers/tty/vt/vt.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index f8c87c4d7399..d87bff9d8ed5 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -853,9 +853,13 @@ static void insert_char(struct vc_data *vc, unsigned int nr)
 static void delete_char(struct vc_data *vc, unsigned int nr)
 {
 	unsigned short *p = (unsigned short *) vc->vc_pos;
+	unsigned short cp = (vc->vc_cols - vc->state.x - nr) * 2;
 
 	vc_uniscr_delete(vc, nr);
-	scr_memcpyw(p, p + nr, (vc->vc_cols - vc->state.x - nr) * 2);
+	if (cp > nr)
+		scr_memmovew(p, p + nr, cp);
+	else
+		scr_memcpyw(p, p + nr, cp);
 	scr_memsetw(p + vc->vc_cols - vc->state.x - nr, vc->vc_video_erase_char,
 			nr * 2);
 	vc->vc_need_wrap = 0;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread
* [PATCH] vt: fix memory overlapping when deleting chars in the buffer
@ 2022-06-27 10:29 Yangxi Xiang
  2022-06-27 10:47 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 13+ messages in thread
From: Yangxi Xiang @ 2022-06-27 10:29 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, Jiri Slaby, Johan Hovold,
	Igor Matheus Andrade Torrente, Christian Borntraeger, nick black,
	Yangxi Xiang

A memory overlapping copy occurs when deleting a long line. Fix it by
using scr_memmovew.

Signed-off-by: Yangxi Xiang <xyangxi5@gmail.com>
---
 drivers/tty/vt/vt.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index f8c87c4d7399..d87bff9d8ed5 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -853,9 +853,13 @@ static void insert_char(struct vc_data *vc, unsigned int nr)
 static void delete_char(struct vc_data *vc, unsigned int nr)
 {
 	unsigned short *p = (unsigned short *) vc->vc_pos;
+	unsigned short cp = (vc->vc_cols - vc->state.x - nr) * 2;
 
 	vc_uniscr_delete(vc, nr);
-	scr_memcpyw(p, p + nr, (vc->vc_cols - vc->state.x - nr) * 2);
+	if (cp > nr)
+		scr_memmovew(p, p + nr, cp);
+	else
+		scr_memcpyw(p, p + nr, cp);
 	scr_memsetw(p + vc->vc_cols - vc->state.x - nr, vc->vc_video_erase_char,
 			nr * 2);
 	vc->vc_need_wrap = 0;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-06-28  9:11 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-27 12:54 [PATCH v2] vt: fix memory overlapping when deleting chars in the buffer Yangxi Xiang
2022-06-27 13:07 ` Greg Kroah-Hartman
2022-06-28  8:08 ` Jiri Slaby
2022-06-28  8:27   ` [PATCH] " Yangxi Xiang
2022-06-28  8:38     ` Jiri Slaby
2022-06-28  8:59       ` Yangxi Xiang
2022-06-28  9:11         ` Greg Kroah-Hartman
  -- strict thread matches above, loose matches on Subject: below --
2022-06-27 10:29 Yangxi Xiang
2022-06-27 10:47 ` Greg Kroah-Hartman
2022-06-27 11:04   ` Yangxi Xiang
2022-06-27 11:07     ` Greg Kroah-Hartman
2022-06-27 11:40       ` Yangxi Xiang
2022-06-27 12:29         ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox