From: Paul Selkirk Date: Fri, 26 Apr 2013 01:44:49 +0000 (-0400) Subject: [2521] Handle space-separated base-64 digest in DHCID, per Jinmei's review. X-Git-Tag: bind10-1.2.0beta1-release~473^2~16 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4c8efe3ad82e6f62f663579c4e792f70db7012bc;p=thirdparty%2Fkea.git [2521] Handle space-separated base-64 digest in DHCID, per Jinmei's review. Also added more DHCID base-64 unittest cases. --- diff --git a/src/lib/dns/rdata/in_1/dhcid_49.cc b/src/lib/dns/rdata/in_1/dhcid_49.cc index dc292c6251..fee90b15a2 100644 --- a/src/lib/dns/rdata/in_1/dhcid_49.cc +++ b/src/lib/dns/rdata/in_1/dhcid_49.cc @@ -33,8 +33,15 @@ using namespace isc::util::encode; void DHCID::createFromLexer(MasterLexer& lexer) { - const string digest_txt = - lexer.getNextToken(MasterToken::STRING).getString(); + string digest_txt = lexer.getNextToken(MasterToken::STRING).getString(); + while (true) { + const MasterToken& token = lexer.getNextToken(); + if (token.getType() != MasterToken::STRING) { + break; + } + digest_txt.append(token.getString()); + } + lexer.ungetToken(); decodeBase64(digest_txt, digest_); // RFC4701 states DNS software should consider the RDATA section to @@ -67,13 +74,12 @@ DHCID::DHCID(const std::string& dhcid_str) { std::istringstream iss(dhcid_str); MasterLexer lexer; lexer.pushSource(iss); - - createFromLexer(lexer); - - if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) { - isc_throw(InvalidRdataText, "extra input text for DHCID: " - << dhcid_str); - } + createFromLexer(lexer); + // RFC4701 says we have to support white-space-separated substrings, + // so we have to read to the end of input. Therefore, we can't detect + // extra input past the end of the digest. OTOH, extra text is likely + // to result in a base64 decoding error, so BadValue will be thrown in + // that case. } catch (const MasterLexer::LexerError& ex) { isc_throw(InvalidRdataText, "Failed to construct DHCID from '" << dhcid_str << "': " << ex.what()); diff --git a/src/lib/dns/tests/rdata_dhcid_unittest.cc b/src/lib/dns/tests/rdata_dhcid_unittest.cc index 8d56c0e7a3..2f2d38c4e8 100644 --- a/src/lib/dns/tests/rdata_dhcid_unittest.cc +++ b/src/lib/dns/tests/rdata_dhcid_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above @@ -43,6 +43,24 @@ TEST_F(Rdata_DHCID_Test, createFromString) { EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid)); } +TEST_F(Rdata_DHCID_Test, spaceSeparatedBase64) { + const in::DHCID rdata_dhcid2( + "0LIg0LvQtdGB0YMg 0YDQvtC00LjQu9Cw 0YHRjCDRkdC70L7R h9C60LA="); + EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid)); +} + +TEST_F(Rdata_DHCID_Test, multiLineBase64) { + const in::DHCID rdata_dhcid2( + "( 0LIg0LvQtdGB0YMg0YDQvtC00LjQu9Cw\n0YHRjCDRkdC70L7R h9C60LA= )"); + EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid)); +} + +TEST_F(Rdata_DHCID_Test, extraText) { + EXPECT_THROW(const in::DHCID rdata_dhcid2( + "0LIg0LvQtdGB0YMg 0YDQvtC00LjQu9Cw 0YHRjCDRkdC70L7R h9C60LA=" + " superextrabogustext"), isc::BadValue); +} + TEST_F(Rdata_DHCID_Test, badBase64) { EXPECT_THROW(const in::DHCID rdata_dhcid_bad("00"), isc::BadValue); }