Fix potential race condition in data structure of adopted thread watcher
authorjian liang <jianliang79@gmail.com>
Sun, 19 Feb 2012 14:09:44 +0000 (22:09 +0800)
committerQt by Nokia <qt-info@nokia.com>
Tue, 21 Feb 2012 23:07:31 +0000 (00:07 +0100)
Fix potential race condition in data structure of adopted thread watcher
in Windows. Since QVector is not thread safe, it is not safe to read and
append data to qt_adopted_thread_handles or qt_adopted_qthread
simultaneously in qthread_win.cpp. This patch fix this race condition.

Change-Id: I2d0c7a4cdde5390d38d15c98343f0fc6ddd24aba
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
src/corelib/thread/qthread_win.cpp

index bdee6d6..afcfb2c 100644 (file)
@@ -224,7 +224,9 @@ void qt_adopted_thread_watcher_function(void *)
 //             printf("(qt) - qt_adopted_thread_watcher_function... called\n");
             const int qthreadIndex = handleIndex - 1;
 
+            qt_adopted_thread_watcher_mutex.lock();
             QThreadData *data = QThreadData::get2(qt_adopted_qthreads.at(qthreadIndex));
+            qt_adopted_thread_watcher_mutex.unlock();
             if (data->isAdopted) {
                 QThread *thread = data->thread;
                 Q_ASSERT(thread);
@@ -234,10 +236,10 @@ void qt_adopted_thread_watcher_function(void *)
             }
             data->deref();
 
+            QMutexLocker lock(&qt_adopted_thread_watcher_mutex);
 #if !defined(Q_OS_WINCE) || (defined(_WIN32_WCE) && (_WIN32_WCE>=0x600))
             CloseHandle(qt_adopted_thread_handles.at(handleIndex));
 #endif
-            QMutexLocker lock(&qt_adopted_thread_watcher_mutex);
             qt_adopted_thread_handles.remove(handleIndex);
             qt_adopted_qthreads.remove(qthreadIndex);
         }