version 3.1.9 to fix invalid flags, i.e. when 'S' and 'N' flags set to 1
the 'N' flag is reset to 0 for compatibility with ISC DHCP behavior.
+Starting with Kea verion 3.3.0, the parsing of the iaprefix option replaces
+too big prefix length by its maximal value 128.
+
.. _dhcp6_allocation_strategies:
Allocation Strategies in DHCPv6
prefix_len_ = *begin;
begin += sizeof(uint8_t);
+ if (prefix_len_ > 128) {
+ if (Option::lenient_parsing_) {
+ prefix_len_ = 128;
+ } else {
+ isc_throw(BadValue, static_cast<unsigned>(prefix_len_)
+ << " is not a valid prefix length. "
+ << "Allowed range is 0..128");
+ }
+ }
+
// 16 bytes: IPv6 address
OptionBuffer address_with_mask;
mask(begin, begin + V6ADDRESS_LEN, prefix_len_, address_with_mask);
}
}
-
} // end of namespace isc::dhcp
} // end of namespace isc
using namespace isc::asiolink;
namespace {
+// RAII device to make sure that lenient parsing flag is reset to false on exit.
+class LenientOptionParsing {
+public:
+ LenientOptionParsing(bool value) {
+ Option::lenient_parsing_ = value;
+ }
+
+ ~LenientOptionParsing() {
+ Option::lenient_parsing_ = false;
+ }
+};
+
class Option6IAPrefixTest : public ::testing::Test {
public:
Option6IAPrefixTest() : buf_(255), out_buf_(255) {
// This test verifies that invalid prefix length is not accepted.
TEST_F(Option6IAPrefixTest, constructorInvalidPrefixLength) {
boost::scoped_ptr<Option6IAPrefix> opt;
- setExampleBuffer();
ASSERT_THROW(opt.reset(new Option6IAPrefix(12345,
- IOAddress("2001:db8:1:0:afaf:0:dead:beef"), 77,
- 1000, 3000000000u)), BadValue);
+ IOAddress("2001:db8:1:0:afaf:0:dead:beef"), 77,
+ 1000, 3000000000u)), BadValue);
ASSERT_FALSE(opt);
+
+ ASSERT_THROW(opt.reset(new Option6IAPrefix(12345,
+ IOAddress("2001:db8:1:0:afaf:0:dead:beef"), 200,
+ 1000, 3000000000u)), BadValue);
+ ASSERT_FALSE(opt);
+
+ setExampleBuffer();
+ buf_[8] = 200;
+
+ ASSERT_THROW(opt.reset(new Option6IAPrefix(D6O_IAPREFIX,
+ buf_.begin(), buf_.end())), BadValue);
+
+ // Lenient parsing accepts and fixes it.
+ LenientOptionParsing lop(true);
+ ASSERT_NO_THROW(opt.reset(new Option6IAPrefix(D6O_IAPREFIX,
+ buf_.begin(), buf_.end())));
+ ASSERT_TRUE(opt);
+ EXPECT_EQ(128, opt->getLength());
}
// Checks negative cases