From d8fa8c5f8278ff89da6a8433f32bd9a564aaa3ad Mon Sep 17 00:00:00 2001 From: Florian Angermeier Date: Wed, 15 Jul 2020 04:13:29 +0200 Subject: [PATCH] Kernel: Ensure there are all VirtualConsoles properly initialized It is possible to switch to VirtualConsoles 1 to 4 via the shortcut ALT + [1-4]. Therefor the array of VirtualConsoles should be guaranteed to be initialized. Also add an constant for the maximum number of VirtualConsoles to guarantee consistency. --- Kernel/TTY/VirtualConsole.cpp | 6 ++++-- Kernel/TTY/VirtualConsole.h | 2 ++ Kernel/init.cpp | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Kernel/TTY/VirtualConsole.cpp b/Kernel/TTY/VirtualConsole.cpp index 52c6dcfadf..c8eac8da6a 100644 --- a/Kernel/TTY/VirtualConsole.cpp +++ b/Kernel/TTY/VirtualConsole.cpp @@ -36,7 +36,7 @@ namespace Kernel { static u8* s_vga_buffer; -static VirtualConsole* s_consoles[6]; +static VirtualConsole* s_consoles[s_max_virtual_consoles]; static int s_active_console; static RecursiveSpinLock s_lock; @@ -68,6 +68,8 @@ VirtualConsole::VirtualConsole(const unsigned index) , m_index(index) , m_terminal(*this) { + ASSERT(index < s_max_virtual_consoles); + m_tty_name = String::format("/dev/tty%u", m_index); m_terminal.set_size(80, 25); @@ -83,7 +85,7 @@ void VirtualConsole::switch_to(unsigned index) { if ((int)index == s_active_console) return; - ASSERT(index < 6); + ASSERT(index < s_max_virtual_consoles); ASSERT(s_consoles[index]); ScopedSpinLock lock(s_lock); diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h index 0e5c90a062..5d7c3dcf3a 100644 --- a/Kernel/TTY/VirtualConsole.h +++ b/Kernel/TTY/VirtualConsole.h @@ -33,6 +33,8 @@ namespace Kernel { +static constexpr unsigned s_max_virtual_consoles = 6; + class VirtualConsole final : public TTY , public KeyboardClient , public VT::TerminalClient { diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 06eaf2c2cd..b096f616bf 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -144,7 +144,9 @@ extern "C" [[noreturn]] void init() VirtualConsole::initialize(); tty0 = new VirtualConsole(0); - new VirtualConsole(1); + for (unsigned i = 1; i < s_max_virtual_consoles; i++) { + new VirtualConsole(i); + } VirtualConsole::switch_to(0); Process::initialize();