]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
kerberos: fix against packet split in record size
authorPhilippe Antoine <contact@catenacyber.fr>
Fri, 6 Mar 2020 09:45:23 +0000 (10:45 +0100)
committerVictor Julien <victor@inliniac.net>
Wed, 11 Mar 2020 12:07:12 +0000 (13:07 +0100)
rust/src/krb/krb5.rs

index 4a6896efa7f489563b0ad7aaae4139daafdfb445..78e54af139250185dfc0a70e11f304a70ee731dc 100644 (file)
@@ -528,7 +528,6 @@ pub extern "C" fn rs_krb5_parse_request_tcp(_flow: *const core::Flow,
                                        input_len: u32,
                                        _data: *const std::os::raw::c_void,
                                        _flags: u8) -> i32 {
-    if input_len < 4 { return -1; }
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
 
@@ -556,6 +555,10 @@ pub extern "C" fn rs_krb5_parse_request_tcp(_flow: *const core::Flow,
                     state.record_ts = record as usize;
                     cur_i = rem;
                 },
+                Err(nom::Err::Incomplete(_)) => {
+                    state.defrag_buf_ts.extend_from_slice(cur_i);
+                    return 0;
+                }
                 _ => {
                     SCLogDebug!("rs_krb5_parse_request_tcp: reading record mark failed!");
                     return 1;
@@ -586,7 +589,6 @@ pub extern "C" fn rs_krb5_parse_response_tcp(_flow: *const core::Flow,
                                        input_len: u32,
                                        _data: *const std::os::raw::c_void,
                                        _flags: u8) -> i32 {
-    if input_len < 4 { return -1; }
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
 
@@ -614,6 +616,10 @@ pub extern "C" fn rs_krb5_parse_response_tcp(_flow: *const core::Flow,
                     state.record_tc = record as usize;
                     cur_i = rem;
                 },
+                Err(nom::Err::Incomplete(_)) => {
+                    state.defrag_buf_tc.extend_from_slice(cur_i);
+                    return 0;
+                }
                 _ => {
                     SCLogDebug!("reading record mark failed!");
                     return 1;