From 5c21347e5496e25de514c6c046a27402b1d39c32 Mon Sep 17 00:00:00 2001 From: liaosirui Date: Tue, 13 Oct 2020 09:19:12 +0800 Subject: [PATCH] Fix bug that illegal iterator might be used. Use closedTs to help save buffer. --- src/anbox/graphics/emugl/Renderer.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/anbox/graphics/emugl/Renderer.cpp b/src/anbox/graphics/emugl/Renderer.cpp index a206fde..2ef758a 100644 --- a/src/anbox/graphics/emugl/Renderer.cpp +++ b/src/anbox/graphics/emugl/Renderer.cpp @@ -103,7 +103,7 @@ void Renderer::saveColorBuffer(ColorBufferRef* cbRef) { void Renderer::resumeColorBuffer(ColorBufferRef* cbRef) { RenderThreadInfo *tInfo = RenderThreadInfo::get(); - if (eraseDelayedCloseColorBufferLocked(cbRef->cb->getHndl(), cbRef->closedTs)) { + if (cbRef->closedTs != 0 && eraseDelayedCloseColorBufferLocked(cbRef->cb->getHndl(), cbRef->closedTs)) { cbRef->refcount++; cbRef->closedTs = 0; int tid = tInfo->m_tid; @@ -731,13 +731,12 @@ bool Renderer::setWindowSurfaceColorBuffer(HandleType p_surface, } ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); - resumeColorBuffer(&((*c).second)); if (c == m_colorbuffers.end()) { DEBUG("%s: bad color buffer handle %#x", __FUNCTION__, p_colorbuffer); // bad colorbuffer handle return false; } - + resumeColorBuffer(&((*c).second)); (*w).second.first->setColorBuffer((*c).second.cb); saveColorBuffer(&c->second); if (w->second.second) { @@ -754,12 +753,11 @@ void Renderer::readColorBuffer(HandleType p_colorbuffer, int x, int y, std::unique_lock l(m_lock); ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); - resumeColorBuffer(&((*c).second)); if (c == m_colorbuffers.end()) { // bad colorbuffer handle return; } - + resumeColorBuffer(&((*c).second)); (*c).second.cb->readPixels(x, y, width, height, format, type, pixels); } @@ -769,12 +767,11 @@ bool Renderer::updateColorBuffer(HandleType p_colorbuffer, int x, int y, std::unique_lock l(m_lock); ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); - resumeColorBuffer(&((*c).second)); if (c == m_colorbuffers.end()) { // bad colorbuffer handle return false; } - + resumeColorBuffer(&((*c).second)); (*c).second.cb->subUpdate(x, y, width, height, format, type, pixels); return true; @@ -784,12 +781,11 @@ bool Renderer::bindColorBufferToTexture(HandleType p_colorbuffer) { std::unique_lock l(m_lock); ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); - resumeColorBuffer(&((*c).second)); if (c == m_colorbuffers.end()) { // bad colorbuffer handle return false; } - + resumeColorBuffer(&((*c).second)); return (*c).second.cb->bindToTexture(); } @@ -797,12 +793,11 @@ bool Renderer::bindColorBufferToRenderbuffer(HandleType p_colorbuffer) { std::unique_lock l(m_lock); ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); - resumeColorBuffer(&((*c).second)); if (c == m_colorbuffers.end()) { // bad colorbuffer handle return false; } - + resumeColorBuffer(&((*c).second)); return (*c).second.cb->bindToRenderbuffer(); } -- Gitee