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