1 #![cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
2 #![cfg(target_pointer_width = "64")]
3 
4 use nom::bytes::streaming::take;
5 #[cfg(feature = "alloc")]
6 use nom::multi::{length_data, many0};
7 #[cfg(feature = "alloc")]
8 use nom::number::streaming::be_u64;
9 use nom::sequence::tuple;
10 use nom::{Err, IResult, Needed};
11 
12 // Parser definition
13 
14 // We request a length that would trigger an overflow if computing consumed + requested
parser02(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])>15 fn parser02(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> {
16   tuple((take(1_usize), take(18446744073709551615_usize)))(i)
17 }
18 
19 #[test]
overflow_incomplete_tuple()20 fn 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")]
overflow_incomplete_length_bytes()29 fn 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")]
overflow_incomplete_many0()43 fn 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")]
overflow_incomplete_many1()57 fn 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")]
overflow_incomplete_many_till()73 fn 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")]
overflow_incomplete_many_m_n()89 fn 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")]
overflow_incomplete_count()105 fn 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")]
overflow_incomplete_length_count()120 fn 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")]
overflow_incomplete_length_data()136 fn 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