From e5f27778179696429e4212611c6e5454e2a63e99 Mon Sep 17 00:00:00 2001 From: Kenneth Anthony Giusti Date: Thu, 28 Oct 2010 21:33:52 +0000 Subject: QPID-2916: throw an exception when a data value cannot be encoded correctly as its type. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1028501 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/acl/management-schema.xml | 4 ++-- cpp/src/qpid/amqp_0_10/Codecs.cpp | 20 ++++++++++------ cpp/src/qpid/framing/Buffer.cpp | 43 +++++++++++++++++++++++++--------- 3 files changed, 47 insertions(+), 20 deletions(-) (limited to 'cpp/src/qpid') diff --git a/cpp/src/qpid/acl/management-schema.xml b/cpp/src/qpid/acl/management-schema.xml index f4637253d0..7f48a9be34 100644 --- a/cpp/src/qpid/acl/management-schema.xml +++ b/cpp/src/qpid/acl/management-schema.xml @@ -18,7 +18,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/cpp/src/qpid/amqp_0_10/Codecs.cpp b/cpp/src/qpid/amqp_0_10/Codecs.cpp index abe6b2c7da..0fbe2a60b9 100644 --- a/cpp/src/qpid/amqp_0_10/Codecs.cpp +++ b/cpp/src/qpid/amqp_0_10/Codecs.cpp @@ -198,15 +198,21 @@ boost::shared_ptr convertString(const std::string& value, const std: } else { return boost::shared_ptr(new Var16Value(value, 0x90)); } - } else if (encoding == utf8 && !large) { + } else if (encoding == utf8) { + if (!large) return boost::shared_ptr(new Str16Value(value)); - } else if (encoding == utf16 && !large) { - return boost::shared_ptr(new Var16Value(value, 0x96)); - } else if (encoding == iso885915 && !large) { - return boost::shared_ptr(new Var16Value(value, 0x94)); + throw Exception(QPID_MSG("Could not encode utf8 character string - too long (" << value.size() << " bytes)")); + } else if (encoding == utf16) { + if (!large) + return boost::shared_ptr(new Var16Value(value, 0x96)); + throw Exception(QPID_MSG("Could not encode utf16 character string - too long (" << value.size() << " bytes)")); + } else if (encoding == iso885915) { + if (!large) + return boost::shared_ptr(new Var16Value(value, 0x94)); + throw Exception(QPID_MSG("Could not encode iso-8859-15 character string - too long (" << value.size() << " bytes)")); } else { - //either the string is too large for the encoding in amqp 0-10, or the encoding was not recognised - QPID_LOG(warning, "Could not encode " << value.size() << " byte value as " << encoding << ", encoding as vbin32."); + // the encoding was not recognised + QPID_LOG(warning, "Unknown byte encoding: [" << encoding << "], encoding as vbin32."); return boost::shared_ptr(new Var32Value(value, 0xa0)); } } diff --git a/cpp/src/qpid/framing/Buffer.cpp b/cpp/src/qpid/framing/Buffer.cpp index 051e7a2362..7506cdca7b 100644 --- a/cpp/src/qpid/framing/Buffer.cpp +++ b/cpp/src/qpid/framing/Buffer.cpp @@ -20,6 +20,7 @@ */ #include "qpid/framing/Buffer.h" #include "qpid/framing/FieldTable.h" +#include "qpid/Msg.h" #include #include namespace qpid { @@ -211,17 +212,29 @@ uint64_t Buffer::getUInt<8>() { template <> void Buffer::putUInt<1>(uint64_t i) { - putOctet(i); + if (std::numeric_limits::min() <= i && i <= std::numeric_limits::max()) { + putOctet(i); + return; + } + throw Exception(QPID_MSG("Could not encode (" << i << ") as uint8_t.")); } template <> void Buffer::putUInt<2>(uint64_t i) { - putShort(i); + if (std::numeric_limits::min() <= i && i <= std::numeric_limits::max()) { + putShort(i); + return; + } + throw Exception(QPID_MSG("Could not encode (" << i << ") as uint16_t.")); } template <> void Buffer::putUInt<4>(uint64_t i) { - putLong(i); + if (std::numeric_limits::min() <= i && i <= std::numeric_limits::max()) { + putLong(i); + return; + } + throw Exception(QPID_MSG("Could not encode (" << i << ") as uint32_t.")); } template <> @@ -231,18 +244,26 @@ void Buffer::putUInt<8>(uint64_t i) { void Buffer::putShortString(const string& s){ size_t slen = s.length(); - uint8_t len = slen < 0x100 ? (uint8_t) slen : 0xFF; - putOctet(len); - s.copy(data + position, len); - position += len; + if (slen <= std::numeric_limits::max()) { + uint8_t len = (uint8_t) slen; + putOctet(len); + s.copy(data + position, len); + position += len; + return; + } + throw Exception(QPID_MSG("Could not encode string of " << slen << " bytes as uint8_t string.")); } void Buffer::putMediumString(const string& s){ size_t slen = s.length(); - uint16_t len = slen < 0x10000 ? (uint16_t) slen : 0xFFFF; - putShort(len); - s.copy(data + position, len); - position += len; + if (slen <= std::numeric_limits::max()) { + uint16_t len = (uint16_t) slen; + putShort(len); + s.copy(data + position, len); + position += len; + return; + } + throw Exception(QPID_MSG("Could not encode string of " << slen << " bytes as uint16_t string.")); } void Buffer::putLongString(const string& s){ -- cgit v1.2.1