]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
dns: fix incomplete results
authorPhilippe Antoine <contact@catenacyber.fr>
Thu, 30 Jul 2020 14:32:40 +0000 (16:32 +0200)
committerJason Ish <jason.ish@oisf.net>
Tue, 4 Aug 2020 19:58:08 +0000 (13:58 -0600)
and messages parsing whose length is >= 32768

rust/src/dns/dns.rs

index 81a36cb7aa2f6a2affa70a57364b5db91b1b39dc..568db23d1ca7b3b37d06c74db1c9e5d530217f4f 100644 (file)
@@ -547,8 +547,11 @@ impl DNSState {
         let mut cur_i = input;
         let mut consumed = 0;
         while cur_i.len() > 0 {
-            let size = match be_u16(&cur_i) as IResult<&[u8],_> {
-                Ok((_, len)) => i32::from(len),
+            if cur_i.len() == 1 {
+                return AppLayerResult::incomplete(consumed as u32, 2 as u32);
+            }
+            let size = match be_u16(&cur_i) as IResult<&[u8],u16> {
+                Ok((_, len)) => len,
                 _ => 0
             } as usize;
             SCLogDebug!("[request] Have {} bytes, need {} to parse",
@@ -565,7 +568,7 @@ impl DNSState {
                 SCLogDebug!("[request]Not enough DNS traffic to parse. Returning {}/{}",
                             consumed as u32, (cur_i.len() - consumed) as u32);
                 return AppLayerResult::incomplete(consumed as u32,
-                    (cur_i.len() - consumed) as u32);
+                    (size  + 2) as u32);
             }
         }
         AppLayerResult::ok()
@@ -588,8 +591,11 @@ impl DNSState {
         let mut cur_i = input;
         let mut consumed = 0;
         while cur_i.len() > 0 {
-            let size = match be_u16(&cur_i) as IResult<&[u8],_> {
-                Ok((_, len)) => i32::from(len),
+            if cur_i.len() == 1 {
+                return AppLayerResult::incomplete(consumed as u32, 2 as u32);
+            }
+            let size = match be_u16(&cur_i) as IResult<&[u8],u16> {
+                Ok((_, len)) => len,
                 _ => 0
             } as usize;
             SCLogDebug!("[response] Have {} bytes, need {} to parse",
@@ -606,7 +612,7 @@ impl DNSState {
                 SCLogDebug!("[response]Not enough DNS traffic to parse. Returning {}/{}",
                     consumed as u32, (cur_i.len() - consumed) as u32);
                 return AppLayerResult::incomplete(consumed as u32,
-                    (cur_i.len() - consumed) as u32);
+                    (size + 2) as u32);
             }
         }
         AppLayerResult::ok()
@@ -1155,7 +1161,7 @@ mod tests {
 
         let mut state = DNSState::new();
         assert_eq!(
-            AppLayerResult::incomplete(0, 51),
+            AppLayerResult::incomplete(0, 52),
             state.parse_request_tcp(&request)
         );
     }
@@ -1240,7 +1246,7 @@ mod tests {
 
         let mut state = DNSState::new();
         assert_eq!(
-            AppLayerResult::incomplete(0, 102),
+            AppLayerResult::incomplete(0, 103),
             state.parse_response_tcp(&request)
         );
     }
@@ -1463,7 +1469,7 @@ mod tests {
         ];
         let mut state = DNSState::new();
         assert_eq!(
-            AppLayerResult::incomplete(0, 14),
+            AppLayerResult::incomplete(0, 30),
             state.parse_request_tcp(buf1)
         );
         assert_eq!(