From: Colin Patrick McCabe Date: Thu, 13 Jan 2011 19:19:27 +0000 (-0800) Subject: common: fix buffer::list::decode_base64 X-Git-Tag: v0.25~324 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=34adf360f1a573a30899bb5fe4b8a46af3431109;p=ceph.git common: fix buffer::list::decode_base64 buffer::list::decode_base64 needs to check for decode failures. Signed-off-by: Colin McCabe --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 1b3d4b731bd0..f2d785b918da 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -39,8 +40,14 @@ void buffer::list::encode_base64(buffer::list& o) void buffer::list::decode_base64(buffer::list& e) { - bufferptr bp(e.length() * 3 / 4 + 4); + bufferptr bp(4 + ((e.length() * 3) / 4)); int l = ceph_unarmor(bp.c_str(), bp.c_str() + bp.length(), e.c_str(), e.c_str() + e.length()); + if (l < 0) { + std::ostringstream oss; + oss << "decode_base64: decoding failed:\n"; + hexdump(oss); + throw buffer::malformed_input(oss.str().c_str()); + } assert(l <= (int)bp.length()); bp.set_length(l); push_back(bp); diff --git a/src/test/base64.cc b/src/test/base64.cc index 2cf6d71fed8d..dc091221eb34 100644 --- a/src/test/base64.cc +++ b/src/test/base64.cc @@ -19,7 +19,7 @@ #include "gtest/gtest.h" -TEST(CorrectBase64Encoding, StringSimple) { +TEST(CorrectBase64RoundTrip, StringSimple) { static const int OUT_LEN = 4096; const char * const original = "abracadabra"; const char * const correctly_encoded = "YWJyYWNhZGFicmE="; @@ -34,7 +34,7 @@ TEST(CorrectBase64Encoding, StringSimple) { ASSERT_STREQ(original, out2); } -TEST(IncorrectBase64Encoding, StringSimple) { +TEST(IncorrectBase64Decoding, StringSimple) { static const int OUT_LEN = 4096; const char * const bad_encoded = "FAKEBASE64 foo"; char out[OUT_LEN]; @@ -42,3 +42,20 @@ TEST(IncorrectBase64Encoding, StringSimple) { int alen = ceph_unarmor(out, out + OUT_LEN, bad_encoded, bad_encoded + strlen(bad_encoded)); ASSERT_LT(alen, 0); } + +TEST(IncorrectBase64Decoding2, StringSimple) { + string str("FAKEBASE64 foo"); + bool failed = false; + try { + bufferlist bl; + bl.append(str); + + bufferlist cl; + cl.decode_base64(bl); + cl.hexdump(std::cerr); + } + catch (const buffer::error &err) { + failed = true; + } + ASSERT_EQ(failed, true); +} diff --git a/src/test/cli/cauthtool/add-key-segv.t b/src/test/cli/cauthtool/add-key-segv.t index 370dbabdf04c..696a80a574f8 100644 --- a/src/test/cli/cauthtool/add-key-segv.t +++ b/src/test/cli/cauthtool/add-key-segv.t @@ -1,18 +1,6 @@ $ cauthtool kring --create-keyring creating kring -# TODO fix me $ cauthtool kring --add-key 'FAKEBASE64 foo' - *** Caught signal (Segmentation fault) *** - in thread [0-9a-f]{12} (re) - ceph version .* (re) - 1: .* (re) - 2: .* (re) - 3: .* (re) - 4: .* (re) - 5: .* (re) - 6: .* (re) - 7: .* (re) - 8: .* (re) - Segmentation fault - [139] + can't decode key 'FAKEBASE64 foo' + [1]