1#![cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))] 2#![cfg(target_pointer_width = "64")] 3 4use nom::bytes::streaming::take; 5#[cfg(feature = "alloc")] 6use nom::multi::{length_data, many0}; 7#[cfg(feature = "alloc")] 8use nom::number::streaming::be_u64; 9use nom::sequence::tuple; 10use nom::{Err, IResult, Needed}; 11 12// Parser definition 13 14// We request a length that would trigger an overflow if computing consumed + requested 15fn parser02(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> { 16 tuple((take(1_usize), take(18446744073709551615_usize)))(i) 17} 18 19#[test] 20fn overflow_incomplete_tuple() { 21 assert_eq!( 22 parser02(&b"3"[..]), 23 Err(Err::Incomplete(Needed::new(18446744073709551615))) 24 ); 25} 26 27#[test] 28#[cfg(feature = "alloc")] 29fn overflow_incomplete_length_bytes() { 30 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 31 many0(length_data(be_u64))(i) 32 } 33 34 // Trigger an overflow in length_data 35 assert_eq!( 36 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xff"[..]), 37 Err(Err::Incomplete(Needed::new(18446744073709551615))) 38 ); 39} 40 41#[test] 42#[cfg(feature = "alloc")] 43fn overflow_incomplete_many0() { 44 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 45 many0(length_data(be_u64))(i) 46 } 47 48 // Trigger an overflow in many0 49 assert_eq!( 50 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef"[..]), 51 Err(Err::Incomplete(Needed::new(18446744073709551599))) 52 ); 53} 54 55#[test] 56#[cfg(feature = "alloc")] 57fn overflow_incomplete_many1() { 58 use nom::multi::many1; 59 60 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 61 many1(length_data(be_u64))(i) 62 } 63 64 // Trigger an overflow in many1 65 assert_eq!( 66 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef"[..]), 67 Err(Err::Incomplete(Needed::new(18446744073709551599))) 68 ); 69} 70 71#[test] 72#[cfg(feature = "alloc")] 73fn overflow_incomplete_many_till() { 74 use nom::{bytes::complete::tag, multi::many_till}; 75 76 fn multi(i: &[u8]) -> IResult<&[u8], (Vec<&[u8]>, &[u8])> { 77 many_till(length_data(be_u64), tag("abc"))(i) 78 } 79 80 // Trigger an overflow in many_till 81 assert_eq!( 82 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef"[..]), 83 Err(Err::Incomplete(Needed::new(18446744073709551599))) 84 ); 85} 86 87#[test] 88#[cfg(feature = "alloc")] 89fn overflow_incomplete_many_m_n() { 90 use nom::multi::many_m_n; 91 92 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 93 many_m_n(2, 4, length_data(be_u64))(i) 94 } 95 96 // Trigger an overflow in many_m_n 97 assert_eq!( 98 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef"[..]), 99 Err(Err::Incomplete(Needed::new(18446744073709551599))) 100 ); 101} 102 103#[test] 104#[cfg(feature = "alloc")] 105fn overflow_incomplete_count() { 106 use nom::multi::count; 107 108 fn counter(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 109 count(length_data(be_u64), 2)(i) 110 } 111 112 assert_eq!( 113 counter(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef"[..]), 114 Err(Err::Incomplete(Needed::new(18446744073709551599))) 115 ); 116} 117 118#[test] 119#[cfg(feature = "alloc")] 120fn overflow_incomplete_length_count() { 121 use nom::multi::length_count; 122 use nom::number::streaming::be_u8; 123 124 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 125 length_count(be_u8, length_data(be_u64))(i) 126 } 127 128 assert_eq!( 129 multi(&b"\x04\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xee"[..]), 130 Err(Err::Incomplete(Needed::new(18446744073709551598))) 131 ); 132} 133 134#[test] 135#[cfg(feature = "alloc")] 136fn overflow_incomplete_length_data() { 137 fn multi(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> { 138 many0(length_data(be_u64))(i) 139 } 140 141 assert_eq!( 142 multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xff"[..]), 143 Err(Err::Incomplete(Needed::new(18446744073709551615))) 144 ); 145} 146