xref: /third_party/rust/crates/nom/tests/overflow.rs (revision 6855e09e)
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