From: Philippe Antoine Date: Sat, 21 Jan 2023 17:19:47 +0000 (+0100) Subject: http2: fix leak with range files X-Git-Tag: suricata-7.0.0-rc1~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba99241957b8fd2f1478bf3d1929eedb4f7094ab;p=thirdparty%2Fsuricata.git http2: fix leak with range files Ticket: #5808 May have been introduced by a24d7dc45c818054f97448ce42ca9ba270b3b8e4 Function http2_range_open expects to be called only when tx.file_range is nil. One condition to ensure this is to check that we are beginning the files contents. The filetracker field file_open is not fit for this, as it may be reset to false. --- diff --git a/rust/src/filetracker.rs b/rust/src/filetracker.rs index 4585608d9b..dbc80a682e 100644 --- a/rust/src/filetracker.rs +++ b/rust/src/filetracker.rs @@ -85,6 +85,10 @@ impl FileTransferTracker { !self.file_open } + pub fn is_initialized(&self) -> bool { + return self.file_open || self.file_is_truncated; + } + fn open(&mut self, config: &'static SuricataFileContext, name: &[u8]) -> i32 { let r = self.file.file_open(config, self.track_id, name, self.file_flags); diff --git a/rust/src/http2/http2.rs b/rust/src/http2/http2.rs index 63032cc5b6..a24b8a0581 100644 --- a/rust/src/http2/http2.rs +++ b/rust/src/http2/http2.rs @@ -219,7 +219,8 @@ impl HTTP2Transaction { let xid: u32 = self.tx_id as u32; if dir == Direction::ToClient { self.ft_tc.tx_id = self.tx_id - 1; - if !self.ft_tc.file_open { + // Check that we are at the beginning of the file + if !self.ft_tc.is_initialized() { // we are now sure that new_chunk will open a file // even if it may close it right afterwards self.tx_data.incr_files_opened();