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