summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-11-09 20:14:43 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-11-09 20:14:43 +0100
commitfc964a9581b47eec70a2a8067af9e263ec2ac610 (patch)
tree59e702cb463b186b5a94f1eeb4eef33f5bc44f0c /common
parent03deb122fa1ed0081ce4b4b312a333bb7930abf9 (diff)
downloadsink-fc964a9581b47eec70a2a8067af9e263ec2ac610.tar.gz
sink-fc964a9581b47eec70a2a8067af9e263ec2ac610.zip
Fixed use after free
Diffstat (limited to 'common')
-rw-r--r--common/resourceaccess.cpp21
-rw-r--r--common/resourceaccess.h2
2 files changed, 15 insertions, 8 deletions
diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp
index 5e15786..68bbb7a 100644
--- a/common/resourceaccess.cpp
+++ b/common/resourceaccess.cpp
@@ -676,8 +676,7 @@ Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &ins
676 if (!mCache.contains(instanceIdentifier)) { 676 if (!mCache.contains(instanceIdentifier)) {
677 // Reuse the pointer if something else kept the resourceaccess alive 677 // Reuse the pointer if something else kept the resourceaccess alive
678 if (mWeakCache.contains(instanceIdentifier)) { 678 if (mWeakCache.contains(instanceIdentifier)) {
679 auto sharedPointer = mWeakCache.value(instanceIdentifier).toStrongRef(); 679 if (auto sharedPointer = mWeakCache.value(instanceIdentifier).toStrongRef()) {
680 if (sharedPointer) {
681 mCache.insert(instanceIdentifier, sharedPointer); 680 mCache.insert(instanceIdentifier, sharedPointer);
682 } 681 }
683 } 682 }
@@ -686,7 +685,12 @@ Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &ins
686 auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier, resourceType); 685 auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier, resourceType);
687 QObject::connect(sharedPointer.data(), &Sink::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) { 686 QObject::connect(sharedPointer.data(), &Sink::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) {
688 if (!ready) { 687 if (!ready) {
689 mCache.remove(instanceIdentifier); 688 //We want to remove, but we don't want shared pointer to be destroyed until end of the function as this might trigger further steps.
689 auto ptr = mCache.take(instanceIdentifier);
690 if (auto timer = mTimer.take(instanceIdentifier)) {
691 timer->stop();
692 }
693 Q_UNUSED(ptr);
690 } 694 }
691 }); 695 });
692 mCache.insert(instanceIdentifier, sharedPointer); 696 mCache.insert(instanceIdentifier, sharedPointer);
@@ -694,15 +698,18 @@ Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &ins
694 } 698 }
695 } 699 }
696 if (!mTimer.contains(instanceIdentifier)) { 700 if (!mTimer.contains(instanceIdentifier)) {
697 auto timer = new QTimer; 701 auto timer = QSharedPointer<QTimer>::create();
698 timer->setSingleShot(true); 702 timer->setSingleShot(true);
699 // Drop connection after 3 seconds (which is a random value) 703 // Drop connection after 3 seconds (which is a random value)
700 QObject::connect(timer, &QTimer::timeout, timer, [this, instanceIdentifier]() { mCache.remove(instanceIdentifier); }); 704 QObject::connect(timer.data(), &QTimer::timeout, timer.data(), [this, instanceIdentifier]() {
705 //We want to remove, but we don't want shared pointer to be destroyed until end of the function as this might trigger further steps.
706 auto ptr = mCache.take(instanceIdentifier);
707 Q_UNUSED(ptr);
708 });
701 timer->setInterval(3000); 709 timer->setInterval(3000);
702 mTimer.insert(instanceIdentifier, timer); 710 mTimer.insert(instanceIdentifier, timer);
703 } 711 }
704 auto timer = mTimer.value(instanceIdentifier); 712 mTimer.value(instanceIdentifier)->start();
705 timer->start();
706 return mCache.value(instanceIdentifier); 713 return mCache.value(instanceIdentifier);
707} 714}
708} 715}
diff --git a/common/resourceaccess.h b/common/resourceaccess.h
index 890cc6d..7df6a1b 100644
--- a/common/resourceaccess.h
+++ b/common/resourceaccess.h
@@ -169,6 +169,6 @@ public:
169 169
170 QHash<QByteArray, QWeakPointer<Sink::ResourceAccess>> mWeakCache; 170 QHash<QByteArray, QWeakPointer<Sink::ResourceAccess>> mWeakCache;
171 QHash<QByteArray, Sink::ResourceAccess::Ptr> mCache; 171 QHash<QByteArray, Sink::ResourceAccess::Ptr> mCache;
172 QHash<QByteArray, QTimer *> mTimer; 172 QHash<QByteArray, QSharedPointer<QTimer>> mTimer;
173}; 173};
174} 174}