commit fe414fcdd8a7c4d0aaf8b30afade7dc0d59ab2b7
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Sat Feb 10 15:35:12 2018 +0100

    Fix race condition in processFuncRequestQueue
    
    The issue here was that the element was only removed from the queue
    after the func request was processed, but within that process, other
    function could access the queue, so the queue could even be empty
    when this function finally wanted to remove the item.
    
    Fixes: #10406.
    (cherry picked from commit dadec50a18d92d24d42e1ccf7474f07a2a66b5b4)
---
 src/frontends/qt4/GuiApplication.cpp |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/src/frontends/qt4/GuiApplication.cpp 
b/src/frontends/qt4/GuiApplication.cpp
index 97a60e9..35b639c 100644
--- a/src/frontends/qt4/GuiApplication.cpp
+++ b/src/frontends/qt4/GuiApplication.cpp
@@ -2289,8 +2289,12 @@ void GuiApplication::processFuncRequestAsync(FuncRequest 
const & func)
 void GuiApplication::processFuncRequestQueue()
 {
        while (!d->func_request_queue_.empty()) {
-               processFuncRequest(d->func_request_queue_.front());
+               // take the item from the stack _before_ processing the
+               // request in order to avoid race conditions from nested
+               // or parallel requests (see #10406)
+               FuncRequest const fr(d->func_request_queue_.front());
                d->func_request_queue_.pop();
+               processFuncRequest(fr);
        }
 }
 

Reply via email to