]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
sip: address trailing space parsing
authorSascha Steinbiss <satta@debian.org>
Mon, 17 Feb 2020 16:29:59 +0000 (17:29 +0100)
committerJeff Lucovsky <jeff@lucovsky.org>
Wed, 8 Apr 2020 12:42:54 +0000 (08:42 -0400)
(cherry picked from commit 11912bd71517408000f70e68407571dff3be449a)

rust/src/sip/parser.rs

index 17d3743dbcd83a9807c8dce81070d1ca620fca33..307cf4a3da7de9a1de6d31abffecda4d80225944 100644 (file)
@@ -177,6 +177,7 @@ pub fn parse_headers(mut input: &[u8]) -> IResult<&[u8], HashMap<String, String>
 
 fn parse_header_value(buf: &[u8]) -> IResult<&[u8], &[u8]> {
     let mut end_pos = 0;
+    let mut trail_spaces = 0;
     let mut idx = 0;
     while idx < buf.len() {
         match buf[idx] {
@@ -191,12 +192,16 @@ fn parse_header_value(buf: &[u8]) -> IResult<&[u8], &[u8]> {
                         continue;
                     }
                     _ => {
-                        return Ok((&buf[end_pos..], &buf[..end_pos]));
+                        return Ok((&buf[(end_pos + trail_spaces)..], &buf[..end_pos]));
                     }
                 }
             }
-            b' ' | b'\t' | b'\r' => {}
+            b' ' | b'\t' => {
+                trail_spaces += 1;
+            }
+            b'\r' => {}
             b => {
+                trail_spaces = 0;
                 if !is_header_value(b) {
                     return Err(Err::Incomplete(Needed::Size(1)));
                 }
@@ -235,6 +240,28 @@ mod tests {
         }
     }
 
+    #[test]
+    fn test_parse_request_trail_space_header() {
+        let buf: &[u8] = "REGISTER sip:sip.cybercity.dk SIP/2.0\r\n\
+                          From: <sip:voi18063@sip.cybercity.dk>;tag=903df0a\r\n\
+                          To: <sip:voi18063@sip.cybercity.dk>\r\n\
+                          Content-Length: 0  \r\n\
+                          \r\n"
+            .as_bytes();
+
+        match sip_parse_request(buf) {
+            Ok((_, req)) => {
+                assert_eq!(req.method, "REGISTER");
+                assert_eq!(req.path, "sip:sip.cybercity.dk");
+                assert_eq!(req.version, "SIP/2.0");
+                assert_eq!(req.headers["Content-Length"], "0");
+            }
+            _ => {
+                assert!(false);
+            }
+        }
+    }
+
     #[test]
     fn test_parse_response() {
         let buf: &[u8] = "SIP/2.0 401 Unauthorized\r\n\