From 16fda46bf705538cf84d872d17ebdac0da20b91e Mon Sep 17 00:00:00 2001 From: Sascha Steinbiss Date: Mon, 17 Feb 2020 17:29:59 +0100 Subject: [PATCH] sip: address trailing space parsing (cherry picked from commit 11912bd71517408000f70e68407571dff3be449a) --- rust/src/sip/parser.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/rust/src/sip/parser.rs b/rust/src/sip/parser.rs index 17d3743dbc..307cf4a3da 100644 --- a/rust/src/sip/parser.rs +++ b/rust/src/sip/parser.rs @@ -177,6 +177,7 @@ pub fn parse_headers(mut input: &[u8]) -> IResult<&[u8], HashMap 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: ;tag=903df0a\r\n\ + To: \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\ -- 2.47.2