From: Ben Craig Date: Tue, 15 Oct 2013 01:27:18 +0000 (-0500) Subject: THRIFT-2026: Fix TCompactProtocol 64 bit builds X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=7f10de7ee8114ad337043f7de734481e505a3407;p=common%2Fthrift.git THRIFT-2026: Fix TCompactProtocol 64 bit builds Client: cpp Patch: Ben Craig --- diff --git a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc index 62d6485d..c4440208 100644 --- a/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc +++ b/lib/cpp/src/thrift/protocol/TCompactProtocol.tcc @@ -270,8 +270,15 @@ uint32_t TCompactProtocolT::writeString(const std::string& str) { template uint32_t TCompactProtocolT::writeBinary(const std::string& str) { - uint32_t ssize = str.size(); - uint32_t wsize = writeVarint32(ssize) + ssize; + if(str.size() > (std::numeric_limits::max)()) + throw TProtocolException(TProtocolException::SIZE_LIMIT); + uint32_t ssize = static_cast(str.size()); + uint32_t wsize = writeVarint32(ssize) ; + // checking ssize + wsize > uint_max, but we don't want to overflow while checking for overflows. + // transforming the check to ssize > uint_max - wsize + if(ssize > (std::numeric_limits::max)() - wsize) + throw TProtocolException(TProtocolException::SIZE_LIMIT); + wsize += ssize; trans_->write((uint8_t*)str.data(), ssize); return wsize; } @@ -768,7 +775,7 @@ uint32_t TCompactProtocolT::readVarint64(int64_t& i64) { */ template int32_t TCompactProtocolT::zigzagToI32(uint32_t n) { - return (n >> 1) ^ -static_cast(n & 1); + return (n >> 1) ^ static_cast(-static_cast(n & 1)); } /** @@ -776,7 +783,7 @@ int32_t TCompactProtocolT::zigzagToI32(uint32_t n) { */ template int64_t TCompactProtocolT::zigzagToI64(uint64_t n) { - return (n >> 1) ^ -static_cast(n & 1); + return (n >> 1) ^ static_cast(-static_cast(n & 1)); } template