table: Fixing Pit::erase crash if the Interest name contains implicit digest

Change-Id: I471023fc23ffaebe04d9668426b4c1b03e4973ac
Refs: #3608
diff --git a/daemon/table/pit-entry.hpp b/daemon/table/pit-entry.hpp
index 3f15598..b7f83a3 100644
--- a/daemon/table/pit-entry.hpp
+++ b/daemon/table/pit-entry.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -36,7 +36,9 @@
 
 namespace name_tree {
 class Entry;
-}
+} // namespace name_tree
+
+class Pit;
 
 namespace pit {
 
@@ -183,6 +185,7 @@
 
   friend class nfd::NameTree;
   friend class nfd::name_tree::Entry;
+  friend class nfd::Pit;
 };
 
 inline const Interest&
diff --git a/daemon/table/pit.cpp b/daemon/table/pit.cpp
index 12a21bd..ae5a5cd 100644
--- a/daemon/table/pit.cpp
+++ b/daemon/table/pit.cpp
@@ -113,7 +113,7 @@
 void
 Pit::erase(shared_ptr<pit::Entry> pitEntry)
 {
-  shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.get(*pitEntry);
+  shared_ptr<name_tree::Entry> nameTreeEntry = pitEntry->m_nameTreeEntry;
   BOOST_ASSERT(static_cast<bool>(nameTreeEntry));
 
   nameTreeEntry->erasePitEntry(pitEntry);
diff --git a/tests/daemon/table/pit.t.cpp b/tests/daemon/table/pit.t.cpp
index 546c0a5..64f4159 100644
--- a/tests/daemon/table/pit.t.cpp
+++ b/tests/daemon/table/pit.t.cpp
@@ -431,6 +431,34 @@
   BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore);
 }
 
+BOOST_AUTO_TEST_CASE(EraseWithFullName)
+{
+  shared_ptr<Data> data = makeData("/test");
+  shared_ptr<Interest> interest = makeInterest(data->getFullName());
+
+  NameTree nameTree(16);
+  Pit pit(nameTree);
+
+  BOOST_CHECK_EQUAL(pit.size(), 0);
+
+  BOOST_CHECK_EQUAL(pit.insert(*interest).second, true);
+  BOOST_CHECK_EQUAL(pit.size(), 1);
+  BOOST_CHECK(pit.find(*interest) != nullptr);
+
+  BOOST_CHECK_EQUAL(pit.insert(*interest).second, false);
+  BOOST_CHECK_EQUAL(pit.size(), 1);
+  shared_ptr<pit::Entry> pitEntry = pit.find(*interest);
+  BOOST_REQUIRE(pitEntry != nullptr);
+
+  pit.erase(pitEntry);
+  BOOST_CHECK_EQUAL(pit.size(), 0);
+  BOOST_CHECK(pit.find(*interest) == nullptr);
+
+  BOOST_CHECK_EQUAL(pit.insert(*interest).second, true);
+  BOOST_CHECK_EQUAL(pit.size(), 1);
+  BOOST_CHECK(pit.find(*interest) != nullptr);
+}
+
 BOOST_AUTO_TEST_CASE(FindAllDataMatches)
 {
   Name nameA   ("ndn:/A");