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