You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by th...@apache.org on 2018/10/02 16:53:48 UTC
[avro] 01/01: Handled possible negative lengths in data in decoder
This is an automated email from the ASF dual-hosted git repository.
thiru pushed a commit to branch AVRO-2220-handle-negative-lengths
in repository https://gitbox.apache.org/repos/asf/avro.git
commit 355d51ba1e09ae73737160880ee2f07f953ceb6e
Author: Thiruvalluvan M G <th...@startsmartlabs.com>
AuthorDate: Tue Oct 2 22:23:19 2018 +0530
Handled possible negative lengths in data in decoder
---
lang/c++/impl/BinaryDecoder.cc | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/lang/c++/impl/BinaryDecoder.cc b/lang/c++/impl/BinaryDecoder.cc
index af71eac..c0fa10c 100644
--- a/lang/c++/impl/BinaryDecoder.cc
+++ b/lang/c++/impl/BinaryDecoder.cc
@@ -58,6 +58,7 @@ class BinaryDecoder : public Decoder {
int64_t doDecodeLong();
size_t doDecodeItemCount();
+ size_t doDecodeLength();
void more();
};
@@ -115,9 +116,19 @@ double BinaryDecoder::decodeDouble()
return result;
}
+size_t BinaryDecoder::doDecodeLength()
+{
+ ssize_t len = decodeInt();
+ if (len < 0) {
+ throw Exception(
+ boost::format("Cannot have negative length: %1%") % len);
+ }
+ return len;
+}
+
void BinaryDecoder::decodeString(std::string& value)
{
- size_t len = decodeInt();
+ size_t len = doDecodeLength();
value.resize(len);
if (len > 0) {
in_.readBytes(reinterpret_cast<uint8_t*>(&value[0]), len);
@@ -126,13 +137,13 @@ void BinaryDecoder::decodeString(std::string& value)
void BinaryDecoder::skipString()
{
- size_t len = decodeInt();
+ size_t len = doDecodeLength();
in_.skipBytes(len);
}
void BinaryDecoder::decodeBytes(std::vector<uint8_t>& value)
{
- size_t len = decodeInt();
+ size_t len = doDecodeLength();
value.resize(len);
if (len > 0) {
in_.readBytes(&value[0], len);
@@ -141,7 +152,7 @@ void BinaryDecoder::decodeBytes(std::vector<uint8_t>& value)
void BinaryDecoder::skipBytes()
{
- size_t len = decodeInt();
+ size_t len = doDecodeLength();
in_.skipBytes(len);
}