summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2009-03-25 09:39:49 (GMT)
committerThiago Macieira <thiago.macieira@nokia.com>2009-03-25 09:39:49 (GMT)
commite34a24dcd49c055741c9a5914479842021175551 (patch)
tree5fb0f590c47967805b426da14c6d872bde3480a1
parentc3776865dd3731917adf9a8ec8cdffb79a579bae (diff)
downloadQt-e34a24dcd49c055741c9a5914479842021175551.zip
Qt-e34a24dcd49c055741c9a5914479842021175551.tar.gz
Qt-e34a24dcd49c055741c9a5914479842021175551.tar.bz2
Fix QSharedPointer crashing when it is used as a global static in an application.
If it's used as a static, then the order of destruction is ill-defined. The QSharedPointer object may be destroyed after our Q_GLOBAL_STATIC knownPointers has been deleted, thus causing a null-pointer dereference. Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com> Task-number: 246843
-rw-r--r--src/corelib/tools/qsharedpointer.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index d8a9923..c3a989e 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -842,15 +842,19 @@ QT_BEGIN_NAMESPACE
*/
void QtSharedPointer::internalSafetyCheckAdd(const volatile void *ptr)
{
- QMutexLocker lock(&knownPointers()->mutex);
+ KnownPointers *const kp = knownPointers();
+ if (!kp)
+ return; // end-game: the application is being destroyed already
+
+ QMutexLocker lock(&kp->mutex);
void *actual = const_cast<void*>(ptr);
- if (knownPointers()->values.contains(actual)) {
+ if (kp->values.contains(actual)) {
printBacktrace(knownPointers()->values.value(actual));
qFatal("QSharedPointerData: internal self-check failed: pointer %p was already tracked "
"by another QSharedPointerData object", actual);
}
- knownPointers()->values.insert(actual, saveBacktrace());
+ kp->values.insert(actual, saveBacktrace());
}
/*!
@@ -858,9 +862,13 @@ void QtSharedPointer::internalSafetyCheckAdd(const volatile void *ptr)
*/
void QtSharedPointer::internalSafetyCheckRemove(const volatile void *ptr)
{
- QMutexLocker lock(&knownPointers()->mutex);
+ KnownPointers *const kp = knownPointers();
+ if (!kp)
+ return; // end-game: the application is being destroyed already
+
+ QMutexLocker lock(&kp->mutex);
void *actual = const_cast<void*>(ptr);
- knownPointers()->values.remove(actual);
+ kp->values.remove(actual);
}
QT_END_NAMESPACE