mgmt: fix InternalFace::processInterest crash when Interest is gone
Interest may be satisfied by Notification and be removed from PIT
between sendInterest and processInterest.
refs #1452
Change-Id: I0c3e05c34f0d8607d96dcfd156a3e87c1ecb26f2
diff --git a/daemon/mgmt/internal-face.cpp b/daemon/mgmt/internal-face.cpp
index 51af45b..de77009 100644
--- a/daemon/mgmt/internal-face.cpp
+++ b/daemon/mgmt/internal-face.cpp
@@ -42,13 +42,22 @@
// Invoke .processInterest a bit later,
// to avoid potential problems in forwarding pipelines.
+ weak_ptr<const Interest> interestWeak = interest.shared_from_this();
getGlobalIoService().post(bind(&InternalFace::processInterest,
- this, boost::cref(interest)));
+ this, interestWeak));
}
void
-InternalFace::processInterest(const Interest& interest)
+InternalFace::processInterest(weak_ptr<const Interest> interestWeak)
{
+ shared_ptr<const Interest> interestPtr = interestWeak.lock();
+ if (!static_cast<bool>(interestPtr)) {
+ // Interest is gone because it's satisfied and removed from PIT
+ NFD_LOG_DEBUG("processInterest: Interest is gone");
+ return;
+ }
+ const Interest& interest = *interestPtr;
+
if (m_interestFilters.size() == 0)
{
NFD_LOG_DEBUG("no Interest filters to match against");
diff --git a/daemon/mgmt/internal-face.hpp b/daemon/mgmt/internal-face.hpp
index 416850c..479f256 100644
--- a/daemon/mgmt/internal-face.hpp
+++ b/daemon/mgmt/internal-face.hpp
@@ -78,7 +78,7 @@
private:
void
- processInterest(const Interest& interest);
+ processInterest(weak_ptr<const Interest> interestWeak);
private:
std::map<Name, OnInterest> m_interestFilters;