consensus_encoding: rename min_bytes_needed
What changed, and why it matters
This commit is a simple rename of a Rust trait method from `min_bytes_needed` to `read_limit` across the codebase, along with an update to its documentation to clarify that it represents an upper bound on bytes that can be safely read. There are no logic changes, no bug fixes, and no security implications.
No security action required. Treat as a normal refactoring/code-quality change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch mechanically renames Decoder::min_bytes_needed() to Decoder::read_limit() and updates all call sites and implementations. The doc comment is rewritten to state the method returns the maximum number of bytes the decoder can consume without over-reading. No algorithmic or behavioral changes are present in the diff.
Changed components
consensus_encoding::decode trait and decodersunits crate encoding implementationsInspect captured patch +32 / −33
diff --git a/consensus_encoding/src/decode/decoders.rs b/consensus_encoding/src/decode/decoders.rs
index 3803787e..4ed1a929 100644
--- a/consensus_encoding/src/decode/decoders.rs
+++ b/consensus_encoding/src/decode/decoders.rs
@@ -95,9 +95,9 @@ impl Decoder for ByteVecDecoder {
}
}
- fn min_bytes_needed(&self) -> usize {
+ fn read_limit(&self) -> usize {
if let Some(prefix_decoder) = &self.prefix_decoder {
- prefix_decoder.min_bytes_needed()
+ prefix_decoder.read_limit()
} else {
self.bytes_expected - self.bytes_written
}
@@ -193,11 +193,11 @@ impl<T: Decodable> Decoder for VecDecoder<T> {
}
}
- fn min_bytes_needed(&self) -> usize {
+ fn read_limit(&self) -> usize {
if let Some(prefix_decoder) = &self.prefix_decoder {
- prefix_decoder.min_bytes_needed()
+ prefix_decoder.read_limit()
} else if let Some(decoder) = &self.decoder {
- decoder.min_bytes_needed()
+ decoder.read_limit()
} else if self.buffer.len() == self.length {
// Totally done.
0
@@ -205,8 +205,8 @@ impl<T: Decodable> Decoder for VecDecoder<T> {
let items_left_to_decode = self.length - self.buffer.len();
let decoder = T::decoder();
// This could be inaccurate (eg 1 for a `ByteVecDecoder`) but its the best we can do.
- let min_per_decoder = decoder.min_bytes_needed();
- items_left_to_decode * min_per_decoder
+ let limit_per_decoder = decoder.read_limit();
+ items_left_to_decode * limit_per_decoder
}
}
}
@@ -274,7 +274,7 @@ impl<const N: usize> Decoder for ArrayDecoder<N> {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { N - self.bytes_written }
+ fn read_limit(&self) -> usize { N - self.bytes_written }
}
/// A decoder which wraps two inner decoders and returns the output of both.
@@ -395,11 +395,11 @@ where
}
#[inline]
- fn min_bytes_needed(&self) -> usize {
+ fn read_limit(&self) -> usize {
match &self.state {
Decoder2State::First(first_decoder, second_decoder) =>
- first_decoder.min_bytes_needed() + second_decoder.min_bytes_needed(),
- Decoder2State::Second(_, second_decoder) => second_decoder.min_bytes_needed(),
+ first_decoder.read_limit() + second_decoder.read_limit(),
+ Decoder2State::Second(_, second_decoder) => second_decoder.read_limit(),
Decoder2State::Errored => 0,
Decoder2State::Transitioning => 0,
}
@@ -453,7 +453,7 @@ where
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
/// A decoder which decodes four objects, one after the other.
@@ -509,7 +509,7 @@ where
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
/// A decoder which decodes six objects, one after the other.
@@ -590,7 +590,7 @@ where
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
/// Decodes a compact size encoded integer.
@@ -679,7 +679,7 @@ impl Decoder for CompactSizeDecoder {
}
}
- fn min_bytes_needed(&self) -> usize {
+ fn read_limit(&self) -> usize {
match self.buf.len() {
0 => 1,
already_read => match self.buf[0] {
@@ -984,7 +984,7 @@ mod tests {
Ok(Inner(n))
}
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "alloc")]
@@ -1016,7 +1016,7 @@ mod tests {
Ok(Test(v))
}
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "alloc")]
diff --git a/consensus_encoding/src/decode/mod.rs b/consensus_encoding/src/decode/mod.rs
index 9f1d8a8c..87a80b88 100644
--- a/consensus_encoding/src/decode/mod.rs
+++ b/consensus_encoding/src/decode/mod.rs
@@ -59,13 +59,12 @@ pub trait Decoder: Sized {
#[must_use = "must check result to avoid panics on subsequent calls"]
fn end(self) -> Result<Self::Output, Self::Error>;
- /// Returns the minimum number of bytes needed to advance the state of the
- /// decoder while ensuring there are no over-reads.
+ /// Returns the maximum number of bytes this decoder can consume without over-reading.
///
/// Returns 0 if the decoder is complete and ready to finalize with [`Self::end`].
/// This is used by [`decode_from_read_unbuffered`] to optimize read sizes,
- /// avoiding both inefficient under reads and unnecessary over-reads.
- fn min_bytes_needed(&self) -> usize;
+ /// avoiding both inefficient under-reads and unnecessary over-reads.
+ fn read_limit(&self) -> usize;
}
/// Decodes an object from a byte slice.
@@ -192,9 +191,9 @@ where
let mut decoder = T::decoder();
let mut buffer = [0u8; BUFFER_SIZE];
- while decoder.min_bytes_needed() > 0 {
+ while decoder.read_limit() > 0 {
// Only read what we need, up to buffer size.
- let clamped_buffer = &mut buffer[..decoder.min_bytes_needed().min(BUFFER_SIZE)];
+ let clamped_buffer = &mut buffer[..decoder.read_limit().min(BUFFER_SIZE)];
match reader.read(clamped_buffer) {
Ok(0) => {
// EOF, but still try to finalize the decoder.
@@ -288,7 +287,7 @@ mod tests {
fn end(self) -> Result<Self::Output, Self::Error> { self.inner.end().map(TestArray) }
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
#[test]
diff --git a/consensus_encoding/tests/composition.rs b/consensus_encoding/tests/composition.rs
index 6f5ca237..eca6b500 100644
--- a/consensus_encoding/tests/composition.rs
+++ b/consensus_encoding/tests/composition.rs
@@ -69,7 +69,7 @@ impl Decoder for CompositeDataDecoder {
Ok(CompositeData { first, second })
}
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
impl Decodable for CompositeData {
@@ -220,7 +220,7 @@ fn composition_error_unification() {
Ok((first, second))
}
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
/// Another test composite decoder.
@@ -245,7 +245,7 @@ fn composition_error_unification() {
Ok(result)
}
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
/// A decoder which can fail.
@@ -274,7 +274,7 @@ fn composition_error_unification() {
}
}
- fn min_bytes_needed(&self) -> usize { self.inner.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.inner.read_limit() }
}
// A multi-layer, nested, decoder structure with a unified top level error type.
diff --git a/units/src/amount/unsigned.rs b/units/src/amount/unsigned.rs
index 9d20674a..e265732e 100644
--- a/units/src/amount/unsigned.rs
+++ b/units/src/amount/unsigned.rs
@@ -610,7 +610,7 @@ impl encoding::Decoder for AmountDecoder {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "encoding")]
diff --git a/units/src/block.rs b/units/src/block.rs
index 6f9f2342..b5d8e5c1 100644
--- a/units/src/block.rs
+++ b/units/src/block.rs
@@ -193,7 +193,7 @@ impl encoding::Decoder for BlockHeightDecoder {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "encoding")]
diff --git a/units/src/locktime/absolute/mod.rs b/units/src/locktime/absolute/mod.rs
index ee3f7dd0..223f0291 100644
--- a/units/src/locktime/absolute/mod.rs
+++ b/units/src/locktime/absolute/mod.rs
@@ -451,7 +451,7 @@ impl encoding::Decoder for LockTimeDecoder {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "encoding")]
diff --git a/units/src/sequence.rs b/units/src/sequence.rs
index 0e18e996..51f01d0e 100644
--- a/units/src/sequence.rs
+++ b/units/src/sequence.rs
@@ -316,7 +316,7 @@ impl encoding::Decoder for SequenceDecoder {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "encoding")]
diff --git a/units/src/time.rs b/units/src/time.rs
index e16a3b7c..5a6850a8 100644
--- a/units/src/time.rs
+++ b/units/src/time.rs
@@ -126,7 +126,7 @@ impl encoding::Decoder for BlockTimeDecoder {
}
#[inline]
- fn min_bytes_needed(&self) -> usize { self.0.min_bytes_needed() }
+ fn read_limit(&self) -> usize { self.0.read_limit() }
}
#[cfg(feature = "encoding")]
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.