From 3832d38d8c64ee3a71173ecbac0db8358a8bbe44 Mon Sep 17 00:00:00 2001 From: Liu Jiang Date: Mon, 23 Mar 2020 21:24:16 +0800 Subject: [PATCH] Reject negative content length in http header It's almost an illegal input for a Content-Length header with negative value, so reject it. Otherwise it may cause unexpected behavor when parsing/receiving http requests. Signed-off-by: Liu Jiang --- src/common/headers.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/common/headers.rs b/src/common/headers.rs index 03e1773..47517ca 100644 --- a/src/common/headers.rs +++ b/src/common/headers.rs @@ -106,11 +106,12 @@ impl Headers { Header::ContentLength => { let try_numeric: Result = std::str::FromStr::from_str(entry[1].trim()); - if let Ok(content_length) = try_numeric { - self.content_length = content_length; - Ok(()) - } else { - Err(RequestError::InvalidHeader) + match try_numeric { + Ok(content_length) if content_length >= 0 => { + self.content_length = content_length; + Ok(()) + } + _ => Err(RequestError::InvalidHeader), } } Header::ContentType => { @@ -306,6 +307,15 @@ mod tests { 55 ); + // Valid headers. + assert_eq!( + Headers::try_from( + b"Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT\r\nContent-Length: -55\r\n\r\n" + ) + .unwrap_err(), + RequestError::InvalidHeader + ); + let bytes: [u8; 10] = [130, 140, 150, 130, 140, 150, 130, 140, 150, 160]; // Invalid headers. assert!(Headers::try_from(&bytes[..]).is_err());