THRIFT-5927: fix i16 overflow in compact protocol read_field_begin
Replace unchecked += with checked_add to prevent overflow.
In overflow-checked builds this caused a panic; in release builds
the accumulator wrapped silently, discarding all subsequent fields.
diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs
index 319f28a..0e61360 100644
--- a/lib/rs/src/protocol/compact.rs
+++ b/lib/rs/src/protocol/compact.rs
@@ -217,7 +217,15 @@
),
_ => {
if field_delta != 0 {
- self.last_read_field_id += field_delta as i16;
+ self.last_read_field_id = self
+ .last_read_field_id
+ .checked_add(field_delta as i16)
+ .ok_or_else(|| {
+ crate::Error::Protocol(ProtocolError::new(
+ ProtocolErrorKind::InvalidData,
+ "field id overflow",
+ ))
+ })?;
} else {
self.last_read_field_id = self.read_i16()?;
};