]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3560] Disallow IPv4 and IPv6 multicast addresses for IPv6 reservations.
authorMarcin Siodelski <marcin@isc.org>
Tue, 14 Oct 2014 10:15:55 +0000 (12:15 +0200)
committerMarcin Siodelski <marcin@isc.org>
Tue, 14 Oct 2014 10:15:55 +0000 (12:15 +0200)
src/lib/dhcpsrv/host.cc
src/lib/dhcpsrv/host.h
src/lib/dhcpsrv/tests/host_unittest.cc

index 49cafea0ae857a4def6a18bb95f5d1eed949b918..0a5054c53a526512ed36fa7af425ea22ba01f81c 100644 (file)
 namespace isc {
 namespace dhcp {
 
+IPv6Resrv::IPv6Resrv(const asiolink::IOAddress& prefix,
+                     const uint8_t prefix_len)
+    : prefix_(prefix), prefix_len_(prefix_len) {
+    if (!prefix.isV6() || prefix.isV6Multicast()) {
+        isc_throw(isc::BadValue, "invalid prefix '" << prefix
+                  << " for new IPv6 reservation");
+    }
+}
+
 bool
 IPv6Resrv::operator==(const IPv6Resrv& other) const {
     return (prefix_ == other.prefix_ &&
index ebff21c071e11c407d339909a60926f1c9e07135..8eed26529f5276ca800d5d975e24163dec2bc37f 100644 (file)
@@ -56,10 +56,11 @@ public:
     ///
     /// @param prefix Address or prefix to be reserved.
     /// @param prefix_len Prefix length.
+    ///
+    /// @throw isc::BadValue if address is not IPv6 address or is a
+    /// multicast address.
     IPv6Resrv(const asiolink::IOAddress& prefix,
-              const uint8_t prefix_len = 128)
-        : prefix_(prefix), prefix_len_(prefix_len) {
-    }
+              const uint8_t prefix_len = 128);
 
     /// @brief Returns prefix for the reservation.
     const asiolink::IOAddress& getPrefix() const {
index eee372a076f49f808bce20f878471d863258f37b..f0db9c17534bfd90ce973876eeb5e944e970ede8 100644 (file)
@@ -42,6 +42,11 @@ TEST(IPv6ResrvTest, constructorPrefix) {
     EXPECT_EQ(IPv6Resrv::TYPE_PD, resrv.getType());
 }
 
+TEST(IPv6ResrvTest, constructorInvalidPrefix) {
+    EXPECT_THROW(IPv6Resrv(IOAddress("10.0.0.1"), 128), isc::BadValue);
+    EXPECT_THROW(IPv6Resrv(IOAddress("ff02:1::2"), 128), isc::BadValue);
+}
+
 // This test verifies that it is possible to modify prefix and its
 // length in an existing reservation.
 TEST(IPv6ResrvTest, setPrefix) {