Skip to content

Commit 551a8aa

Browse files
authored
der: fix panic in value_cmp: add Iterator::size_hint + tests (#1830)
* der: add test for `SetOf::value_cmp` * der: fix `Iterator::size_hint` * der: add test bitstring_valueord_value_cmp
1 parent 2f3e066 commit 551a8aa

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

der/src/asn1/bit_string.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,11 @@ impl Iterator for BitStringIter<'_> {
472472
self.position = self.position.checked_add(1)?;
473473
Some(byte & bit != 0)
474474
}
475+
476+
fn size_hint(&self) -> (usize, Option<usize>) {
477+
let len = self.bit_string.bit_len().saturating_sub(self.position);
478+
(len, Some(len))
479+
}
475480
}
476481

477482
impl ExactSizeIterator for BitStringIter<'_> {
@@ -569,6 +574,8 @@ where
569574
#[cfg(test)]
570575
#[allow(clippy::unwrap_used)]
571576
mod tests {
577+
use core::cmp::Ordering;
578+
572579
use super::{BitStringRef, Result, Tag};
573580
use crate::asn1::AnyRef;
574581
use hex_literal::hex;
@@ -616,4 +623,13 @@ mod tests {
616623
Tag::BitString.value_error().kind()
617624
)
618625
}
626+
627+
#[test]
628+
fn bitstring_valueord_value_cmp() {
629+
use crate::ord::DerOrd;
630+
631+
let bs1 = parse_bitstring(&hex!("00010204")).unwrap();
632+
let bs2 = parse_bitstring(&hex!("00010203")).unwrap();
633+
assert_eq!(bs1.der_cmp(&bs2), Ok(Ordering::Greater));
634+
}
619635
}

der/src/asn1/sequence_of.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ impl<'a, T> Iterator for SequenceOfIter<'a, T> {
125125
fn next(&mut self) -> Option<&'a T> {
126126
self.inner.next()
127127
}
128+
129+
fn size_hint(&self) -> (usize, Option<usize>) {
130+
self.inner.size_hint()
131+
}
128132
}
129133

130134
impl<T> ExactSizeIterator for SequenceOfIter<'_, T> {}
@@ -239,3 +243,28 @@ where
239243
iter_cmp(self.iter(), other.iter())
240244
}
241245
}
246+
247+
#[cfg(test)]
248+
mod tests {
249+
use crate::asn1::SequenceOf;
250+
use crate::ord::DerOrd;
251+
252+
#[test]
253+
fn sequenceof_valueord_value_cmp() {
254+
use core::cmp::Ordering;
255+
256+
let arr1 = {
257+
let mut arr: SequenceOf<u16, 2> = SequenceOf::new();
258+
arr.add(0u16).expect("element to be added");
259+
arr.add(2u16).expect("element to be added");
260+
arr
261+
};
262+
let arr2 = {
263+
let mut arr: SequenceOf<u16, 2> = SequenceOf::new();
264+
arr.add(0u16).expect("element to be added");
265+
arr.add(1u16).expect("element to be added");
266+
arr
267+
};
268+
assert_eq!(arr1.der_cmp(&arr2), Ok(Ordering::Greater));
269+
}
270+
}

der/src/asn1/set_of.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,10 @@ impl<'a, T> Iterator for SetOfIter<'a, T> {
191191
fn next(&mut self) -> Option<&'a T> {
192192
self.inner.next()
193193
}
194+
195+
fn size_hint(&self) -> (usize, Option<usize>) {
196+
self.inner.size_hint()
197+
}
194198
}
195199

196200
impl<T> ExactSizeIterator for SetOfIter<'_, T> {}
@@ -478,7 +482,7 @@ mod tests {
478482
use super::SetOf;
479483
#[cfg(feature = "alloc")]
480484
use super::SetOfVec;
481-
use crate::ErrorKind;
485+
use crate::{DerOrd, ErrorKind};
482486

483487
#[test]
484488
fn setof_tryfrom_array() {
@@ -494,6 +498,17 @@ mod tests {
494498
assert_eq!(err.kind(), ErrorKind::SetDuplicate);
495499
}
496500

501+
#[test]
502+
fn setof_valueord_value_cmp() {
503+
use core::cmp::Ordering;
504+
505+
let arr1 = [3u16, 2, 1, 5, 0];
506+
let arr2 = [3u16, 2, 1, 4, 0];
507+
let set1 = SetOf::try_from(arr1).unwrap();
508+
let set2 = SetOf::try_from(arr2).unwrap();
509+
assert_eq!(set1.der_cmp(&set2), Ok(Ordering::Greater));
510+
}
511+
497512
#[cfg(feature = "alloc")]
498513
#[test]
499514
fn setofvec_tryfrom_array() {

0 commit comments

Comments
 (0)