From: Victor Julien Date: Fri, 13 Mar 2020 09:13:56 +0000 (+0100) Subject: smb: update return type of GAP handling X-Git-Tag: suricata-6.0.0-beta1~642 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5cd9cfb5a00fa2926fea8e56d28b40acf8a6c58e;p=thirdparty%2Fsuricata.git smb: update return type of GAP handling --- diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index 4e1a3e7fa5..c8fc4fcdee 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -1752,7 +1752,7 @@ impl SMBState { /// handle a gap in the TOSERVER direction /// returns: 0 ok, 1 unrecoverable error - pub fn parse_tcp_data_ts_gap(&mut self, gap_size: u32) -> u32 { + pub fn parse_tcp_data_ts_gap(&mut self, gap_size: u32) -> AppLayerResult { let consumed = self.handle_skip(STREAM_TOSERVER, gap_size); if consumed < gap_size { let new_gap_size = gap_size - consumed; @@ -1762,18 +1762,18 @@ impl SMBState { if consumed2 > new_gap_size { SCLogDebug!("consumed more than GAP size: {} > {}", consumed2, new_gap_size); self.set_event(SMBEvent::InternalError); - return 1; + return AppLayerResult::err(); } } SCLogDebug!("GAP of size {} in toserver direction", gap_size); self.ts_ssn_gap = true; self.ts_gap = true; - return 0 + return AppLayerResult::ok(); } /// handle a gap in the TOCLIENT direction /// returns: 0 ok, 1 unrecoverable error - pub fn parse_tcp_data_tc_gap(&mut self, gap_size: u32) -> u32 { + pub fn parse_tcp_data_tc_gap(&mut self, gap_size: u32) -> AppLayerResult { let consumed = self.handle_skip(STREAM_TOCLIENT, gap_size); if consumed < gap_size { let new_gap_size = gap_size - consumed; @@ -1783,13 +1783,13 @@ impl SMBState { if consumed2 > new_gap_size { SCLogDebug!("consumed more than GAP size: {} > {}", consumed2, new_gap_size); self.set_event(SMBEvent::InternalError); - return 1; + return AppLayerResult::err(); } } SCLogDebug!("GAP of size {} in toclient direction", gap_size); self.tc_ssn_gap = true; self.tc_gap = true; - return 0 + return AppLayerResult::ok(); } pub fn trunc_ts(&mut self) { @@ -1862,12 +1862,9 @@ pub extern "C" fn rs_smb_parse_request_tcp(flow: &mut Flow, pub extern "C" fn rs_smb_parse_request_tcp_gap( state: &mut SMBState, input_len: u32) - -> i8 + -> AppLayerResult { - if state.parse_tcp_data_ts_gap(input_len as u32) == 0 { - return 0; - } - return -1; + state.parse_tcp_data_ts_gap(input_len as u32) } @@ -1897,12 +1894,9 @@ pub extern "C" fn rs_smb_parse_response_tcp(flow: &mut Flow, pub extern "C" fn rs_smb_parse_response_tcp_gap( state: &mut SMBState, input_len: u32) - -> i8 + -> AppLayerResult { - if state.parse_tcp_data_tc_gap(input_len as u32) == 0 { - return 0; - } - return -1; + state.parse_tcp_data_tc_gap(input_len as u32) } // probing parser diff --git a/src/app-layer-smb.c b/src/app-layer-smb.c index d3b2d3416a..7b7c68c7a0 100644 --- a/src/app-layer-smb.c +++ b/src/app-layer-smb.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Open Information Security Foundation +/* Copyright (C) 2017-2020 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -39,12 +39,9 @@ static AppLayerResult SMBTCPParseRequest(Flow *f, void *state, rs_smb_setfileflags(0, state, file_flags|FILE_USE_DETECT); if (input == NULL && input_len > 0) { - int res = rs_smb_parse_request_tcp_gap(state, input_len); - SCLogDebug("SMB request GAP of %u bytes, retval %d", input_len, res); - if (res != 0) { - SCReturnStruct(APP_LAYER_ERROR); - } - SCReturnStruct(APP_LAYER_OK); + AppLayerResult res = rs_smb_parse_request_tcp_gap(state, input_len); + SCLogDebug("SMB request GAP of %u bytes, retval %d", input_len, res.status); + SCReturnStruct(res); } else { AppLayerResult res = rs_smb_parse_request_tcp(f, state, pstate, input, input_len, local_data, flags); @@ -64,13 +61,9 @@ static AppLayerResult SMBTCPParseResponse(Flow *f, void *state, SCLogDebug("SMBTCPParseResponse %p/%u", input, input_len); if (input == NULL && input_len > 0) { - int res = rs_smb_parse_response_tcp_gap(state, input_len); - if (res != 0) { - SCLogDebug("SMB response%s of %u bytes, retval %d", - (input == NULL && input_len > 0) ? " is GAP" : "", input_len, res); - SCReturnStruct(APP_LAYER_ERROR); - } - SCReturnStruct(APP_LAYER_OK); + AppLayerResult res = rs_smb_parse_response_tcp_gap(state, input_len); + SCLogDebug("SMB response GAP of %u bytes, retval %d", input_len, res.status); + SCReturnStruct(res); } else { AppLayerResult res = rs_smb_parse_response_tcp(f, state, pstate, input, input_len, local_data, flags);