[git commit] httpd: if range is not specified, correctly fall back to read/write loop

Denys Vlasenko vda.linux at googlemail.com
Fri Oct 8 13:41:08 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=84874785c2e226002bb05a42c704ed2d18b99508
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 <vda.linux at googlemail.com>
---
 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;
 			}


More information about the busybox-cvs mailing list