Merge tag 'tty-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[linux-2.6-microblaze.git] / drivers / tty / vt / vt.c
index cb72393..7359c3e 100644 (file)
@@ -1219,8 +1219,25 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
        new_row_size = new_cols << 1;
        new_screen_size = new_row_size * new_rows;
 
-       if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
-               return 0;
+       if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) {
+               /*
+                * This function is being called here to cover the case
+                * where the userspace calls the FBIOPUT_VSCREENINFO twice,
+                * passing the same fb_var_screeninfo containing the fields
+                * yres/xres equal to a number non-multiple of vc_font.height
+                * and yres_virtual/xres_virtual equal to number lesser than the
+                * vc_font.height and yres/xres.
+                * In the second call, the struct fb_var_screeninfo isn't
+                * being modified by the underlying driver because of the
+                * if above, and this causes the fbcon_display->vrows to become
+                * negative and it eventually leads to out-of-bound
+                * access by the imageblit function.
+                * To give the correct values to the struct and to not have
+                * to deal with possible errors from the code below, we call
+                * the resize_screen here as well.
+                */
+               return resize_screen(vc, new_cols, new_rows, user);
+       }
 
        if (new_screen_size > KMALLOC_MAX_SIZE || !new_screen_size)
                return -EINVAL;
@@ -3582,8 +3599,9 @@ int __init vty_init(const struct file_operations *console_fops)
 
        vcs_init();
 
-       console_driver = alloc_tty_driver(MAX_NR_CONSOLES);
-       if (!console_driver)
+       console_driver = tty_alloc_driver(MAX_NR_CONSOLES, TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_RESET_TERMIOS);
+       if (IS_ERR(console_driver))
                panic("Couldn't allocate console driver\n");
 
        console_driver->name = "tty";
@@ -3594,7 +3612,6 @@ int __init vty_init(const struct file_operations *console_fops)
        console_driver->init_termios = tty_std_termios;
        if (default_utf8)
                console_driver->init_termios.c_iflag |= IUTF8;
-       console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
        tty_set_operations(console_driver, &con_ops);
        if (tty_register_driver(console_driver))
                panic("Couldn't register console driver\n");