From 84874785c2e226002bb05a42c704ed2d18b99508 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 8 Oct 2021 15:18:10 +0200 Subject: [PATCH] httpd: if range is not specified, correctly fall back to read/write loop range_start was staying -1, and comparison meant to detect "is it the first sendfile that failed, or not the first?" was making incorrect decision. The result: nothing is sent. function old new delta send_file_and_exit 865 877 +12 Signed-off-by: Denys Vlasenko --- networking/httpd.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/networking/httpd.c b/networking/httpd.c index c038293e3..31c8489d3 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -1878,14 +1878,17 @@ static NOINLINE void send_file_and_exit(const char *url, int what) send_headers(HTTP_OK); #if ENABLE_FEATURE_USE_SENDFILE { - off_t offset = (range_start < 0) ? 0 : range_start; + off_t offset; + if (range_start < 0) + range_start = 0; + offset = range_start; while (1) { /* sz is rounded down to 64k */ ssize_t sz = MAXINT(ssize_t) - 0xffff; IF_FEATURE_HTTPD_RANGES(if (sz > range_len) sz = range_len;) count = sendfile(STDOUT_FILENO, fd, &offset, sz); if (count < 0) { - if (offset == range_start) + if (offset == range_start) /* was it the very 1st sendfile? */ break; /* fall back to read/write loop */ goto fin; }