From: Francis Dupont Date: Wed, 5 Jun 2019 17:41:04 +0000 (+0200) Subject: [576-cb-cmds-empty-value-for-next-server-parameter-is-accepted-which-causes-misconfig... X-Git-Tag: Kea-1.6.0-beta2~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=22bd46804664671aae8e0f6abc9c9acb9b7ad3c4;p=thirdparty%2Fkea.git [576-cb-cmds-empty-value-for-next-server-parameter-is-accepted-which-causes-misconfiguration] Protected getSiaddr against global being empty string --- diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index dc5237138c..58b4e6a9a5 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -8,6 +8,7 @@ #define NETWORK_H #include +#include #include #include #include @@ -850,8 +851,13 @@ public: /// @return siaddr value util::Optional getSiaddr(const Inheritance& inheritance = Inheritance::ALL) const { - return (getProperty(&Network4::getSiaddr, siaddr_, - inheritance, "next-server")); + // Temporary fix for global next-server being the empty string. + try { + return (getProperty(&Network4::getSiaddr, siaddr_, + inheritance, "next-server")); + } catch (asiolink::IOError) { + return (siaddr_); + } } /// @brief Sets server hostname for the network. diff --git a/src/lib/dhcpsrv/tests/network_unittest.cc b/src/lib/dhcpsrv/tests/network_unittest.cc index 478b5c5028..ab74ea8af2 100644 --- a/src/lib/dhcpsrv/tests/network_unittest.cc +++ b/src/lib/dhcpsrv/tests/network_unittest.cc @@ -404,4 +404,19 @@ TEST_F(NetworkTest, getPropertyGlobalNoParentNoChild) { EXPECT_EQ("global_iface", net_child->getIface().get()); } +// Test that getSiaddr() never fails. +TEST_F(NetworkTest, getSiaddrNeverFail) { + TestNetworkPtr net_child(new TestNetwork4()); + + // Set the next-server textual address to the empty string. + // Note that IOAddress("") throws IOError. + globals_->set("next-server", Element::create("")); + + net_child->setFetchGlobalsFn(getFetchGlobalsFn()); + + // Get an IPv4 view of the test network. + auto net4_child = boost::dynamic_pointer_cast(net_child); + EXPECT_NO_THROW(net4_child->getSiaddr()); +} + }