From 81ad72ae89c3dae5d40431a66bb511b28a674a06 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Thu, 20 Nov 2014 17:04:45 +0100 Subject: [PATCH] Fix renegade graphical console rendering thread. The console rendering thread doesn't get shut down as the lfbtextbuffer did not think it had a rendering thread. This causes corruptions to occur when a subsequent resolution change destroys the lfbtextbuffer class instance, but the thread continues to use the class. Lots of undefined behavior occurs as the memory gets reallocated for other purposes. --- kernel/lfbtextbuffer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/lfbtextbuffer.cpp b/kernel/lfbtextbuffer.cpp index fc24886a..321ff5f3 100644 --- a/kernel/lfbtextbuffer.cpp +++ b/kernel/lfbtextbuffer.cpp @@ -123,8 +123,10 @@ LFBTextBuffer* CreateLFBTextBuffer(uint8_t* lfb, uint32_t lfbformat, memset(lfb + scansize * y, 0, lfbformat/8UL * xres); ret->emergency_state = false; + ret->queue_thread = true; if ( !RunKernelThread(kernel_process, LFBTextBuffer__RenderThread, ret) ) { + ret->queue_thread = false; delete ret; return NULL; } @@ -166,16 +168,16 @@ LFBTextBuffer::LFBTextBuffer() LFBTextBuffer::~LFBTextBuffer() { - kthread_mutex_lock(&queue_lock); if ( queue_thread ) { TextBufferCmd cmd; cmd.type = TEXTBUFCMD_EXIT; IssueCommand(&cmd); + kthread_mutex_lock(&queue_lock); while ( queue_thread ) kthread_cond_wait(&queue_exit, &queue_lock); + kthread_mutex_unlock(&queue_lock); } - kthread_mutex_unlock(&queue_lock); delete[] backbuf; delete[] font; delete[] chars;