From 995c07c184a15946008ceb26be8aeb9d117e4a6c Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 4 Jul 2012 22:51:41 +0900 Subject: [PATCH] Fixed base64::decode() return "" if input ends with garbase and no padding --- src/base64.h | 6 +++++- test/Base64Test.cc | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/base64.h b/src/base64.h index 1eb93ba22..6d0657097 100644 --- a/src/base64.h +++ b/src/base64.h @@ -133,7 +133,11 @@ std::string decode(InputIterator first, InputIterator last) for(int i = 1; i <= 4; ++i) { k[i] = getNext(first, last, INDEX_TABLE); if(k[i] == last) { - res.clear(); + // If i == 1, input may look like this: "TWFu\n" (i.e., + // garbage at the end) + if(i != 1) { + res.clear(); + } return res; } else if(*k[i] == '=' && eq == 0) { eq = i; diff --git a/test/Base64Test.cc b/test/Base64Test.cc index 0a8259d49..f00800991 100644 --- a/test/Base64Test.cc +++ b/test/Base64Test.cc @@ -76,6 +76,9 @@ void Base64Test::testDecode() s = "TWFu"; CPPUNIT_ASSERT_EQUAL(std::string("Man"), base64::decode(s.begin(), s.end())); + s = "TWFu\n"; + CPPUNIT_ASSERT_EQUAL(std::string("Man"), base64::decode(s.begin(), s.end())); + s = "TQ=="; CPPUNIT_ASSERT_EQUAL(std::string("M"), base64::decode(s.begin(), s.end()));