diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-11-09 20:14:43 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-11-09 20:14:43 +0100 |
commit | fc964a9581b47eec70a2a8067af9e263ec2ac610 (patch) | |
tree | 59e702cb463b186b5a94f1eeb4eef33f5bc44f0c /common/resourceaccess.cpp | |
parent | 03deb122fa1ed0081ce4b4b312a333bb7930abf9 (diff) | |
download | sink-fc964a9581b47eec70a2a8067af9e263ec2ac610.tar.gz sink-fc964a9581b47eec70a2a8067af9e263ec2ac610.zip |
Fixed use after free
Diffstat (limited to 'common/resourceaccess.cpp')
-rw-r--r-- | common/resourceaccess.cpp | 21 |
1 files changed, 14 insertions, 7 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 | } |