diff --git a/rust/src/http2/http2.rs b/rust/src/http2/http2.rs index f8ddc14947..06c144606a 100644 --- a/rust/src/http2/http2.rs +++ b/rust/src/http2/http2.rs @@ -496,6 +496,37 @@ impl HTTP2Transaction { } } } + + fn handle_data_frame( + &mut self, rem: &[u8], hlsafe: usize, dir: Direction, flow: *mut Flow, padded: bool, + over: bool, + ) { + match unsafe { SURICATA_HTTP2_FILE_CONFIG } { + Some(sfcm) => { + if dir == Direction::ToServer { + self.ft_tc.tx_id = self.tx_id - 1; + } else { + self.ft_ts.tx_id = self.tx_id - 1; + }; + let mut dinput = &rem[..hlsafe]; + if padded && !rem.is_empty() && usize::from(rem[0]) < hlsafe { + dinput = &rem[1..hlsafe - usize::from(rem[0])]; + } + let mut output = Vec::with_capacity(decompression::HTTP2_DECOMPRESSION_CHUNK_SIZE); + match self.decompress(dinput, &mut output, dir, sfcm, over, flow) { + Ok(_) => { + if over { + self.handle_dns_data(dir, flow); + } + } + _ => { + self.set_event(HTTP2Event::FailedDecompression); + } + } + } + None => panic!("no SURICATA_HTTP2_FILE_CONFIG"), + } + } } impl Drop for HTTP2Transaction { @@ -1258,45 +1289,7 @@ impl HTTP2State { if ftype == parser::HTTP2FrameType::Data as u8 && sid == 0 { tx.tx_data.set_event(HTTP2Event::DataStreamZero as u8); } else if ftype == parser::HTTP2FrameType::Data as u8 && sid > 0 { - match unsafe { SURICATA_HTTP2_FILE_CONFIG } { - Some(sfcm) => { - //borrow checker forbids to reuse directly tx - let index = self.find_tx_index(sid); - if index > 0 { - let tx_same = &mut self.transactions[index - 1]; - if dir == Direction::ToServer { - tx_same.ft_tc.tx_id = tx_same.tx_id - 1; - } else { - tx_same.ft_ts.tx_id = tx_same.tx_id - 1; - }; - let mut dinput = &rem[..hlsafe]; - if padded && !rem.is_empty() && usize::from(rem[0]) < hlsafe { - dinput = &rem[1..hlsafe - usize::from(rem[0])]; - } - let mut output = Vec::with_capacity( - decompression::HTTP2_DECOMPRESSION_CHUNK_SIZE, - ); - match tx_same.decompress( - dinput, - &mut output, - dir, - sfcm, - over, - flow, - ) { - Ok(_) => { - if over { - tx_same.handle_dns_data(dir, flow); - } - } - _ => { - self.set_event(HTTP2Event::FailedDecompression); - } - } - } - } - None => panic!("no SURICATA_HTTP2_FILE_CONFIG"), - } + tx.handle_data_frame(rem, hlsafe, dir, flow, padded, over); } sc_app_layer_parser_trigger_raw_stream_inspection(flow, dir as i32); input = &rem[hlsafe..];