summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-06-10 13:20:17 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-06-10 13:20:17 -0500
commitf2102e1f829d216591a5f49819847c05383305ae (patch)
tree70f9fcdaafc62956e31c6ed585fbf4827f285436 /src/tools
parent8ff73908ee9670f5ce72613b65bf1b21b9544b96 (diff)
downloadqt3-f2102e1f829d216591a5f49819847c05383305ae.tar.gz
qt3-f2102e1f829d216591a5f49819847c05383305ae.zip
Fix incorrect thread termination handling when thread count is greater than two
This resolves Bug 1521 Make double free or delete of QString objects more obvious
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/qstring.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/tools/qstring.cpp b/src/tools/qstring.cpp
index 0630cd3..251637d 100644
--- a/src/tools/qstring.cpp
+++ b/src/tools/qstring.cpp
@@ -1071,13 +1071,20 @@ QStringData::QStringData(QChar *u, uint l, uint m) : QShared(),
}
QStringData::~QStringData() {
- if ( unicode ) delete[] ((char*)unicode);
+ if ( unicode ) {
+ delete[] ((char*)unicode);
+ }
if ( ascii && security_unpaged ) {
munlock(ascii, LINUX_MEMLOCK_LIMIT_BYTES);
}
- if ( ascii ) delete[] ascii;
+ if ( ascii ) {
+ delete[] ascii;
+ }
#ifdef QT_THREAD_SUPPORT
- if ( mutex ) delete mutex;
+ if ( mutex ) {
+ delete mutex;
+ mutex = NULL;
+ }
#endif // QT_THREAD_SUPPORT
}
@@ -1675,6 +1682,13 @@ QString::QString( QStringData* dd, bool /* dummy */ ) {
QString::~QString()
{
+#if defined(QT_CHECK_RANGE)
+ if (!d) {
+ qWarning( "QString::~QString: Double free or delete detected!" );
+ return;
+ }
+#endif
+
#ifdef QT_THREAD_SUPPORT
d->mutex->lock();
#endif // QT_THREAD_SUPPORT
@@ -1684,6 +1698,7 @@ QString::~QString()
d->mutex->unlock();
#endif // QT_THREAD_SUPPORT
d->deleteSelf();
+ d = NULL;
}
else {
#ifdef QT_THREAD_SUPPORT