From: Michal 'vorner' Vaner Date: Tue, 30 Oct 2012 11:28:13 +0000 (+0100) Subject: [2383] Check origin is provided when needed X-Git-Tag: trac2487_base~21^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b2d9be92c95432c92d4996bd999960e08edcc9bc;p=thirdparty%2Fkea.git [2383] Check origin is provided when needed When the name passed in the string is relative, we need to have the origin to complete the name with. --- diff --git a/src/lib/dns/name.cc b/src/lib/dns/name.cc index 733b52bb59..6e6a704d0c 100644 --- a/src/lib/dns/name.cc +++ b/src/lib/dns/name.cc @@ -321,12 +321,22 @@ Name::Name(const std::string &namestring, bool downcase) { offsets_.assign(offsets.begin(), offsets.end()); } -Name::Name(const char* namedata, size_t data_len, const Name*, bool downcase) { +Name::Name(const char* namedata, size_t data_len, const Name* origin, + bool downcase) +{ // Check validity of data if (namedata == NULL || data_len == 0) { isc_throw(isc::InvalidParameter, "No data provided to Name constructor"); } + // If the last character is not a dot, it is a relative to origin. + // It is safe to check now, we know there's at least one character. + const bool absolute = (namedata[data_len - 1] == '.'); + // If we are not absolute, we need the origin to complete the name. + if (!absolute && origin == NULL) { + isc_throw(MissingNameOrigin, + "No origin available and name is relative"); + } // Prepare inputs for the parser const char* end = namedata + data_len;