diff options
author | Christian Andersen <csa@ticra.com> | 2018-10-20 22:48:11 +0200 |
---|---|---|
committer | Christian Andersen <csandersen3@gmail.com> | 2018-10-23 17:36:10 +0000 |
commit | 3314694004b825263c9b9f2d69bd85da806ccbbc (patch) | |
tree | e7e45561f553f2b8c6aa73b3e89c496fc3ccb244 | |
parent | f575334691dedc5e34e6391fe638f313de8270eb (diff) |
Fix crash due to racecondition in renderer on shutdown
Protects access to m_renderQueue using the m_renderQueue mutex on
shutdown. When a Qt3DWindow is deleted it signals the aspect thread to
do early cleanup, the aspect thread calls Renderer::shutdown which in
turn resets m_renderQueue. Meanwhile the render thread may be working on
m_renderQueue, this leads to a double free of the front render view in
m_renderQueue (and potentially other stuff).
Fixes: QTBUG-69877
Change-Id: Ifd018597dbdb2f1538494932c907c63e8db9c715
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index e1d237622..8039b6412 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -106,6 +106,7 @@ #include <QSurface> #include <QElapsedTimer> #include <QLibraryInfo> +#include <QMutexLocker> #include <QPluginLoader> #include <QDir> #include <QUrl> @@ -444,8 +445,10 @@ void Renderer::shutdown() // We delete any renderqueue that we may not have had time to render // before the surface was destroyed + QMutexLocker lockRenderQueue(m_renderQueue->mutex()); qDeleteAll(m_renderQueue->nextFrameQueue()); m_renderQueue->reset(); + lockRenderQueue.unlock(); m_commandThread->shutdown(); |