]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust/applayer: use correct return type for Parser
authorVictor Julien <victor@inliniac.net>
Wed, 3 Oct 2018 19:13:31 +0000 (21:13 +0200)
committerVictor Julien <victor@inliniac.net>
Thu, 4 Oct 2018 07:04:20 +0000 (09:04 +0200)
The mismatch between the types would randomly lead to the return code
of the Rust parser to be not correctly handled over the C/Rust
boundary. This would lead to the API considering a parser to be in
error state when it was not.

rust/src/applayertemplate/template.rs
rust/src/dhcp/dhcp.rs
rust/src/ikev2/ikev2.rs
rust/src/krb/krb5.rs
rust/src/ntp/ntp.rs
rust/src/parser.rs

index 3eb746587e84e80d8f07713038262f3e2182b590..fdb9b3e7744274ec55f05ea5ddc10a93c9d10945 100644 (file)
@@ -301,7 +301,7 @@ pub extern "C" fn rs_template_parse_request(
     input_len: u32,
     _data: *const libc::c_void,
     _flags: u8,
-) -> i8 {
+) -> i32 {
     let eof = unsafe {
         if AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF) > 0 {
             true
@@ -331,7 +331,7 @@ pub extern "C" fn rs_template_parse_response(
     input_len: u32,
     _data: *const libc::c_void,
     _flags: u8,
-) -> i8 {
+) -> i32 {
     let _eof = unsafe {
         if AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF) > 0 {
             true
index 756d1d0d21f6bb0a21a9164c431bb2ec14b90460..885f6b62162bbe00cbe780276d704a5e50c47c60 100644 (file)
@@ -278,7 +278,7 @@ pub extern "C" fn rs_dhcp_parse(_flow: *const core::Flow,
                                 input: *const libc::uint8_t,
                                 input_len: u32,
                                 _data: *const libc::c_void,
-                                _flags: u8) -> i8 {
+                                _flags: u8) -> i32 {
     let state = cast_pointer!(state, DHCPState);
     let buf = build_slice!(input, input_len as usize);
     if state.parse(buf) {
index e41eeb51debdbfa0bfd470c420a4190317874e18..9be03c352d7e4543a522df12539f8ffa48ae482f 100644 (file)
@@ -126,7 +126,7 @@ impl IKEV2State {
     /// Parse an IKEV2 request message
     ///
     /// Returns The number of messages parsed, or -1 on error
-    fn parse(&mut self, i: &[u8], direction: u8) -> i8 {
+    fn parse(&mut self, i: &[u8], direction: u8) -> i32 {
         match parse_ikev2_header(i) {
             IResult::Done(rem,ref hdr) => {
                 if rem.len() == 0 && hdr.length == 28 {
@@ -444,7 +444,7 @@ pub extern "C" fn rs_ikev2_parse_request(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,IKEV2State);
     state.parse(buf, STREAM_TOSERVER)
@@ -457,7 +457,7 @@ pub extern "C" fn rs_ikev2_parse_response(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,IKEV2State);
     let res = state.parse(buf, STREAM_TOCLIENT);
index 4116478137b54c8e3d337e5633418ab2f826c42b..63a9b9d0e065a5cdd5df3cccc80763e24e79dfdc 100644 (file)
@@ -105,7 +105,7 @@ impl KRB5State {
     /// Parse a Kerberos request message
     ///
     /// Returns The number of messages parsed, or -1 on error
-    fn parse(&mut self, i: &[u8], _direction: u8) -> i8 {
+    fn parse(&mut self, i: &[u8], _direction: u8) -> i32 {
         match der_read_element_header(i) {
             IResult::Done(_rem,hdr) => {
                 // Kerberos messages start with an APPLICATION header
@@ -462,7 +462,7 @@ pub extern "C" fn rs_krb5_parse_request(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
     state.parse(buf, STREAM_TOSERVER)
@@ -475,7 +475,7 @@ pub extern "C" fn rs_krb5_parse_response(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
     state.parse(buf, STREAM_TOCLIENT)
@@ -488,7 +488,7 @@ pub extern "C" fn rs_krb5_parse_request_tcp(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     if input_len < 4 { return -1; }
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
@@ -546,7 +546,7 @@ pub extern "C" fn rs_krb5_parse_response_tcp(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     if input_len < 4 { return -1; }
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,KRB5State);
index c3d1b2247cbd27771577f3601411d392362d9ab7..48588d57d502d64c9b9a250381a5dac51dc3544c 100644 (file)
@@ -85,7 +85,7 @@ impl NTPState {
     /// Parse an NTP request message
     ///
     /// Returns The number of messages parsed, or -1 on error
-    fn parse(&mut self, i: &[u8], _direction: u8) -> i8 {
+    fn parse(&mut self, i: &[u8], _direction: u8) -> i32 {
         match parse_ntp(i) {
             IResult::Done(_,ref msg) => {
                 // SCLogDebug!("parse_ntp: {:?}",msg);
@@ -196,7 +196,7 @@ pub extern "C" fn rs_ntp_parse_request(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,NTPState);
     state.parse(buf, 0)
@@ -209,7 +209,7 @@ pub extern "C" fn rs_ntp_parse_response(_flow: *const core::Flow,
                                        input: *const libc::uint8_t,
                                        input_len: u32,
                                        _data: *const libc::c_void,
-                                       _flags: u8) -> i8 {
+                                       _flags: u8) -> i32 {
     let buf = build_slice!(input,input_len as usize);
     let state = cast_pointer!(state,NTPState);
     state.parse(buf, 1)
index a094fbc9b48dfe17e19fd00618cd605b32f6abf3..90964b9695c19eab2ee65996c83dde886b951449 100644 (file)
@@ -124,7 +124,7 @@ pub type ParseFn      = extern "C" fn (flow: *const Flow,
                                        input: *const u8,
                                        input_len: u32,
                                        data: *const c_void,
-                                       flags: u8) -> i8;
+                                       flags: u8) -> i32;
 pub type ProbeFn      = extern "C" fn (flow: *const Flow,input:*const u8, input_len: u32) -> AppProto;
 pub type StateAllocFn = extern "C" fn () -> *mut c_void;
 pub type StateFreeFn  = extern "C" fn (*mut c_void);