From: Francis Dupont Date: Tue, 16 Jul 2019 23:49:40 +0000 (+0200) Subject: [738-kea4-crash-when-remote-network4-del-command-is-issued-with-subnets-action-delete... X-Git-Tag: Kea-1.6.0-beta2~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ad95788f5382ae504b42ea107db7deb13703a7e;p=thirdparty%2Fkea.git [738-kea4-crash-when-remote-network4-del-command-is-issued-with-subnets-action-delete] Fixed: use only ANY --- diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc index 31a2c7e785..de9f5ee6ba 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc @@ -2482,7 +2482,7 @@ TaggedStatementArray tagged_statements = { { // Delete all subnets for a shared network. { MySqlConfigBackendDHCPv4Impl::DELETE_ALL_SUBNETS4_SHARED_NETWORK_NAME, - MYSQL_DELETE_SUBNET_WITH_TAG(dhcp4, AND s.shared_network_name = ?) + MYSQL_DELETE_SUBNET_ANY(dhcp4, WHERE s.shared_network_name = ?) }, // Delete associations of a subnet with server. @@ -2939,6 +2939,10 @@ MySqlConfigBackendDHCPv4::deleteAllSubnets4(const ServerSelector& server_selecto uint64_t MySqlConfigBackendDHCPv4::deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector, const std::string& shared_network_name) { + if (!server_selector.amAny()) { + isc_throw(InvalidOperation, "deleting all subnets from a shared " + "network is defined only using ANY server"); + } LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_SHARED_NETWORK_SUBNETS4) .arg(shared_network_name); uint64_t result = impl_->deleteTransactional(MySqlConfigBackendDHCPv4Impl::DELETE_ALL_SUBNETS4_SHARED_NETWORK_NAME, diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp6.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp6.cc index e935a1ed3a..2e4ae9d149 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp6.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp6.cc @@ -2841,7 +2841,7 @@ TaggedStatementArray tagged_statements = { { // Delete all subnets for a shared network. { MySqlConfigBackendDHCPv6Impl::DELETE_ALL_SUBNETS6_SHARED_NETWORK_NAME, - MYSQL_DELETE_SUBNET_WITH_TAG(dhcp6, AND s.shared_network_name = ?) + MYSQL_DELETE_SUBNET_ANY(dhcp6, WHERE s.shared_network_name = ?) }, // Delete associations of a subnet with server. @@ -3319,6 +3319,10 @@ MySqlConfigBackendDHCPv6::deleteAllSubnets6(const ServerSelector& server_selecto uint64_t MySqlConfigBackendDHCPv6::deleteSharedNetworkSubnets6(const db::ServerSelector& server_selector, const std::string& shared_network_name) { + if (!server_selector.amAny()) { + isc_throw(InvalidOperation, "deleting all subnets from a shared " + "network is defined only using ANY server"); + } LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_SHARED_NETWORK_SUBNETS6) .arg(shared_network_name); uint64_t result = impl_->deleteTransactional(MySqlConfigBackendDHCPv6Impl::DELETE_ALL_SUBNETS6_SHARED_NETWORK_NAME, diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc index 64af5c2319..9c7a4a8944 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc @@ -2233,7 +2233,7 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getAllSharedNetworks4) { // Delete first shared network with it subnets and verify it is gone. // Begin by its subnet. - EXPECT_EQ(1, cbptr_->deleteSharedNetworkSubnets4(ServerSelector::ALL(), + EXPECT_EQ(1, cbptr_->deleteSharedNetworkSubnets4(ServerSelector::ANY(), test_networks_[1]->getName())); { diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc index 1a5d2a7089..705b81ddf5 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc @@ -2248,7 +2248,7 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getAllSharedNetworks6) { // Delete first shared network with it subnets and verify it is gone. // Begin by its subnet. - EXPECT_EQ(1, cbptr_->deleteSharedNetworkSubnets6(ServerSelector::ALL(), + EXPECT_EQ(1, cbptr_->deleteSharedNetworkSubnets6(ServerSelector::ANY(), test_networks_[1]->getName())); {