Changeset

11568:d5360307a99d

mod_http_file_share: Handle out of bounds Range request Turns out you can seek past the end of the file without getting an error. Also rejects empty range instead of sending the whole file.
author Kim Alvefur <zash@zash.se>
date Mon, 17 May 2021 14:14:25 +0200
parents 11567:c471e19a238e
children 11569:08dab7df152b
files plugins/mod_http_file_share.lua
diffstat 1 files changed, 8 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_http_file_share.lua	Sun May 16 19:05:20 2021 +0200
+++ b/plugins/mod_http_file_share.lua	Mon May 17 14:14:25 2021 +0200
@@ -361,10 +361,15 @@
 	if request_range then
 		local range_start, range_end = request_range:match("^bytes=(%d+)%-(%d*)$")
 		-- Only support resumption, ie ranges from somewhere in the middle until the end of the file.
-		if (range_start and range_start ~= "0" and range_start ~= filesize) and (range_end == "" or range_end == filesize) then
-			if handle:seek("set", tonumber(range_start)) then
+		if (range_start and range_start ~= "0") and (range_end == "" or range_end == filesize) then
+			local pos, size = tonumber(range_start), tonumber(filesize);
+			local new_pos = pos < size and handle:seek("set", pos);
+			if new_pos and new_pos < size then
 				response_range = "bytes "..range_start.."-"..filesize.."/"..filesize;
-				filesize = string.format("%d", tonumber(filesize)-tonumber(range_start));
+				filesize = string.format("%d", size-pos);
+			else
+				handle:close();
+				return 416;
 			end
 		end
 	end