smb: check on param parsing

Ticket: 5246

so as not to overflow u16

(cherry picked from commit 817a5001a5)
pull/7437/head
Philippe Antoine 5 years ago committed by Jeff Lucovsky
parent dfe3da7765
commit d80fbfd4c6

@ -16,11 +16,13 @@
*/ */
use crate::smb::error::SmbError; use crate::smb::error::SmbError;
use nom::IResult;
use nom::combinator::rest;
use nom::number::streaming::{le_u8, le_u16, le_u32, le_u64};
use crate::smb::smb::*; use crate::smb::smb::*;
use crate::smb::smb_records::*; use crate::smb::smb_records::*;
use nom::bytes::streaming:: take;
use nom::combinator::{cond, rest, verify};
use nom::number::streaming::{le_u8, le_u16, le_u32, le_u64};
use nom::IResult;
// SMB_FLAGS_REPLY in Microsoft docs. // SMB_FLAGS_REPLY in Microsoft docs.
const SMB1_FLAGS_RESPONSE: u8 = 0x80; const SMB1_FLAGS_RESPONSE: u8 = 0x80;
@ -656,37 +658,41 @@ pub struct SmbRequestTrans2Record<'a> {
pub data_blob: &'a[u8], pub data_blob: &'a[u8],
} }
named!(pub parse_smb_trans2_request_record<SmbRequestTrans2Record>, pub fn parse_smb_trans2_request_record(i: &[u8]) -> IResult<&[u8], SmbRequestTrans2Record> {
do_parse!( let (i, _wct) = le_u8(i)?;
_wct: le_u8 let (i, _total_param_cnt) = le_u16(i)?;
>> _total_param_cnt: le_u16 let (i, _total_data_cnt) = le_u16(i)?;
>> _total_data_cnt: le_u16 let (i, _max_param_cnt) = le_u16(i)?;
>> _max_param_cnt: le_u16 let (i, _max_data_cnt) = le_u16(i)?;
>> _max_data_cnt: le_u16 let (i, _max_setup_cnt) = le_u8(i)?;
>> _max_setup_cnt: le_u8 let (i, _reserved1) = take(1_usize)(i)?;
>> _reserved1: take!(1) let (i, _flags) = le_u16(i)?;
>> _flags: le_u16 let (i, _timeout) = le_u32(i)?;
>> _timeout: le_u32 let (i, _reserved2) = take(2_usize)(i)?;
>> _reserved2: take!(2) let (i, param_cnt) = le_u16(i)?;
>> param_cnt: le_u16 let (i, param_offset) = verify(le_u16, |&v| v <= (std::u16::MAX - param_cnt))(i)?;
>> _param_offset: le_u16 let (i, data_cnt) = le_u16(i)?;
>> data_cnt: le_u16 let (i, data_offset) = le_u16(i)?;
>> _data_offset: le_u16 let (i, _setup_cnt) = le_u8(i)?;
>> _setup_cnt: le_u8 let (i, _reserved3) = take(1_usize)(i)?;
>> _reserved3: take!(1) let (i, subcmd) = le_u16(i)?;
>> subcmd: le_u16 let (i, _bcc) = le_u16(i)?;
>> _bcc: le_u16 //TODO test and use param_offset
>> _padding: take!(3) let (i, _padding) = take(3_usize)(i)?;
//TODO test and use _param_offset and _data_offset let (i, setup_blob) = take(param_cnt)(i)?;
>> setup_blob: take!(param_cnt) let (i, _padding2) = cond(
>> data_blob: take!(data_cnt) data_offset > param_offset + param_cnt,
|b| take(data_offset - param_offset - param_cnt)(b)
>> (SmbRequestTrans2Record { )(i)?;
let (i, data_blob) = take(data_cnt)(i)?;
let record = SmbRequestTrans2Record {
subcmd, subcmd,
setup_blob, setup_blob,
data_blob data_blob
})) };
); Ok((i, record))
}
#[derive(Debug,PartialEq)] #[derive(Debug,PartialEq)]
pub struct SmbResponseCreateAndXRecord<'a> { pub struct SmbResponseCreateAndXRecord<'a> {

Loading…
Cancel
Save