Kernel: Prevent kprintf() from asserting in Console::the() (#718)

This triggered a stack overflow because ubsan can call kprintf() at any
time, even before Console is initialized.
This commit is contained in:
Nicolas Van Bossuyt 2019-11-03 13:17:55 +01:00 committed by Andreas Kling
parent 8216019b2e
commit 81c4dcadf1
Notes: sideshowbarker 2024-07-19 11:27:10 +09:00
3 changed files with 14 additions and 1 deletions

View File

@ -13,6 +13,11 @@ Console& Console::the()
return *s_the; return *s_the;
} }
bool Console::is_initialized()
{
return s_the != nullptr;
}
Console::Console() Console::Console()
: CharacterDevice(5, 1) : CharacterDevice(5, 1)
{ {

View File

@ -14,6 +14,7 @@ class Console final : public CharacterDevice {
AK_MAKE_ETERNAL AK_MAKE_ETERNAL
public: public:
static Console& the(); static Console& the();
static bool is_initialized();
Console(); Console();
virtual ~Console() override; virtual ~Console() override;

View File

@ -70,7 +70,14 @@ static void console_putch(char*&, char ch)
{ {
if (serial_debug) if (serial_debug)
serial_putch(ch); serial_putch(ch);
Console::the().put_char(ch);
// It would be bad to reach the assert in Console()::the() and do a stack overflow
if (Console::is_initialized()) {
Console::the().put_char(ch);
} else {
IO::out8(0xe9, ch);
}
} }
int kprintf(const char* fmt, ...) int kprintf(const char* fmt, ...)