Commit 83e33ec8 authored by Ocean Wang's avatar Ocean Wang
Browse files

Merge branch 'trac838'

parents acf47441 e4543dee
......@@ -160,19 +160,42 @@ public:
base_zero_code_(base_zero_code),
base_(base), base_beginpad_(base_beginpad), base_end_(base_end),
in_pad_(false)
{}
{
// Skip beginning spaces, if any. We need do it here because
// otherwise the first call to operator*() would be confused.
skipSpaces();
}
DecodeNormalizer& operator++() {
++base_;
while (base_ != base_end_ && isspace(*base_)) {
++base_;
}
skipSpaces();
if (base_ == base_beginpad_) {
in_pad_ = true;
}
return (*this);
}
void skipSpaces() {
// If (char is signed and) *base_ < 0, on Windows platform with Visual
// Studio compiler it may trigger _ASSERTE((unsigned)(c + 1) <= 256);
// so make sure that the parameter of isspace() is larger than 0.
// We don't simply cast it to unsigned char to avoid confusing the
// isspace() implementation with a possible extension for values
// larger than 127. Also note the check is not ">= 0"; for systems
// where char is unsigned that would always be true and would possibly
// trigger a compiler warning that could stop the build.
while (base_ != base_end_ && *base_ > 0 && isspace(*base_)) {
++base_;
}
}
const char& operator*() const {
if (in_pad_ && *base_ == BASE_PADDING_CHAR) {
if (base_ == base_end_) {
// binary_from_baseX calls this operator when it needs more bits
// even if the internal iterator (base_) has reached its end
// (if that happens it means the input is an incomplete baseX
// string and should be rejected). So this is the only point
// we can catch and reject this type of invalid input.
isc_throw(BadValue, "Unexpected end of input in BASE decoder");
}
if (in_pad_) {
return (base_zero_code_);
} else {
return (*base_);
......@@ -268,7 +291,7 @@ BaseNTransformer<BitsPerChunk, BaseZeroCode, Encoder, Decoder>::decode(
isc_throw(BadValue, "Too many " << algorithm
<< " padding characters: " << input);
}
} else if (!isspace(ch)) {
} else if (ch < 0 || !isspace(ch)) {
break;
}
++srit;
......
......@@ -66,7 +66,7 @@ decodeCheck(const string& input_string, vector<uint8_t>& output,
const string& expected)
{
decodeBase32Hex(input_string, output);
EXPECT_EQ(expected, string(&output[0], &output[0] + output.size()));
EXPECT_EQ(expected, string(output.begin(), output.end()));
}
TEST_F(Base32HexTest, decode) {
......@@ -79,6 +79,11 @@ TEST_F(Base32HexTest, decode) {
// whitespace should be allowed
decodeCheck("CP NM\tUOG=", decoded_data, "foob");
decodeCheck("CPNMU===\n", decoded_data, "foo");
decodeCheck(" CP NM\tUOG=", decoded_data, "foob");
decodeCheck(" ", decoded_data, "");
// Incomplete input
EXPECT_THROW(decodeBase32Hex("CPNMUOJ", decoded_data), BadValue);
// invalid number of padding characters
EXPECT_THROW(decodeBase32Hex("CPNMU0==", decoded_data), BadValue);
......
......@@ -52,7 +52,7 @@ decodeCheck(const string& input_string, vector<uint8_t>& output,
const string& expected)
{
decodeBase64(input_string, output);
EXPECT_EQ(expected, string(&output[0], &output[0] + output.size()));
EXPECT_EQ(expected, string(output.begin(), output.end()));
}
TEST_F(Base64Test, decode) {
......@@ -66,6 +66,12 @@ TEST_F(Base64Test, decode) {
decodeCheck("Zm 9v\tYmF\ny", decoded_data, "foobar");
decodeCheck("Zm9vYg==", decoded_data, "foob");
decodeCheck("Zm9vYmE=\n", decoded_data, "fooba");
decodeCheck(" Zm9vYmE=\n", decoded_data, "fooba");
decodeCheck(" ", decoded_data, "");
decodeCheck("\n\t", decoded_data, "");
// incomplete input
EXPECT_THROW(decodeBase64("Zm9vYmF", decoded_data), BadValue);
// only up to 2 padding characters are allowed
EXPECT_THROW(decodeBase64("A===", decoded_data), BadValue);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment