Browse Source

[master] Merged trac4551 (libdhcp vs Fedora 24)

Francis Dupont 8 years ago
parent
commit
d013ffdecb
2 changed files with 8 additions and 7 deletions
  1. 5 6
      src/lib/dhcp/iface_mgr.cc
  2. 3 1
      src/lib/dhcp/tests/iface_mgr_unittest.cc

+ 5 - 6
src/lib/dhcp/iface_mgr.cc

@@ -880,14 +880,13 @@ IfaceMgr::send(const Pkt4Ptr& pkt) {
 }
 }
 
 
 
 
-boost::shared_ptr<Pkt4>
-IfaceMgr::receive4(uint32_t timeout_sec, uint32_t timeout_usec /* = 0 */) {
+Pkt4Ptr IfaceMgr::receive4(uint32_t timeout_sec, uint32_t timeout_usec /* = 0 */) {
     // Sanity check for microsecond timeout.
     // Sanity check for microsecond timeout.
     if (timeout_usec >= 1000000) {
     if (timeout_usec >= 1000000) {
         isc_throw(BadValue, "fractional timeout must be shorter than"
         isc_throw(BadValue, "fractional timeout must be shorter than"
                   " one million microseconds");
                   " one million microseconds");
     }
     }
-    const SocketInfo* candidate = 0;
+    boost::scoped_ptr<SocketInfo> candidate;
     IfacePtr iface;
     IfacePtr iface;
     fd_set sockets;
     fd_set sockets;
     int maxfd = 0;
     int maxfd = 0;
@@ -972,7 +971,7 @@ IfaceMgr::receive4(uint32_t timeout_sec, uint32_t timeout_usec /* = 0 */) {
     BOOST_FOREACH(iface, ifaces_) {
     BOOST_FOREACH(iface, ifaces_) {
         BOOST_FOREACH(SocketInfo s, iface->getSockets()) {
         BOOST_FOREACH(SocketInfo s, iface->getSockets()) {
             if (FD_ISSET(s.sockfd_, &sockets)) {
             if (FD_ISSET(s.sockfd_, &sockets)) {
-                candidate = &(s);
+                candidate.reset(new SocketInfo(s));
                 break;
                 break;
             }
             }
         }
         }
@@ -997,7 +996,7 @@ Pkt6Ptr IfaceMgr::receive6(uint32_t timeout_sec, uint32_t timeout_usec /* = 0 */
                   " one million microseconds");
                   " one million microseconds");
     }
     }
 
 
-    const SocketInfo* candidate = 0;
+    boost::scoped_ptr<SocketInfo> candidate;
     fd_set sockets;
     fd_set sockets;
     int maxfd = 0;
     int maxfd = 0;
 
 
@@ -1082,7 +1081,7 @@ Pkt6Ptr IfaceMgr::receive6(uint32_t timeout_sec, uint32_t timeout_usec /* = 0 */
     BOOST_FOREACH(IfacePtr iface, ifaces_) {
     BOOST_FOREACH(IfacePtr iface, ifaces_) {
         BOOST_FOREACH(SocketInfo s, iface->getSockets()) {
         BOOST_FOREACH(SocketInfo s, iface->getSockets()) {
             if (FD_ISSET(s.sockfd_, &sockets)) {
             if (FD_ISSET(s.sockfd_, &sockets)) {
-                candidate = &(s);
+                candidate.reset(new SocketInfo(s));
                 break;
                 break;
             }
             }
         }
         }

+ 3 - 1
src/lib/dhcp/tests/iface_mgr_unittest.cc

@@ -2833,15 +2833,17 @@ TEST_F(IfaceMgrTest, unicastDuplicates) {
     NakedIfaceMgr ifacemgr;
     NakedIfaceMgr ifacemgr;
 
 
     IfacePtr iface = ifacemgr.getIface(LOOPBACK);
     IfacePtr iface = ifacemgr.getIface(LOOPBACK);
-    if (iface) {
+    if (!iface) {
         cout << "Local loopback interface not found. Skipping test. " << endl;
         cout << "Local loopback interface not found. Skipping test. " << endl;
         return;
         return;
     }
     }
 
 
     // Tell the interface that it should bind to this global interface
     // Tell the interface that it should bind to this global interface
+    // It is the first attempt so it should succeed
     EXPECT_NO_THROW(iface->addUnicast(IOAddress("2001:db8::1")));
     EXPECT_NO_THROW(iface->addUnicast(IOAddress("2001:db8::1")));
 
 
     // Tell the interface that it should bind to this global interface
     // Tell the interface that it should bind to this global interface
+    // It is the second attempt so it should fail
     EXPECT_THROW(iface->addUnicast(IOAddress("2001:db8::1")), BadValue);
     EXPECT_THROW(iface->addUnicast(IOAddress("2001:db8::1")), BadValue);
 }
 }