Avoid truncation error on 32 bit platforms. This is so that truncation warning can be turned into compiler errors for Blink on 32-bit Android platforms. See https://crbug.com/916990 for more context. gfe-relnote: No functional change on 64-bit platforms. Not flag protected. PiperOrigin-RevId: 227019741 Change-Id: I79ca3745e4a1919f5c97e9f0dc61bbd5bc75e677
diff --git a/http2/hpack/decoder/hpack_string_decoder.h b/http2/hpack/decoder/hpack_string_decoder.h index 8ec0169..88b1add 100644 --- a/http2/hpack/decoder/hpack_string_decoder.h +++ b/http2/hpack/decoder/hpack_string_decoder.h
@@ -13,6 +13,7 @@ #include <algorithm> #include <cstdint> +#include <limits> #include "base/logging.h" #include "base/macros.h" @@ -168,7 +169,18 @@ // false otherwise, in which case status set. template <class Listener> void OnStringStart(Listener* cb, DecodeStatus* status) { - remaining_ = length_decoder_.value(); + // HpackVarintDecoder::value() returns uint64_t. + const uint64_t value = length_decoder_.value(); + // |remaining_| is size_t. Check for truncation on 32-bit platforms. + // numeric_limits::max() is constexpr. On platforms where size_t is at + // least 64 bit wide, the compiler optimizes away this branch. + if (std::numeric_limits<uint64_t>::max() > + std::numeric_limits<size_t>::max() && + value > std::numeric_limits<size_t>::max()) { + *status = DecodeStatus::kDecodeError; + return; + } + remaining_ = static_cast<size_t>(value); // Make callback so consumer knows what is coming. cb->OnStringStart(huffman_encoded_, remaining_); }