blob: 2f4a87f34a76485f27281b01d33d037edd66f71f [file] [log] [blame]
#![cfg_attr(feature = "cargo-clippy", allow(unreadable_literal))]
#![cfg(target_pointer_width = "64")]
#[macro_use]
extern crate nom;
use nom::{Err, Needed};
#[cfg(feature = "alloc")]
use nom::number::streaming::be_u64;
// Parser definition
// We request a length that would trigger an overflow if computing consumed + requested
named!(parser01<&[u8],()>,
do_parse!(
hdr: take!(1) >>
data: take!(18446744073709551615) >>
({
let _ = hdr;
let _ = data;
()
})
)
);
// We request a length that would trigger an overflow if computing consumed + requested
named!(parser02<&[u8],(&[u8],&[u8])>,
tuple!(take!(1),take!(18446744073709551615))
);
#[test]
fn overflow_incomplete_do_parse() {
assert_eq!(
parser01(&b"3"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551615)))
);
}
#[test]
fn overflow_incomplete_tuple() {
assert_eq!(
parser02(&b"3"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551615)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_length_bytes() {
named!(multi<&[u8], Vec<&[u8]> >, many0!( length_data!(be_u64) ) );
// Trigger an overflow in length_data
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xff\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551615)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_many0() {
named!(multi<&[u8], Vec<&[u8]> >, many0!( length_data!(be_u64) ) );
// Trigger an overflow in many0
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551599)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_many1() {
named!(multi<&[u8], Vec<&[u8]> >, many1!( length_data!(be_u64) ) );
// Trigger an overflow in many1
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551599)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_many_till() {
named!(multi<&[u8], (Vec<&[u8]>, &[u8]) >, many_till!( length_data!(be_u64), tag!("abc") ) );
// Trigger an overflow in many_till
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551599)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_many_m_n() {
named!(multi<&[u8], Vec<&[u8]> >, many_m_n!(2, 4, length_data!(be_u64) ) );
// Trigger an overflow in many_m_n
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551599)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_count() {
named!(counter<&[u8], Vec<&[u8]> >, count!( length_data!(be_u64), 2 ) );
assert_eq!(
counter(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xef\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551599)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_length_count() {
use nom::number::streaming::be_u8;
named!(multi<&[u8], Vec<&[u8]> >, length_count!( be_u8, length_data!(be_u64) ) );
assert_eq!(
multi(&b"\x04\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xee\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551598)))
);
}
#[test]
#[cfg(feature = "alloc")]
fn overflow_incomplete_length_data() {
named!(multi<&[u8], Vec<&[u8]> >, many0!( length_data!(be_u64) ) );
assert_eq!(
multi(&b"\x00\x00\x00\x00\x00\x00\x00\x01\xaa\xff\xff\xff\xff\xff\xff\xff\xff\xaa"[..]),
Err(Err::Incomplete(Needed::Size(18446744073709551615)))
);
}