From: Andrew Melnychenko <[email protected]>

If there is a lot(more then 16) of virtio-console devices
or virtio_console module is reloaded
- buffers 'vtermnos' and 'cons_ops' are overflowed.
In older kernels it overruns spinlock which leads to kernel freezing:
https://bugzilla.redhat.com/show_bug.cgi?id=1786239

Signed-off-by: Andrew Melnychenko <[email protected]>
---
 drivers/tty/hvc/hvc_console.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 27284a2dcd2b..436cc51c92c3 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -302,10 +302,6 @@ int hvc_instantiate(uint32_t vtermno, int index, const 
struct hv_ops *ops)
        vtermnos[index] = vtermno;
        cons_ops[index] = ops;
 
-       /* reserve all indices up to and including this index */
-       if (last_hvc < index)
-               last_hvc = index;
-
        /* check if we need to re-register the kernel console */
        hvc_check_console(index);
 
@@ -960,13 +956,22 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
                    cons_ops[i] == hp->ops)
                        break;
 
-       /* no matching slot, just use a counter */
-       if (i >= MAX_NR_HVC_CONSOLES)
-               i = ++last_hvc;
+       if (i >= MAX_NR_HVC_CONSOLES) {
+
+               /* find 'empty' slot for console */
+               for (i = 0; i < MAX_NR_HVC_CONSOLES && vtermnos[i] != -1; i++) {
+               }
+
+               /* no matching slot, just use a counter */
+               if (i == MAX_NR_HVC_CONSOLES)
+                       i = ++last_hvc + MAX_NR_HVC_CONSOLES;
+       }
 
        hp->index = i;
-       cons_ops[i] = ops;
-       vtermnos[i] = vtermno;
+       if (i < MAX_NR_HVC_CONSOLES) {
+               cons_ops[i] = ops;
+               vtermnos[i] = vtermno;
+       }
 
        list_add_tail(&(hp->next), &hvc_structs);
        mutex_unlock(&hvc_structs_mutex);
-- 
2.24.1

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to