--- /dev/null
+From 226fae124b2dac217ea5436060d623ff3385bc34 Mon Sep 17 00:00:00 2001
+From: George Kennedy <george.kennedy@oracle.com>
+Date: Tue, 24 Jan 2023 11:16:54 -0500
+Subject: vc_screen: move load of struct vc_data pointer in vcs_read() to avoid UAF
+
+From: George Kennedy <george.kennedy@oracle.com>
+
+commit 226fae124b2dac217ea5436060d623ff3385bc34 upstream.
+
+After a call to console_unlock() in vcs_read() the vc_data struct can be
+freed by vc_deallocate(). Because of that, the struct vc_data pointer
+load must be done at the top of while loop in vcs_read() to avoid a UAF
+when vcs_size() is called.
+
+Syzkaller reported a UAF in vcs_size().
+
+BUG: KASAN: use-after-free in vcs_size (drivers/tty/vt/vc_screen.c:215)
+Read of size 4 at addr ffff8881137479a8 by task 4a005ed81e27e65/1537
+
+CPU: 0 PID: 1537 Comm: 4a005ed81e27e65 Not tainted 6.2.0-rc5 #1
+Hardware name: Red Hat KVM, BIOS 1.15.0-2.module
+Call Trace:
+ <TASK>
+__asan_report_load4_noabort (mm/kasan/report_generic.c:350)
+vcs_size (drivers/tty/vt/vc_screen.c:215)
+vcs_read (drivers/tty/vt/vc_screen.c:415)
+vfs_read (fs/read_write.c:468 fs/read_write.c:450)
+...
+ </TASK>
+
+Allocated by task 1191:
+...
+kmalloc_trace (mm/slab_common.c:1069)
+vc_allocate (./include/linux/slab.h:580 ./include/linux/slab.h:720
+ drivers/tty/vt/vt.c:1128 drivers/tty/vt/vt.c:1108)
+con_install (drivers/tty/vt/vt.c:3383)
+tty_init_dev (drivers/tty/tty_io.c:1301 drivers/tty/tty_io.c:1413
+ drivers/tty/tty_io.c:1390)
+tty_open (drivers/tty/tty_io.c:2080 drivers/tty/tty_io.c:2126)
+chrdev_open (fs/char_dev.c:415)
+do_dentry_open (fs/open.c:883)
+vfs_open (fs/open.c:1014)
+...
+
+Freed by task 1548:
+...
+kfree (mm/slab_common.c:1021)
+vc_port_destruct (drivers/tty/vt/vt.c:1094)
+tty_port_destructor (drivers/tty/tty_port.c:296)
+tty_port_put (drivers/tty/tty_port.c:312)
+vt_disallocate_all (drivers/tty/vt/vt_ioctl.c:662 (discriminator 2))
+vt_ioctl (drivers/tty/vt/vt_ioctl.c:903)
+tty_ioctl (drivers/tty/tty_io.c:2776)
+...
+
+The buggy address belongs to the object at ffff888113747800
+ which belongs to the cache kmalloc-1k of size 1024
+The buggy address is located 424 bytes inside of
+ 1024-byte region [ffff888113747800, ffff888113747c00)
+
+The buggy address belongs to the physical page:
+page:00000000b3fe6c7c refcount:1 mapcount:0 mapping:0000000000000000
+ index:0x0 pfn:0x113740
+head:00000000b3fe6c7c order:3 compound_mapcount:0 subpages_mapcount:0
+ compound_pincount:0
+anon flags: 0x17ffffc0010200(slab|head|node=0|zone=2|lastcpupid=0x1fffff)
+raw: 0017ffffc0010200 ffff888100042dc0 0000000000000000 dead000000000001
+raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
+page dumped because: kasan: bad access detected
+
+Memory state around the buggy address:
+ ffff888113747880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+ ffff888113747900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+> ffff888113747980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+ ^
+ ffff888113747a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+ ffff888113747a80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+==================================================================
+Disabling lock debugging due to kernel taint
+
+Fixes: ac751efa6a0d ("console: rename acquire/release_console_sem() to console_lock/unlock()")
+Reported-by: syzkaller <syzkaller@googlegroups.com>
+Suggested-by: Jiri Slaby <jirislaby@kernel.org>
+Signed-off-by: George Kennedy <george.kennedy@oracle.com>
+Link: https://lore.kernel.org/r/1674577014-12374-1-git-send-email-george.kennedy@oracle.com
+[ 4.14: Adjust context ]
+Signed-off-by: Suraj Jitindar Singh <surajjs@amazon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/vt/vc_screen.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/drivers/tty/vt/vc_screen.c
++++ b/drivers/tty/vt/vc_screen.c
+@@ -219,10 +219,6 @@ vcs_read(struct file *file, char __user
+ console_lock();
+
+ attr = (currcons & 128);
+- ret = -ENXIO;
+- vc = vcs_vc(inode, &viewed);
+- if (!vc)
+- goto unlock_out;
+
+ ret = -EINVAL;
+ if (pos < 0)
+@@ -238,6 +234,11 @@ vcs_read(struct file *file, char __user
+ ssize_t orig_count;
+ long p = pos;
+
++ ret = -ENXIO;
++ vc = vcs_vc(inode, &viewed);
++ if (!vc)
++ goto unlock_out;
++
+ /* Check whether we are above size each round,
+ * as copy_to_user at the end of this loop
+ * could sleep.