Fix integer underflow in try_range_response for empty files (#3566)

This commit is contained in:
Alice Ryhl
2025-11-22 20:09:42 +01:00
committed by GitHub
parent 7fd17ceba5
commit 601d775da8
3 changed files with 61 additions and 7 deletions
+52
View File
@@ -191,6 +191,10 @@ where
let metadata = file.metadata().await?;
let total_size = metadata.len();
if total_size == 0 {
return Ok((StatusCode::RANGE_NOT_SATISFIABLE, "Range Not Satisfiable").into_response());
}
if end == 0 {
end = total_size - 1;
}
@@ -596,4 +600,52 @@ mod tests {
}
Some((start, end))
}
#[tokio::test]
async fn response_range_empty_file() -> Result<(), Box<dyn std::error::Error>> {
let file = tempfile::NamedTempFile::new()?;
file.as_file().set_len(0)?;
let path = file.path().to_owned();
let app = Router::new().route(
"/range_empty",
get(move |headers: HeaderMap| {
let path = path.clone();
async move {
let range_header = headers
.get(header::RANGE)
.and_then(|value| value.to_str().ok());
let (start, end) = if let Some(range) = range_header {
if let Some(range) = parse_range_header(range) {
range
} else {
return (StatusCode::RANGE_NOT_SATISFIABLE, "Invalid Range")
.into_response();
}
} else {
(0, 0)
};
FileStream::<ReaderStream<File>>::try_range_response(path, start, end)
.await
.unwrap_or_else(|_| StatusCode::INTERNAL_SERVER_ERROR.into_response())
}
}),
);
let response = app
.oneshot(
Request::builder()
.uri("/range_empty")
.header(header::RANGE, "bytes=0-")
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(response.status(), StatusCode::RANGE_NOT_SATISFIABLE);
Ok(())
}
}