From: Francis Dupont Date: Fri, 23 Mar 2018 11:54:55 +0000 (+0100) Subject: [5574] Update dhcpX/ctrl_dhcpX_src.cc X-Git-Tag: trac5577_base~3^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=931571d57d262c7a3fd3704190f3cf58cef89fe2;p=thirdparty%2Fkea.git [5574] Update dhcpX/ctrl_dhcpX_src.cc --- diff --git a/src/bin/dhcp4/ctrl_dhcp4_srv.cc b/src/bin/dhcp4/ctrl_dhcp4_srv.cc index 8321799d90..067f6b1972 100644 --- a/src/bin/dhcp4/ctrl_dhcp4_srv.cc +++ b/src/bin/dhcp4/ctrl_dhcp4_srv.cc @@ -603,9 +603,11 @@ ControlledDhcpv4Srv::processConfig(isc::data::ConstElementPtr config) { // Re-open lease and host database with new parameters. try { + DatabaseConnection::db_lost_callback = + boost::bind(&ControlledDhcpv4Srv::dbLostCallback, srv, _1); CfgDbAccessPtr cfg_db = CfgMgr::instance().getStagingCfg()->getCfgDbAccess(); cfg_db->setAppendedParameters("universe=4"); - cfg_db->createManagers(boost::bind(&ControlledDhcpv4Srv::dbLostCallback, srv, _1)); + cfg_db->createManagers(); } catch (const std::exception& ex) { err << "Unable to open database: " << ex.what(); return (isc::config::createAnswer(1, err.str())); @@ -777,6 +779,10 @@ ControlledDhcpv4Srv::~ControlledDhcpv4Srv() { try { cleanup(); + // The closure captures either a shared pointer (memory leak) + // or a raw pointer (pointing to a deleted object). + DatabaseConnection::db_lost_callback = 0; + timer_mgr_->unregisterTimers(); // Close the command socket (if it exists). @@ -846,7 +852,7 @@ ControlledDhcpv4Srv::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) { // Re-open lease and host database with new parameters. try { CfgDbAccessPtr cfg_db = CfgMgr::instance().getCurrentCfg()->getCfgDbAccess(); - cfg_db->createManagers(boost::bind(&ControlledDhcpv4Srv::dbLostCallback, this, _1)); + cfg_db->createManagers(); reopened = true; } catch (const std::exception& ex) { LOG_ERROR(dhcp4_logger, DHCP4_DB_RECONNECT_ATTEMPT_FAILED).arg(ex.what()); diff --git a/src/bin/dhcp6/ctrl_dhcp6_srv.cc b/src/bin/dhcp6/ctrl_dhcp6_srv.cc index d9eec2bdfd..8fd9d1eb87 100644 --- a/src/bin/dhcp6/ctrl_dhcp6_srv.cc +++ b/src/bin/dhcp6/ctrl_dhcp6_srv.cc @@ -587,9 +587,11 @@ ControlledDhcpv6Srv::processConfig(isc::data::ConstElementPtr config) { // Re-open lease and host database with new parameters. try { + DatabaseConnection::db_lost_callback = + boost::bind(&ControlledDhcpv6Srv::dbLostCallback, srv, _1); CfgDbAccessPtr cfg_db = CfgMgr::instance().getStagingCfg()->getCfgDbAccess(); cfg_db->setAppendedParameters("universe=6"); - cfg_db->createManagers(boost::bind(&ControlledDhcpv6Srv::dbLostCallback, srv, _1)); + cfg_db->createManagers(); } catch (const std::exception& ex) { return (isc::config::createAnswer(1, "Unable to open database: " + std::string(ex.what()))); @@ -762,6 +764,10 @@ ControlledDhcpv6Srv::~ControlledDhcpv6Srv() { try { cleanup(); + // The closure captures either a shared pointer (memory leak) + // or a raw pointer (pointing to a deleted object). + DatabaseConnection::db_lost_callback = 0; + timer_mgr_->unregisterTimers(); // Close the command socket (if it exists). @@ -831,7 +837,7 @@ ControlledDhcpv6Srv::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) { // Re-open lease and host database with new parameters. try { CfgDbAccessPtr cfg_db = CfgMgr::instance().getCurrentCfg()->getCfgDbAccess(); - cfg_db->createManagers(boost::bind(&ControlledDhcpv6Srv::dbLostCallback, this, _1)); + cfg_db->createManagers(); reopened = true; } catch (const std::exception& ex) { LOG_ERROR(dhcp6_logger, DHCP6_DB_RECONNECT_ATTEMPT_FAILED).arg(ex.what());